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

Side by Side Diff: chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.cc

Issue 23271009: Add UMA stats for initial user policy fetch on Chrome OS. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments. Created 7 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h" 5 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/metrics/histogram.h"
11 #include "base/metrics/sparse_histogram.h"
10 #include "chrome/browser/browser_process.h" 12 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h" 13 #include "chrome/browser/chromeos/policy/policy_oauth2_token_fetcher.h"
12 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chrom eos.h" 14 #include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chrom eos.h"
13 #include "chrome/browser/chromeos/profiles/profile_helper.h" 15 #include "chrome/browser/chromeos/profiles/profile_helper.h"
14 #include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h" 16 #include "chrome/browser/policy/cloud/cloud_policy_refresh_scheduler.h"
15 #include "chrome/browser/policy/cloud/resource_cache.h" 17 #include "chrome/browser/policy/cloud/resource_cache.h"
16 #include "chrome/browser/policy/policy_bundle.h" 18 #include "chrome/browser/policy/policy_bundle.h"
17 #include "chrome/browser/policy/policy_domain_descriptor.h" 19 #include "chrome/browser/policy/policy_domain_descriptor.h"
18 #include "chrome/common/pref_names.h" 20 #include "chrome/common/pref_names.h"
19 #include "net/url_request/url_request_context_getter.h" 21 #include "net/url_request/url_request_context_getter.h"
20 22
21 namespace em = enterprise_management; 23 namespace em = enterprise_management;
22 24
23 namespace policy { 25 namespace policy {
24 26
27 namespace {
28
29 // UMA histogram names.
30 const char kUMADelayInitialization[] =
31 "Enterprise.UserPolicyChromeOS.DelayInitialization";
32 const char kUMAInitialFetchClientError[] =
33 "Enterprise.UserPolicyChromeOS.InitialFetch.ClientError";
34 const char kUMAInitialFetchDelayClientRegister[] =
35 "Enterprise.UserPolicyChromeOS.InitialFetch.DelayClientRegister";
36 const char kUMAInitialFetchDelayOAuth2Token[] =
37 "Enterprise.UserPolicyChromeOS.InitialFetch.DelayOAuth2Token";
38 const char kUMAInitialFetchDelayPolicyFetch[] =
39 "Enterprise.UserPolicyChromeOS.InitialFetch.DelayPolicyFetch";
40 const char kUMAInitialFetchDelayTotal[] =
41 "Enterprise.UserPolicyChromeOS.InitialFetch.DelayTotal";
42 const char kUMAInitialFetchOAuth2Error[] =
43 "Enterprise.UserPolicyChromeOS.InitialFetch.OAuth2Error";
44 const char kUMAInitialFetchOAuth2NetworkError[] =
45 "Enterprise.UserPolicyChromeOS.InitialFetch.OAuth2NetworkError";
46
47 } // namespace
48
25 UserCloudPolicyManagerChromeOS::UserCloudPolicyManagerChromeOS( 49 UserCloudPolicyManagerChromeOS::UserCloudPolicyManagerChromeOS(
26 scoped_ptr<CloudPolicyStore> store, 50 scoped_ptr<CloudPolicyStore> store,
27 scoped_ptr<ResourceCache> resource_cache, 51 scoped_ptr<ResourceCache> resource_cache,
28 bool wait_for_policy_fetch) 52 bool wait_for_policy_fetch)
29 : CloudPolicyManager( 53 : CloudPolicyManager(
30 PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, std::string()), 54 PolicyNamespaceKey(dm_protocol::kChromeUserPolicyType, std::string()),
31 store.get()), 55 store.get()),
32 store_(store.Pass()), 56 store_(store.Pass()),
33 wait_for_policy_fetch_(wait_for_policy_fetch) { 57 wait_for_policy_fetch_(wait_for_policy_fetch) {
58 time_init_started_ = base::Time::Now();
34 if (resource_cache) { 59 if (resource_cache) {
35 component_policy_service_.reset(new ComponentCloudPolicyService( 60 component_policy_service_.reset(new ComponentCloudPolicyService(
36 this, store_.get(), resource_cache.Pass())); 61 this, store_.get(), resource_cache.Pass()));
37 } 62 }
38 } 63 }
39 64
40 UserCloudPolicyManagerChromeOS::~UserCloudPolicyManagerChromeOS() {} 65 UserCloudPolicyManagerChromeOS::~UserCloudPolicyManagerChromeOS() {}
41 66
42 void UserCloudPolicyManagerChromeOS::Connect( 67 void UserCloudPolicyManagerChromeOS::Connect(
43 PrefService* local_state, 68 PrefService* local_state,
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 scoped_ptr<PolicyBundle> bundle = CloudPolicyManager::CreatePolicyBundle(); 138 scoped_ptr<PolicyBundle> bundle = CloudPolicyManager::CreatePolicyBundle();
114 if (component_policy_service_) 139 if (component_policy_service_)
115 bundle->MergeFrom(component_policy_service_->policy()); 140 bundle->MergeFrom(component_policy_service_->policy());
116 return bundle.Pass(); 141 return bundle.Pass();
117 } 142 }
118 143
119 void UserCloudPolicyManagerChromeOS::OnInitializationCompleted( 144 void UserCloudPolicyManagerChromeOS::OnInitializationCompleted(
120 CloudPolicyService* cloud_policy_service) { 145 CloudPolicyService* cloud_policy_service) {
121 DCHECK_EQ(service(), cloud_policy_service); 146 DCHECK_EQ(service(), cloud_policy_service);
122 cloud_policy_service->RemoveObserver(this); 147 cloud_policy_service->RemoveObserver(this);
148
149 time_init_completed_ = base::Time::Now();
150 UMA_HISTOGRAM_TIMES(kUMADelayInitialization,
151 time_init_completed_ - time_init_started_);
152
123 // If the CloudPolicyClient isn't registered at this stage then it needs an 153 // If the CloudPolicyClient isn't registered at this stage then it needs an
124 // OAuth token for the initial registration. 154 // OAuth token for the initial registration.
125 // 155 //
126 // If |wait_for_policy_fetch_| is true then Profile initialization is blocking 156 // If |wait_for_policy_fetch_| is true then Profile initialization is blocking
127 // on the initial policy fetch, so the token must be fetched immediately. 157 // on the initial policy fetch, so the token must be fetched immediately.
128 // In that case, the signin Profile is used to authenticate a Gaia request to 158 // In that case, the signin Profile is used to authenticate a Gaia request to
129 // fetch a refresh token, and then the policy token is fetched. 159 // fetch a refresh token, and then the policy token is fetched.
130 // 160 //
131 // If |wait_for_policy_fetch_| is false then the UserCloudPolicyTokenForwarder 161 // If |wait_for_policy_fetch_| is false then the UserCloudPolicyTokenForwarder
132 // service will eventually call OnAccessTokenAvailable() once an access token 162 // service will eventually call OnAccessTokenAvailable() once an access token
(...skipping 21 matching lines...) Expand all
154 184
155 void UserCloudPolicyManagerChromeOS::OnPolicyFetched( 185 void UserCloudPolicyManagerChromeOS::OnPolicyFetched(
156 CloudPolicyClient* client) { 186 CloudPolicyClient* client) {
157 // No action required. If we're blocked on a policy fetch, we'll learn about 187 // No action required. If we're blocked on a policy fetch, we'll learn about
158 // completion of it through OnInitialPolicyFetchComplete(). 188 // completion of it through OnInitialPolicyFetchComplete().
159 } 189 }
160 190
161 void UserCloudPolicyManagerChromeOS::OnRegistrationStateChanged( 191 void UserCloudPolicyManagerChromeOS::OnRegistrationStateChanged(
162 CloudPolicyClient* cloud_policy_client) { 192 CloudPolicyClient* cloud_policy_client) {
163 DCHECK_EQ(client(), cloud_policy_client); 193 DCHECK_EQ(client(), cloud_policy_client);
194
164 if (wait_for_policy_fetch_) { 195 if (wait_for_policy_fetch_) {
196 time_client_registered_ = base::Time::Now();
197 if (!time_token_available_.is_null()) {
198 UMA_HISTOGRAM_TIMES(kUMAInitialFetchDelayClientRegister,
199 time_client_registered_ - time_token_available_);
200 }
201
165 // If we're blocked on the policy fetch, now is a good time to issue it. 202 // If we're blocked on the policy fetch, now is a good time to issue it.
166 if (client()->is_registered()) { 203 if (client()->is_registered()) {
167 service()->RefreshPolicy( 204 service()->RefreshPolicy(
168 base::Bind( 205 base::Bind(
169 &UserCloudPolicyManagerChromeOS::OnInitialPolicyFetchComplete, 206 &UserCloudPolicyManagerChromeOS::OnInitialPolicyFetchComplete,
170 base::Unretained(this))); 207 base::Unretained(this)));
171 } else { 208 } else {
172 // If the client has switched to not registered, we bail out as this 209 // If the client has switched to not registered, we bail out as this
173 // indicates the cloud policy setup flow has been aborted. 210 // indicates the cloud policy setup flow has been aborted.
174 CancelWaitForPolicyFetch(); 211 CancelWaitForPolicyFetch();
175 } 212 }
176 } 213 }
177 } 214 }
178 215
179 void UserCloudPolicyManagerChromeOS::OnClientError( 216 void UserCloudPolicyManagerChromeOS::OnClientError(
180 CloudPolicyClient* cloud_policy_client) { 217 CloudPolicyClient* cloud_policy_client) {
181 DCHECK_EQ(client(), cloud_policy_client); 218 DCHECK_EQ(client(), cloud_policy_client);
182 CancelWaitForPolicyFetch(); 219 CancelWaitForPolicyFetch();
220
221 if (wait_for_policy_fetch_) {
222 UMA_HISTOGRAM_SPARSE_SLOWLY(kUMAInitialFetchClientError,
223 cloud_policy_client->status());
224 }
183 } 225 }
184 226
185 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyRefreshNeeded() { 227 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyRefreshNeeded() {
186 core()->RefreshSoon(); 228 core()->RefreshSoon();
187 } 229 }
188 230
189 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyUpdated() { 231 void UserCloudPolicyManagerChromeOS::OnComponentCloudPolicyUpdated() {
190 CheckAndPublishPolicy(); 232 CheckAndPublishPolicy();
191 StartRefreshSchedulerIfReady(); 233 StartRefreshSchedulerIfReady();
192 } 234 }
(...skipping 15 matching lines...) Expand all
208 g_browser_process->system_request_context(), 250 g_browser_process->system_request_context(),
209 base::Bind(&UserCloudPolicyManagerChromeOS::OnOAuth2PolicyTokenFetched, 251 base::Bind(&UserCloudPolicyManagerChromeOS::OnOAuth2PolicyTokenFetched,
210 base::Unretained(this)))); 252 base::Unretained(this))));
211 token_fetcher_->Start(); 253 token_fetcher_->Start();
212 } 254 }
213 255
214 void UserCloudPolicyManagerChromeOS::OnOAuth2PolicyTokenFetched( 256 void UserCloudPolicyManagerChromeOS::OnOAuth2PolicyTokenFetched(
215 const std::string& policy_token, 257 const std::string& policy_token,
216 const GoogleServiceAuthError& error) { 258 const GoogleServiceAuthError& error) {
217 DCHECK(!client()->is_registered()); 259 DCHECK(!client()->is_registered());
260
261 time_token_available_ = base::Time::Now();
262 if (wait_for_policy_fetch_) {
263 UMA_HISTOGRAM_TIMES(kUMAInitialFetchDelayOAuth2Token,
264 time_token_available_ - time_init_completed_);
265 }
266
218 if (error.state() == GoogleServiceAuthError::NONE) { 267 if (error.state() == GoogleServiceAuthError::NONE) {
219 // Start client registration. Either OnRegistrationStateChanged() or 268 // Start client registration. Either OnRegistrationStateChanged() or
220 // OnClientError() will be called back. 269 // OnClientError() will be called back.
221 client()->Register(em::DeviceRegisterRequest::USER, 270 client()->Register(em::DeviceRegisterRequest::USER,
222 policy_token, std::string(), false, std::string()); 271 policy_token, std::string(), false, std::string());
223 } else { 272 } else {
224 // Failed to get a token, stop waiting and use an empty policy. 273 // Failed to get a token, stop waiting and use an empty policy.
225 CancelWaitForPolicyFetch(); 274 CancelWaitForPolicyFetch();
275
276 UMA_HISTOGRAM_ENUMERATION(kUMAInitialFetchOAuth2Error,
277 error.state(),
278 GoogleServiceAuthError::NUM_STATES);
279 if (error.state() == GoogleServiceAuthError::CONNECTION_FAILED) {
280 UMA_HISTOGRAM_SPARSE_SLOWLY(kUMAInitialFetchOAuth2NetworkError,
281 error.network_error());
282 }
226 } 283 }
227 284
228 token_fetcher_.reset(); 285 token_fetcher_.reset();
229 } 286 }
230 287
231 void UserCloudPolicyManagerChromeOS::OnInitialPolicyFetchComplete( 288 void UserCloudPolicyManagerChromeOS::OnInitialPolicyFetchComplete(
232 bool success) { 289 bool success) {
290
291 const base::Time now = base::Time::Now();
292 UMA_HISTOGRAM_TIMES(kUMAInitialFetchDelayPolicyFetch,
293 now - time_client_registered_);
294 UMA_HISTOGRAM_TIMES(kUMAInitialFetchDelayTotal, now - time_init_started_);
233 CancelWaitForPolicyFetch(); 295 CancelWaitForPolicyFetch();
234 } 296 }
235 297
236 void UserCloudPolicyManagerChromeOS::CancelWaitForPolicyFetch() { 298 void UserCloudPolicyManagerChromeOS::CancelWaitForPolicyFetch() {
237 wait_for_policy_fetch_ = false; 299 wait_for_policy_fetch_ = false;
238 CheckAndPublishPolicy(); 300 CheckAndPublishPolicy();
239 // Now that |wait_for_policy_fetch_| is guaranteed to be false, the scheduler 301 // Now that |wait_for_policy_fetch_| is guaranteed to be false, the scheduler
240 // can be started. 302 // can be started.
241 StartRefreshSchedulerIfReady(); 303 StartRefreshSchedulerIfReady();
242 } 304 }
(...skipping 14 matching lines...) Expand all
257 // start the scheduler. The |component_policy_service_| will call back into 319 // start the scheduler. The |component_policy_service_| will call back into
258 // OnComponentCloudPolicyUpdated() once it's ready. 320 // OnComponentCloudPolicyUpdated() once it's ready.
259 return; 321 return;
260 } 322 }
261 323
262 StartRefreshScheduler(); 324 StartRefreshScheduler();
263 core()->TrackRefreshDelayPref(local_state_, prefs::kUserPolicyRefreshRate); 325 core()->TrackRefreshDelayPref(local_state_, prefs::kUserPolicyRefreshRate);
264 } 326 }
265 327
266 } // namespace policy 328 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698