Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: chrome/browser/android/uma_session_stats.cc

Issue 962293002: Upstream UmaSessionStats. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/android/uma_session_stats.h"
Alexei Svitkine (slow) 2015/02/27 18:59:57 Could this be placed in chrome/browser/metrics/and
Yaron 2015/02/27 19:13:34 I think chrome/browser/android/metrics is a bit ea
6
7 #include "base/android/jni_string.h"
8 #include "base/command_line.h"
9 #include "base/metrics/histogram.h"
10 #include "base/prefs/pref_service.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "base/time/time.h"
13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
15 #include "chrome/browser/metrics/metrics_services_manager.h"
16 #include "chrome/common/chrome_switches.h"
17 #include "chrome/common/pref_names.h"
18 #include "chrome/installer/util/google_update_settings.h"
19 #include "components/metrics/metrics_service.h"
20 #include "components/variations/metrics_util.h"
21 #include "components/variations/variations_associated_data.h"
22 #include "content/public/browser/browser_thread.h"
23 #include "content/public/browser/user_metrics.h"
24 #include "jni/UmaSessionStats_jni.h"
25
26 using base::android::ConvertJavaStringToUTF8;
27 using base::UserMetricsAction;
28
29 namespace {
30 UmaSessionStats* g_uma_session_stats = NULL;
31 } // namespace
32
33 UmaSessionStats::UmaSessionStats()
34 : active_session_count_(0) {
35 }
36
37 UmaSessionStats::~UmaSessionStats() {
38 }
39
40 void UmaSessionStats::UmaResumeSession(JNIEnv* env, jobject obj) {
41 DCHECK(g_browser_process);
42
43 if (active_session_count_ == 0) {
44 session_start_time_ = base::TimeTicks::Now();
45
46 // Tell the metrics service that the application resumes.
47 metrics::MetricsService* metrics = g_browser_process->metrics_service();
48 if (metrics) {
49 metrics->OnAppEnterForeground();
50 }
51 }
52 ++active_session_count_;
53 }
54
55 void UmaSessionStats::UmaEndSession(JNIEnv* env, jobject obj) {
56 --active_session_count_;
57 DCHECK(active_session_count_ >= 0);
58
59 if (active_session_count_ == 0) {
60 base::TimeDelta duration = base::TimeTicks::Now() - session_start_time_;
61 UMA_HISTOGRAM_LONG_TIMES("Session.TotalDuration", duration);
62
63 DCHECK(g_browser_process);
64 // Tell the metrics service it was cleanly shutdown.
65 metrics::MetricsService* metrics = g_browser_process->metrics_service();
66 if (metrics) {
67 metrics->OnAppEnterBackground();
68 }
69 }
70 }
71
72 // static
73 void UmaSessionStats::RegisterSyntheticFieldTrialWithNameHash(
74 uint32_t trial_name_hash,
75 const std::string& group_name) {
76 ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrialWithNameHash(
77 trial_name_hash, group_name);
78 }
79
80 // static
81 void UmaSessionStats::RegisterSyntheticFieldTrial(
82 const std::string& trial_name,
83 const std::string& group_name) {
84 ChromeMetricsServiceAccessor::RegisterSyntheticFieldTrial(trial_name,
85 group_name);
86 }
87
88 // Starts/stops the MetricsService when permissions have changed.
89 // There are three possible states:
90 // * Logs are being recorded and being uploaded to the server.
91 // * Logs are being recorded, but not being uploaded to the server.
92 // This happens when we've got permission to upload on Wi-Fi but we're on a
93 // mobile connection (for example).
94 // * Logs are neither being recorded or uploaded.
95 static void UpdateMetricsServiceState(JNIEnv* env, jobject obj,
96 jboolean may_record, jboolean may_upload) {
97 metrics::MetricsService* metrics = g_browser_process->metrics_service();
98 DCHECK(metrics);
99
100 if (metrics->recording_active() != may_record) {
101 // This function puts a consent file with the ClientID in the
102 // data directory. The ID is passed to the renderer for crash
103 // reporting when things go wrong.
104 content::BrowserThread::GetBlockingPool()->PostTask(FROM_HERE,
105 base::Bind(
106 base::IgnoreResult(GoogleUpdateSettings::SetCollectStatsConsent),
107 may_record));
108 }
109
110 g_browser_process->GetMetricsServicesManager()->UpdatePermissions(
111 may_record, may_upload);
112 }
113
114 // Renderer process crashed in the foreground.
115 static void LogRendererCrash(JNIEnv* env, jclass clazz, jboolean is_paused) {
116 DCHECK(g_browser_process);
117
118 if (!is_paused) {
119 // Increment the renderer crash count in stability metrics.
120 PrefService* pref = g_browser_process->local_state();
121 DCHECK(pref);
122 int value = pref->GetInteger(prefs::kStabilityRendererCrashCount);
123 pref->SetInteger(prefs::kStabilityRendererCrashCount, value + 1);
124 }
125
126 // Note: When we are paused, any UI metric we increment may not make it to
127 // the disk before we are killed. Treat the count below as a lower bound.
128 content::RecordAction(base::UserMetricsAction("MobileRendererCrashed"));
129 }
130
131 static void RegisterExternalExperiment(JNIEnv* env,
132 jclass clazz,
133 jint study_id,
134 jint experiment_id) {
135 const std::string group_name_utf8 = base::IntToString(experiment_id);
136
137 variations::ActiveGroupId active_group;
138 active_group.name = static_cast<uint32>(study_id);
139 active_group.group = metrics::HashName(group_name_utf8);
140 variations::AssociateGoogleVariationIDForceHashes(
141 variations::GOOGLE_WEB_PROPERTIES, active_group,
142 static_cast<variations::VariationID>(experiment_id));
143
144 UmaSessionStats::RegisterSyntheticFieldTrialWithNameHash(
145 static_cast<uint32_t>(study_id), group_name_utf8);
146 }
147
148 static void RegisterSyntheticFieldTrial(JNIEnv* env,
149 jclass clazz,
150 jstring jtrial_name,
151 jstring jgroup_name) {
152 std::string trial_name(ConvertJavaStringToUTF8(env, jtrial_name));
153 std::string group_name(ConvertJavaStringToUTF8(env, jgroup_name));
154 UmaSessionStats::RegisterSyntheticFieldTrial(trial_name, group_name);
155 }
156
157 static void RecordMultiWindowSession(JNIEnv*, jclass,
158 jint area_percent,
159 jint instance_count) {
160 UMA_HISTOGRAM_PERCENTAGE("MobileStartup.MobileMultiWindowSession",
161 area_percent);
162 // Make sure the bucket count is the same as the range. This currently
163 // expects no more than 10 simultaneous multi window instances.
164 UMA_HISTOGRAM_CUSTOM_COUNTS("MobileStartup.MobileMultiWindowInstances",
165 instance_count,
166 1 /* min */,
167 10 /* max */,
168 10 /* bucket count */);
169 }
170
171 static void RecordTabCountPerLoad(JNIEnv*, jclass, jint num_tabs) {
172 // Record how many tabs total are open.
173 UMA_HISTOGRAM_CUSTOM_COUNTS("Tabs.TabCountPerLoad", num_tabs, 1, 200, 50);
174 }
175
176 static void RecordPageLoaded(JNIEnv*, jclass, jboolean is_desktop_user_agent) {
177 // Should be called whenever a page has been loaded.
178 content::RecordAction(UserMetricsAction("MobilePageLoaded"));
179 if (is_desktop_user_agent) {
180 content::RecordAction(
181 UserMetricsAction("MobilePageLoadedDesktopUserAgent"));
182 }
183 }
184
185 static void RecordPageLoadedWithKeyboard(JNIEnv*, jclass) {
186 content::RecordAction(UserMetricsAction("MobilePageLoadedWithKeyboard"));
187 }
188
189 static jlong Init(JNIEnv* env, jclass obj) {
190 // We should have only one UmaSessionStats instance.
191 DCHECK(!g_uma_session_stats);
192 g_uma_session_stats = new UmaSessionStats();
193 return reinterpret_cast<intptr_t>(g_uma_session_stats);
194 }
195
196 // Register native methods
197 bool RegisterUmaSessionStats(JNIEnv* env) {
198 return RegisterNativesImpl(env);
199 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698