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

Side by Side Diff: android_webview/browser/aw_metrics_service_client.cc

Issue 1563093005: Keep per-app GUID for WebView Metrics (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: adress comments Created 4 years, 11 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
« no previous file with comments | « android_webview/browser/aw_metrics_service_client.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 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 "android_webview/browser/aw_metrics_service_client.h" 5 #include "android_webview/browser/aw_metrics_service_client.h"
6 6
7 #include "android_webview/common/aw_version_info_values.h" 7 #include "android_webview/common/aw_version_info_values.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/files/file_util.h"
10 #include "base/guid.h"
9 #include "base/i18n/rtl.h" 11 #include "base/i18n/rtl.h"
10 #include "base/prefs/pref_service.h" 12 #include "base/prefs/pref_service.h"
11 #include "components/metrics/call_stack_profile_metrics_provider.h" 13 #include "components/metrics/call_stack_profile_metrics_provider.h"
12 #include "components/metrics/gpu/gpu_metrics_provider.h" 14 #include "components/metrics/gpu/gpu_metrics_provider.h"
15 #include "components/metrics/metrics_pref_names.h"
13 #include "components/metrics/metrics_service.h" 16 #include "components/metrics/metrics_service.h"
14 #include "components/metrics/metrics_state_manager.h" 17 #include "components/metrics/metrics_state_manager.h"
15 #include "components/metrics/net/net_metrics_log_uploader.h" 18 #include "components/metrics/net/net_metrics_log_uploader.h"
16 #include "components/metrics/profiler/profiler_metrics_provider.h" 19 #include "components/metrics/profiler/profiler_metrics_provider.h"
17 #include "components/metrics/ui/screen_info_metrics_provider.h" 20 #include "components/metrics/ui/screen_info_metrics_provider.h"
18 #include "components/metrics/url_constants.h" 21 #include "components/metrics/url_constants.h"
19 #include "content/public/browser/browser_thread.h" 22 #include "content/public/browser/browser_thread.h"
20 23
21 namespace android_webview { 24 namespace android_webview {
22 25
23 base::LazyInstance<AwMetricsServiceClient>::Leaky g_lazy_instance_; 26 base::LazyInstance<AwMetricsServiceClient>::Leaky g_lazy_instance_;
24 27
25 namespace { 28 namespace {
26 29
27 const int kUploadIntervalMinutes = 30; 30 const int kUploadIntervalMinutes = 30;
28 31
29 // Callbacks for metrics::MetricsStateManager::Create. Store/LoadClientInfo 32 // Callbacks for metrics::MetricsStateManager::Create. Store/LoadClientInfo
30 // allow Windows Chrome to back up ClientInfo. They're no-ops for WebView. 33 // allow Windows Chrome to back up ClientInfo. They're no-ops for WebView.
31 34
32 void StoreClientInfo(const metrics::ClientInfo& client_info) {} 35 void StoreClientInfo(const metrics::ClientInfo& client_info) {}
33 36
34 scoped_ptr<metrics::ClientInfo> LoadClientInfo() { 37 scoped_ptr<metrics::ClientInfo> LoadClientInfo() {
35 scoped_ptr<metrics::ClientInfo> client_info; 38 scoped_ptr<metrics::ClientInfo> client_info;
36 return client_info; 39 return client_info;
37 } 40 }
38 41
42 // A GUID in text form is composed of 32 hex digits and 4 hyphens.
43 const size_t GUID_SIZE = 32 + 4;
44
45 void GetOrCreateGUID(const base::FilePath guid_file_path, std::string* guid) {
46 DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
47
48 // Try to read an existing GUID.
49 if (base::ReadFileToString(guid_file_path, guid, GUID_SIZE)) {
50 if (base::IsValidGUID(*guid))
51 return;
52 else
53 LOG(ERROR) << "Found invalid GUID";
54 }
55
56 // We must write a new GUID.
57 *guid = base::GenerateGUID();
58 if (!base::WriteFile(guid_file_path, guid->c_str(), guid->size()))
59 LOG(ERROR) << "Failed to write new GUID";
60 return;
61 }
62
39 } // namespace 63 } // namespace
40 64
41 // static 65 // static
42 AwMetricsServiceClient* AwMetricsServiceClient::GetInstance() { 66 AwMetricsServiceClient* AwMetricsServiceClient::GetInstance() {
43 return g_lazy_instance_.Pointer(); 67 return g_lazy_instance_.Pointer();
44 } 68 }
45 69
46 // static
47 void AwMetricsServiceClient::Initialize( 70 void AwMetricsServiceClient::Initialize(
48 PrefService* pref_service, 71 PrefService* pref_service,
49 net::URLRequestContextGetter* request_context) { 72 net::URLRequestContextGetter* request_context,
73 const base::FilePath guid_file_path) {
50 DCHECK(!is_initialized_); 74 DCHECK(!is_initialized_);
51 75
52 pref_service_ = pref_service; 76 pref_service_ = pref_service;
53 request_context_ = request_context; 77 request_context_ = request_context;
54 78
79 std::string* guid = new std::string;
80 // Initialization happens on the UI thread, but getting the GUID should happen
81 // on the file I/O thread. So we start to initialize, then post to get the
82 // GUID, and then pick up where we left off, back on the UI thread, in
83 // InitializeWithGUID.
84 content::BrowserThread::PostTaskAndReply(
85 content::BrowserThread::FILE,
86 FROM_HERE,
87 base::Bind(&GetOrCreateGUID, guid_file_path, guid),
88 base::Bind(&AwMetricsServiceClient::InitializeWithGUID,
89 base::Unretained(this), base::Owned(guid)));
90 }
91
92 void AwMetricsServiceClient::InitializeWithGUID(std::string* guid) {
93 DCHECK(!is_initialized_);
94
95 pref_service_->SetString(metrics::prefs::kMetricsClientID, *guid);
96
55 metrics_state_manager_ = metrics::MetricsStateManager::Create( 97 metrics_state_manager_ = metrics::MetricsStateManager::Create(
56 pref_service_, base::Bind(&AwMetricsServiceClient::is_reporting_enabled, 98 pref_service_, base::Bind(&AwMetricsServiceClient::is_reporting_enabled,
57 base::Unretained(this)), 99 base::Unretained(this)),
58 base::Bind(&StoreClientInfo), base::Bind(&LoadClientInfo)); 100 base::Bind(&StoreClientInfo), base::Bind(&LoadClientInfo));
59 101
60 metrics_service_.reset(new ::metrics::MetricsService( 102 metrics_service_.reset(new ::metrics::MetricsService(
61 metrics_state_manager_.get(), this, pref_service_)); 103 metrics_state_manager_.get(), this, pref_service_));
62 104
63 metrics_service_->RegisterMetricsProvider( 105 metrics_service_->RegisterMetricsProvider(
64 scoped_ptr<metrics::MetricsProvider>(new metrics::NetworkMetricsProvider( 106 scoped_ptr<metrics::MetricsProvider>(new metrics::NetworkMetricsProvider(
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 request_context_(nullptr) {} 223 request_context_(nullptr) {}
182 224
183 AwMetricsServiceClient::~AwMetricsServiceClient() {} 225 AwMetricsServiceClient::~AwMetricsServiceClient() {}
184 226
185 bool AwMetricsServiceClient::is_reporting_enabled() { 227 bool AwMetricsServiceClient::is_reporting_enabled() {
186 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 228 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
187 return is_enabled_; 229 return is_enabled_;
188 } 230 }
189 231
190 } // namespace android_webview 232 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/aw_metrics_service_client.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698