1 // Copyright 2017 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // ReportingService specialized to report UMA metrics.
6
7 #include "components/metrics/metrics_reporting_service.h"
8
9 #include <string_view>
10
11 #include "base/functional/bind.h"
12 #include "base/functional/callback.h"
13 #include "base/metrics/histogram_functions.h"
14 #include "base/metrics/histogram_macros.h"
15 #include "components/metrics/metrics_logs_event_manager.h"
16 #include "components/metrics/metrics_pref_names.h"
17 #include "components/metrics/metrics_service_client.h"
18 #include "components/metrics/unsent_log_store_metrics_impl.h"
19 #include "components/metrics/url_constants.h"
20 #include "components/prefs/pref_registry_simple.h"
21
22 namespace metrics {
23
24 // static
RegisterPrefs(PrefRegistrySimple * registry)25 void MetricsReportingService::RegisterPrefs(PrefRegistrySimple* registry) {
26 ReportingService::RegisterPrefs(registry);
27 MetricsLogStore::RegisterPrefs(registry);
28 }
29
MetricsReportingService(MetricsServiceClient * client,PrefService * local_state,MetricsLogsEventManager * logs_event_manager_)30 MetricsReportingService::MetricsReportingService(
31 MetricsServiceClient* client,
32 PrefService* local_state,
33 MetricsLogsEventManager* logs_event_manager_)
34 : ReportingService(client,
35 local_state,
36 client->GetStorageLimits()
37 .ongoing_log_queue_limits.max_log_size_bytes,
38 logs_event_manager_),
39 metrics_log_store_(local_state,
40 client->GetStorageLimits(),
41 client->GetUploadSigningKey(),
42 logs_event_manager_) {}
43
44 MetricsReportingService::~MetricsReportingService() = default;
45
log_store()46 LogStore* MetricsReportingService::log_store() {
47 return &metrics_log_store_;
48 }
49
GetUploadUrl() const50 GURL MetricsReportingService::GetUploadUrl() const {
51 return client()->GetMetricsServerUrl();
52 }
53
GetInsecureUploadUrl() const54 GURL MetricsReportingService::GetInsecureUploadUrl() const {
55 return client()->GetInsecureMetricsServerUrl();
56 }
57
upload_mime_type() const58 std::string_view MetricsReportingService::upload_mime_type() const {
59 return kDefaultMetricsMimeType;
60 }
61
service_type() const62 MetricsLogUploader::MetricServiceType MetricsReportingService::service_type()
63 const {
64 return MetricsLogUploader::UMA;
65 }
66
LogActualUploadInterval(base::TimeDelta interval)67 void MetricsReportingService::LogActualUploadInterval(
68 base::TimeDelta interval) {
69 UMA_HISTOGRAM_CUSTOM_COUNTS("UMA.ActualLogUploadInterval",
70 interval.InMinutes(), 1,
71 base::Hours(12).InMinutes(), 50);
72 }
73
LogCellularConstraint(bool upload_canceled)74 void MetricsReportingService::LogCellularConstraint(bool upload_canceled) {
75 UMA_HISTOGRAM_BOOLEAN("UMA.LogUpload.Canceled.CellularConstraint",
76 upload_canceled);
77 }
78
LogResponseOrErrorCode(int response_code,int error_code,bool was_https)79 void MetricsReportingService::LogResponseOrErrorCode(int response_code,
80 int error_code,
81 bool was_https) {
82 if (was_https) {
83 base::UmaHistogramSparse("UMA.LogUpload.ResponseOrErrorCode",
84 response_code >= 0 ? response_code : error_code);
85 } else {
86 base::UmaHistogramSparse("UMA.LogUpload.ResponseOrErrorCode.HTTP",
87 response_code >= 0 ? response_code : error_code);
88 }
89 }
90
LogSuccessLogSize(size_t log_size)91 void MetricsReportingService::LogSuccessLogSize(size_t log_size) {
92 UMA_HISTOGRAM_COUNTS_10000("UMA.LogSize.OnSuccess", log_size / 1024);
93 }
94
LogSuccessMetadata(const std::string & staged_log)95 void MetricsReportingService::LogSuccessMetadata(
96 const std::string& staged_log) {}
97
LogLargeRejection(size_t log_size)98 void MetricsReportingService::LogLargeRejection(size_t log_size) {}
99
100 } // namespace metrics
101