OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 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 "blimp/engine/app/blimp_metrics_service_client.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/i18n/rtl.h" | |
9 #include "base/lazy_instance.h" | |
10 #include "base/memory/ptr_util.h" | |
11 #include "base/memory/ref_counted.h" | |
12 #include "components/metrics/call_stack_profile_metrics_provider.h" | |
13 #include "components/metrics/gpu/gpu_metrics_provider.h" | |
14 #include "components/metrics/metrics_service.h" | |
15 #include "components/metrics/metrics_service_client.h" | |
16 #include "components/metrics/metrics_state_manager.h" | |
17 #include "components/metrics/net/net_metrics_log_uploader.h" | |
18 #include "components/metrics/profiler/profiler_metrics_provider.h" | |
19 #include "components/metrics/ui/screen_info_metrics_provider.h" | |
20 #include "components/metrics/url_constants.h" | |
21 #include "components/prefs/pref_service.h" | |
22 #include "content/public/browser/browser_thread.h" | |
23 #include "net/url_request/url_request_context_getter.h" | |
24 | |
25 namespace blimp { | |
26 namespace engine { | |
27 | |
28 // BlimpMetricsServiceClient provides a singleton implementation of | |
29 // MetricsServiceClient tailored for the Blimp engine. | |
30 // Metrics are always turned on. | |
31 class BlimpMetricsServiceClient : public metrics::MetricsServiceClient { | |
32 public: | |
33 BlimpMetricsServiceClient(); | |
34 ~BlimpMetricsServiceClient() override; | |
35 | |
36 // The request_context_getter is a system request context that must remain | |
37 // valid for the client lifetime. | |
38 void Initialize( | |
39 std::unique_ptr<PrefService> pref_service, | |
40 scoped_refptr<net::URLRequestContextGetter> request_context_getter); | |
41 void Finalize(); | |
42 | |
43 // metrics::MetricsServiceClient implementation. | |
44 metrics::MetricsService* GetMetricsService() override; | |
45 void SetMetricsClientId(const std::string& client_id) override; | |
46 void OnRecordingDisabled() override; | |
47 bool IsOffTheRecordSessionActive() override; | |
48 int32_t GetProduct() override; | |
49 std::string GetApplicationLocale() override; | |
50 bool GetBrand(std::string* brand_code) override; | |
51 metrics::SystemProfileProto::Channel GetChannel() override; | |
52 std::string GetVersionString() override; | |
53 void OnLogUploadComplete() override; | |
54 void InitializeSystemProfileMetrics( | |
55 const base::Closure& done_callback) override; | |
56 void CollectFinalMetricsForLog(const base::Closure& done_callback) override; | |
57 std::unique_ptr<metrics::MetricsLogUploader> CreateUploader( | |
58 const base::Callback<void(int)>& on_upload_complete) override; | |
59 base::TimeDelta GetStandardUploadInterval() override; | |
60 metrics::MetricsServiceClient::EnableMetricsDefault GetDefaultOptIn() | |
61 override; | |
62 | |
63 private: | |
64 // Used by NetMetricsLogUploader to create log-upload requests. | |
65 scoped_refptr<net::URLRequestContextGetter> request_context_getter_; | |
66 std::unique_ptr<metrics::MetricsStateManager> metrics_state_manager_; | |
67 std::unique_ptr<metrics::MetricsService> metrics_service_; | |
68 | |
69 DISALLOW_COPY_AND_ASSIGN(BlimpMetricsServiceClient); | |
70 }; | |
71 | |
72 namespace { | |
73 | |
74 // How often after initial logging metrics results should be uploaded to the | |
75 // metrics service. | |
76 const int kStandardUploadIntervalMinutes = 30; | |
77 | |
78 base::LazyInstance<BlimpMetricsServiceClient>::Leaky g_lazy_instance_; | |
79 | |
80 // Returns if the MetricsService should be recording metrics information for | |
81 // the client. | |
82 // This callback required by MetricsStateManager::Create. | |
Kevin M
2016/05/02 21:50:52
is required
Jess
2016/05/02 23:00:23
Done.
| |
83 bool IsReportingEnabled() { | |
84 return true; | |
85 } | |
86 | |
87 // Store/LoadClientInfo allows Windows Chrome to back up ClientInfo. | |
88 // Both are no-ops for Blimp. | |
89 // These callbacks are required by MetricsStateManager::Create. | |
90 void StoreClientInfo(const metrics::ClientInfo& client_info) {} | |
91 | |
92 std::unique_ptr<metrics::ClientInfo> LoadClientInfo() { | |
93 return nullptr; | |
94 } | |
95 | |
96 } // namespace | |
97 | |
98 void BlimpMetricsServiceClient::Initialize( | |
99 std::unique_ptr<PrefService> pref_service, | |
100 scoped_refptr<net::URLRequestContextGetter> request_context_getter) { | |
101 request_context_getter_ = request_context_getter; | |
102 | |
103 metrics_state_manager_ = metrics::MetricsStateManager::Create( | |
104 pref_service.get(), base::Bind(&IsReportingEnabled), | |
105 base::Bind(&StoreClientInfo), base::Bind(&LoadClientInfo)); | |
106 | |
107 metrics_service_.reset(new metrics::MetricsService( | |
108 metrics_state_manager_.get(), this, pref_service.get())); | |
109 | |
110 metrics_service_->RegisterMetricsProvider( | |
111 base::WrapUnique<metrics::MetricsProvider>( | |
112 new metrics::NetworkMetricsProvider( | |
113 content::BrowserThread::GetBlockingPool()))); | |
114 | |
115 metrics_service_->RegisterMetricsProvider( | |
116 base::WrapUnique<metrics::MetricsProvider>( | |
117 new metrics::GPUMetricsProvider)); | |
118 | |
119 metrics_service_->RegisterMetricsProvider( | |
120 base::WrapUnique<metrics::MetricsProvider>( | |
121 new metrics::ScreenInfoMetricsProvider)); | |
122 | |
123 metrics_service_->RegisterMetricsProvider( | |
124 base::WrapUnique<metrics::MetricsProvider>( | |
125 new metrics::ProfilerMetricsProvider())); | |
126 | |
127 metrics_service_->RegisterMetricsProvider( | |
128 base::WrapUnique<metrics::MetricsProvider>( | |
129 new metrics::CallStackProfileMetricsProvider)); | |
130 | |
131 metrics_service_->InitializeMetricsRecordingState(); | |
132 | |
133 if (IsReportingEnabled()) | |
134 metrics_service_->Start(); | |
135 } | |
136 | |
137 void BlimpMetricsServiceClient::Finalize() { | |
138 metrics_service_->Stop(); | |
139 } | |
140 | |
141 metrics::MetricsService* BlimpMetricsServiceClient::GetMetricsService() { | |
142 return metrics_service_.get(); | |
143 } | |
144 | |
145 // In Chrome, UMA and Breakpad are enabled/disabled together by the same | |
146 // checkbox and they share the same client ID (a.k.a. GUID). | |
147 // This is not required by Blimp, so these are no-ops. | |
148 void BlimpMetricsServiceClient::SetMetricsClientId( | |
149 const std::string& client_id) {} | |
150 | |
151 // Recording can not be disabled in Blimp, so this function is a no-op. | |
152 void BlimpMetricsServiceClient::OnRecordingDisabled() {} | |
153 | |
154 bool BlimpMetricsServiceClient::IsOffTheRecordSessionActive() { | |
155 // Blimp does not have incognito mode. | |
156 return false; | |
157 } | |
158 | |
159 int32_t BlimpMetricsServiceClient::GetProduct() { | |
160 // Indicates product family (e.g. Chrome v Android Webview), not reported | |
161 // platform (e.g. Chrome_Linux, Chrome_Mac). | |
162 return metrics::ChromeUserMetricsExtension::CHROME; | |
163 } | |
164 | |
165 std::string BlimpMetricsServiceClient::GetApplicationLocale() { | |
166 return base::i18n::GetConfiguredLocale(); | |
167 } | |
168 | |
169 bool BlimpMetricsServiceClient::GetBrand(std::string* brand_code) { | |
170 // Blimp doesn't use brand codes. | |
171 return false; | |
172 } | |
173 | |
174 metrics::SystemProfileProto::Channel BlimpMetricsServiceClient::GetChannel() { | |
175 // Blimp engine does not have channel info yet. | |
176 return metrics::SystemProfileProto::CHANNEL_UNKNOWN; | |
177 } | |
178 | |
179 std::string BlimpMetricsServiceClient::GetVersionString() { | |
180 // TODO(jessicag): Add in a meaningful version string. | |
181 return std::string(); | |
182 } | |
183 | |
184 void BlimpMetricsServiceClient::OnLogUploadComplete() {} | |
185 | |
186 void BlimpMetricsServiceClient::InitializeSystemProfileMetrics( | |
187 const base::Closure& done_callback) { | |
188 // Blimp requires no additional work to InitializeSystemProfileMetrics | |
189 // and should proceed to the next call in the chain. | |
190 done_callback.Run(); | |
191 } | |
192 | |
193 void BlimpMetricsServiceClient::CollectFinalMetricsForLog( | |
194 const base::Closure& done_callback) { | |
195 // Blimp requires no additional work to CollectFinalMetricsForLog | |
196 // and should proceed to the next call in the chain | |
197 done_callback.Run(); | |
198 } | |
199 | |
200 std::unique_ptr<metrics::MetricsLogUploader> | |
201 BlimpMetricsServiceClient::CreateUploader( | |
202 const base::Callback<void(int)>& on_upload_complete) { | |
203 return base::WrapUnique<metrics::MetricsLogUploader>( | |
204 new metrics::NetMetricsLogUploader( | |
205 request_context_getter_.get(), metrics::kDefaultMetricsServerUrl, | |
206 metrics::kDefaultMetricsMimeType, on_upload_complete)); | |
207 } | |
208 | |
209 base::TimeDelta BlimpMetricsServiceClient::GetStandardUploadInterval() { | |
210 return base::TimeDelta::FromMinutes(kStandardUploadIntervalMinutes); | |
211 } | |
212 | |
213 metrics::MetricsServiceClient::EnableMetricsDefault | |
214 BlimpMetricsServiceClient::GetDefaultOptIn() { | |
215 return OPT_IN; | |
216 } | |
217 | |
218 BlimpMetricsServiceClient::BlimpMetricsServiceClient() {} | |
219 | |
220 BlimpMetricsServiceClient::~BlimpMetricsServiceClient() {} | |
221 | |
222 BlimpMetricsServiceClient* GetBlimpMetricsServiceClientInstance() { | |
223 return g_lazy_instance_.Pointer(); | |
224 } | |
225 | |
226 void InitializeBlimpMetrics( | |
227 std::unique_ptr<PrefService> pref_service, | |
228 scoped_refptr<net::URLRequestContextGetter> request_context_getter) { | |
229 GetBlimpMetricsServiceClientInstance()->Initialize(std::move(pref_service), | |
230 request_context_getter); | |
231 } | |
232 | |
233 void FinalizeBlimpMetrics() { | |
234 GetBlimpMetricsServiceClientInstance()->Finalize(); | |
235 } | |
236 | |
237 } // namespace engine | |
238 } // namespace blimp | |
OLD | NEW |