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