Index: components/ukm/ukm_reporting_service.cc |
diff --git a/components/ukm/ukm_reporting_service.cc b/components/ukm/ukm_reporting_service.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3e6d48a0f7bcddf5fa8c782a7a6348fe323d506e |
--- /dev/null |
+++ b/components/ukm/ukm_reporting_service.cc |
@@ -0,0 +1,102 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// ReportingService specialized to report UKM metrics. |
+ |
+#include "components/ukm/ukm_reporting_service.h" |
+ |
+#include "base/memory/ptr_util.h" |
+#include "base/metrics/field_trial_params.h" |
+#include "base/metrics/histogram_macros.h" |
+#include "components/prefs/pref_registry_simple.h" |
+#include "components/ukm/persisted_logs_metrics_impl.h" |
+#include "components/ukm/ukm_pref_names.h" |
+#include "components/ukm/ukm_service.h" |
+ |
+namespace ukm { |
+ |
+namespace { |
+ |
+// The UKM server's URL. |
+constexpr char kMimeType[] = "application/vnd.chrome.ukm"; |
+ |
+// The number of UKM logs that will be stored in PersistedLogs before logs |
+// start being dropped. |
+constexpr int kMinPersistedLogs = 8; |
+ |
+// The number of bytes UKM logs that will be stored in PersistedLogs before |
+// logs start being dropped. |
+// This ensures that a reasonable amount of history will be stored even if there |
+// is a long series of very small logs. |
+constexpr int kMinPersistedBytes = 300000; |
+ |
+// If an upload fails, and the transmission was over this byte count, then we |
+// will discard the log, and not try to retransmit it. We also don't persist |
+// the log to the prefs for transmission during the next chrome session if this |
+// limit is exceeded. |
+constexpr size_t kMaxLogRetransmitSize = 100 * 1024; |
+ |
+std::string GetServerUrl() { |
+ constexpr char kDefaultServerUrl[] = "https://clients4.google.com/ukm"; |
+ std::string server_url = |
+ base::GetFieldTrialParamValueByFeature(kUkmFeature, "ServerUrl"); |
+ if (!server_url.empty()) |
+ return server_url; |
+ return kDefaultServerUrl; |
+} |
+ |
+} // namespace |
+ |
+// static |
+void UkmReportingService::RegisterPrefs(PrefRegistrySimple* registry) { |
+ registry->RegisterListPref(prefs::kUkmPersistedLogs); |
+ // Base class already registered by MetricsReportingService::RegisterPrefs |
+ // ReportingService::RegisterPrefs(registry); |
+} |
+ |
+UkmReportingService::UkmReportingService(metrics::MetricsServiceClient* client, |
+ PrefService* local_state) |
+ : ReportingService(client, local_state, kMaxLogRetransmitSize), |
+ persisted_logs_(base::MakeUnique<ukm::PersistedLogsMetricsImpl>(), |
+ local_state, |
+ prefs::kUkmPersistedLogs, |
+ kMinPersistedLogs, |
+ kMinPersistedBytes, |
+ kMaxLogRetransmitSize) {} |
+ |
+UkmReportingService::~UkmReportingService() {} |
+ |
+metrics::LogStore* UkmReportingService::log_store() { |
+ return &persisted_logs_; |
+} |
+ |
+std::string UkmReportingService::GetUploadUrl() const { |
+ return GetServerUrl(); |
+} |
+ |
+base::StringPiece UkmReportingService::upload_mime_type() const { |
+ return kMimeType; |
+} |
+ |
+metrics::MetricsLogUploader::MetricServiceType |
+UkmReportingService::service_type() const { |
+ return metrics::MetricsLogUploader::UKM; |
+} |
+ |
+void UkmReportingService::LogCellularConstraint(bool upload_canceled) { |
+ UMA_HISTOGRAM_BOOLEAN("UKM.LogUpload.Canceled.CellularConstraint", |
+ upload_canceled); |
+} |
+ |
+void UkmReportingService::LogResponseCode(int response_code) { |
+ UMA_HISTOGRAM_SPARSE_SLOWLY("UKM.Upload.ResponseCode", response_code); |
+} |
+ |
+void UkmReportingService::LogSuccess(size_t log_size) { |
+ UMA_HISTOGRAM_COUNTS_10000("UKM.LogSize.OnSuccess", log_size / 1024); |
+} |
+ |
+void UkmReportingService::LogLargeRejection(size_t log_size) {} |
+ |
+} // namespace metrics |