1 // Copyright 2023 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 #include "components/metrics/structured/reporting/structured_metrics_reporting_service.h"
6 #include "base/metrics/histogram_functions.h"
7 #include "components/metrics/metrics_service_client.h"
8 #include "components/metrics/structured/reporting/structured_metrics_log_metrics.h"
9 #include "components/metrics/structured/structured_metrics_prefs.h"
10 #include "components/metrics/url_constants.h"
11 #include "components/prefs/pref_registry_simple.h"
12
13 namespace metrics::structured::reporting {
StructuredMetricsReportingService(MetricsServiceClient * client,PrefService * local_state,const UnsentLogStore::UnsentLogStoreLimits & storage_limits)14 StructuredMetricsReportingService::StructuredMetricsReportingService(
15 MetricsServiceClient* client,
16 PrefService* local_state,
17 const UnsentLogStore::UnsentLogStoreLimits& storage_limits)
18 : ReportingService(client,
19 local_state,
20 storage_limits.max_log_size_bytes,
21 /*logs_event_manager=*/nullptr),
22 log_store_(std::make_unique<StructuredMetricsLogMetrics>(),
23 local_state,
24 prefs::kLogStoreName,
25 /* metadata_pref_name=*/nullptr,
26 storage_limits,
27 client->GetUploadSigningKey(),
28 /* logs_event_manager=*/nullptr) {}
29
StoreLog(const std::string & serialized_log,metrics::MetricsLogsEventManager::CreateReason reason)30 void StructuredMetricsReportingService::StoreLog(
31 const std::string& serialized_log,
32 metrics::MetricsLogsEventManager::CreateReason reason) {
33 LogMetadata metadata;
34 log_store_.StoreLog(serialized_log, metadata, reason);
35 }
36
log_store()37 metrics::LogStore* StructuredMetricsReportingService::log_store() {
38 return &log_store_;
39 }
40
Purge()41 void StructuredMetricsReportingService::Purge() {
42 log_store_.Purge();
43 }
44
45 // Getters for MetricsLogUploader parameters.
GetUploadUrl() const46 GURL StructuredMetricsReportingService::GetUploadUrl() const {
47 return client()->GetMetricsServerUrl();
48 }
GetInsecureUploadUrl() const49 GURL StructuredMetricsReportingService::GetInsecureUploadUrl() const {
50 return client()->GetInsecureMetricsServerUrl();
51 }
52
upload_mime_type() const53 base::StringPiece StructuredMetricsReportingService::upload_mime_type() const {
54 return kDefaultMetricsMimeType;
55 }
56
57 MetricsLogUploader::MetricServiceType
service_type() const58 StructuredMetricsReportingService::service_type() const {
59 return MetricsLogUploader::STRUCTURED_METRICS;
60 }
61
62 // Methods for recording data to histograms.
LogActualUploadInterval(base::TimeDelta interval)63 void StructuredMetricsReportingService::LogActualUploadInterval(
64 base::TimeDelta interval) {
65 base::UmaHistogramCustomCounts(
66 "StructuredMetrics.Reporting.ActualUploadInterval", interval.InMinutes(),
67 1, base::Hours(12).InMinutes(), 50);
68 }
69
LogResponseOrErrorCode(int response_code,int error_code,bool)70 void StructuredMetricsReportingService::LogResponseOrErrorCode(
71 int response_code,
72 int error_code,
73 bool /*was_http*/) {
74 // TODO(crbug.com/40268040) Do we assume |was_https| is always true? UMA
75 // doesn't but UKM does.
76 if (response_code >= 0) {
77 base::UmaHistogramSparse("StructuredMetrics.Reporting.HTTPResponseCode",
78 response_code);
79 } else {
80 base::UmaHistogramSparse("StructuredMetrics.Reporting.HTTPErrorCode",
81 error_code);
82 }
83 }
84
LogSuccessLogSize(size_t log_size)85 void StructuredMetricsReportingService::LogSuccessLogSize(size_t log_size) {
86 base::UmaHistogramMemoryKB("StructuredMetrics.Reporting.LogSize.OnSuccess",
87 log_size);
88 }
89
LogLargeRejection(size_t log_size)90 void StructuredMetricsReportingService::LogLargeRejection(size_t log_size) {
91 base::UmaHistogramMemoryKB("StructuredMetrics.Reporting.LogSize.RejectedSize",
92 log_size);
93 }
94
95 // static:
RegisterPrefs(PrefRegistrySimple * registry)96 void StructuredMetricsReportingService::RegisterPrefs(
97 PrefRegistrySimple* registry) {
98 registry->RegisterListPref(prefs::kLogStoreName);
99 }
100
101 } // namespace metrics::structured::reporting
102