Index: components/rappor/rappor_service.cc |
diff --git a/components/rappor/rappor_service.cc b/components/rappor/rappor_service.cc |
deleted file mode 100644 |
index 18d57eea21c5f22c22bd47caa2ededaf374fe44c..0000000000000000000000000000000000000000 |
--- a/components/rappor/rappor_service.cc |
+++ /dev/null |
@@ -1,264 +0,0 @@ |
-// Copyright 2014 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. |
- |
-#include "components/rappor/rappor_service.h" |
- |
-#include <utility> |
- |
-#include "base/memory/ptr_util.h" |
-#include "base/metrics/field_trial.h" |
-#include "base/metrics/metrics_hashes.h" |
-#include "base/time/time.h" |
-#include "components/rappor/log_uploader.h" |
-#include "components/rappor/proto/rappor_metric.pb.h" |
-#include "components/rappor/rappor_metric.h" |
-#include "components/rappor/rappor_pref_names.h" |
-#include "components/rappor/rappor_prefs.h" |
-#include "components/variations/variations_associated_data.h" |
- |
-namespace rappor { |
- |
-namespace { |
- |
-// Seconds before the initial log is generated. |
-const int kInitialLogIntervalSeconds = 15; |
-// Interval between ongoing logs. |
-const int kLogIntervalSeconds = 30 * 60; |
- |
-const char kMimeType[] = "application/vnd.chrome.rappor"; |
- |
-const char kRapporDailyEventHistogram[] = "Rappor.DailyEvent.IntervalType"; |
- |
-// Constants for the RAPPOR rollout field trial. |
-const char kRapporRolloutFieldTrialName[] = "RapporRollout"; |
- |
-// Constant for the finch parameter name for the server URL |
-const char kRapporRolloutServerUrlParam[] = "ServerUrl"; |
- |
-// The rappor server's URL. |
-const char kDefaultServerUrl[] = "https://clients4.google.com/rappor"; |
- |
-GURL GetServerUrl() { |
- std::string server_url = variations::GetVariationParamValue( |
- kRapporRolloutFieldTrialName, |
- kRapporRolloutServerUrlParam); |
- if (!server_url.empty()) |
- return GURL(server_url); |
- else |
- return GURL(kDefaultServerUrl); |
-} |
- |
-} // namespace |
- |
-RapporService::RapporService( |
- PrefService* pref_service, |
- const base::Callback<bool(void)> is_incognito_callback) |
- : pref_service_(pref_service), |
- is_incognito_callback_(is_incognito_callback), |
- cohort_(-1), |
- daily_event_(pref_service, |
- prefs::kRapporLastDailySample, |
- kRapporDailyEventHistogram), |
- recording_groups_(0) { |
-} |
- |
-RapporService::~RapporService() { |
-} |
- |
-void RapporService::AddDailyObserver( |
- std::unique_ptr<metrics::DailyEvent::Observer> observer) { |
- daily_event_.AddObserver(std::move(observer)); |
-} |
- |
-void RapporService::Initialize(net::URLRequestContextGetter* request_context) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(!IsInitialized()); |
- const GURL server_url = GetServerUrl(); |
- if (!server_url.is_valid()) { |
- DVLOG(1) << server_url.spec() << " is invalid. " |
- << "RapporService not started."; |
- return; |
- } |
- DVLOG(1) << "RapporService reporting to " << server_url.spec(); |
- InitializeInternal( |
- base::MakeUnique<LogUploader>(server_url, kMimeType, request_context), |
- internal::LoadCohort(pref_service_), internal::LoadSecret(pref_service_)); |
-} |
- |
-void RapporService::Update(int recording_groups, bool may_upload) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(IsInitialized()); |
- if (recording_groups_ != recording_groups) { |
- if (recording_groups == 0) { |
- DVLOG(1) << "Rappor service stopped because all groups were disabled."; |
- recording_groups_ = 0; |
- CancelNextLogRotation(); |
- } else if (recording_groups_ == 0) { |
- DVLOG(1) << "RapporService started for groups: " |
- << recording_groups; |
- recording_groups_ = recording_groups; |
- ScheduleNextLogRotation( |
- base::TimeDelta::FromSeconds(kInitialLogIntervalSeconds)); |
- } else { |
- DVLOG(1) << "RapporService recording_groups changed:" << recording_groups; |
- recording_groups_ = recording_groups; |
- } |
- } |
- |
- DVLOG(1) << "RapporService recording_groups=" << recording_groups_ |
- << " may_upload=" << may_upload; |
- if (may_upload) { |
- uploader_->Start(); |
- } else { |
- uploader_->Stop(); |
- } |
-} |
- |
-// static |
-void RapporService::RegisterPrefs(PrefRegistrySimple* registry) { |
- internal::RegisterPrefs(registry); |
-} |
- |
-void RapporService::InitializeInternal( |
- std::unique_ptr<LogUploaderInterface> uploader, |
- int32_t cohort, |
- const std::string& secret) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(!IsInitialized()); |
- DCHECK(secret_.empty()); |
- uploader_.swap(uploader); |
- cohort_ = cohort; |
- secret_ = secret; |
-} |
- |
-void RapporService::CancelNextLogRotation() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- metrics_map_.clear(); |
- log_rotation_timer_.Stop(); |
-} |
- |
-void RapporService::ScheduleNextLogRotation(base::TimeDelta interval) { |
- log_rotation_timer_.Start(FROM_HERE, |
- interval, |
- this, |
- &RapporService::OnLogInterval); |
-} |
- |
-void RapporService::OnLogInterval() { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(uploader_); |
- DVLOG(2) << "RapporService::OnLogInterval"; |
- daily_event_.CheckInterval(); |
- RapporReports reports; |
- if (ExportMetrics(&reports)) { |
- std::string log_text; |
- bool success = reports.SerializeToString(&log_text); |
- DCHECK(success); |
- DVLOG(1) << "RapporService sending a report of " |
- << reports.report_size() << " value(s)."; |
- uploader_->QueueLog(log_text); |
- } |
- ScheduleNextLogRotation(base::TimeDelta::FromSeconds(kLogIntervalSeconds)); |
-} |
- |
-bool RapporService::ExportMetrics(RapporReports* reports) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK_GE(cohort_, 0); |
- reports->set_cohort(cohort_); |
- |
- for (const auto& kv : metrics_map_) { |
- const RapporMetric* metric = kv.second.get(); |
- RapporReports::Report* report = reports->add_report(); |
- report->set_name_hash(base::HashMetricName(kv.first)); |
- ByteVector bytes = metric->GetReport(secret_); |
- report->set_bits(std::string(bytes.begin(), bytes.end())); |
- DVLOG(2) << "Exporting metric " << kv.first; |
- } |
- metrics_map_.clear(); |
- |
- sampler_.ExportMetrics(secret_, reports); |
- |
- DVLOG(2) << "Generated a report with " << reports->report_size() |
- << " metrics."; |
- return reports->report_size() > 0; |
-} |
- |
-bool RapporService::IsInitialized() const { |
- return cohort_ >= 0; |
-} |
- |
-bool RapporService::RecordingAllowed(const RapporParameters& parameters) { |
- // Skip recording in incognito mode. |
- if (is_incognito_callback_.Run()) { |
- DVLOG(2) << "Metric not logged due to incognito mode."; |
- return false; |
- } |
- // Skip this metric if its recording_group is not enabled. |
- if (!(recording_groups_ & parameters.recording_group)) { |
- DVLOG(2) << "Metric not logged due to recording_group " |
- << recording_groups_ << " < " << parameters.recording_group; |
- return false; |
- } |
- return true; |
-} |
- |
-void RapporService::RecordSample(const std::string& metric_name, |
- RapporType type, |
- const std::string& sample) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- // Ignore the sample if the service hasn't started yet. |
- if (!IsInitialized()) |
- return; |
- DCHECK_LT(type, NUM_RAPPOR_TYPES); |
- const RapporParameters& parameters = internal::kRapporParametersForType[type]; |
- DVLOG(2) << "Recording sample \"" << sample |
- << "\" for metric \"" << metric_name |
- << "\" of type: " << type; |
- RecordSampleInternal(metric_name, parameters, sample); |
-} |
- |
-void RapporService::RecordSampleInternal(const std::string& metric_name, |
- const RapporParameters& parameters, |
- const std::string& sample) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(IsInitialized()); |
- if (!RecordingAllowed(parameters)) |
- return; |
- RapporMetric* metric = LookUpMetric(metric_name, parameters); |
- metric->AddSample(sample); |
-} |
- |
-RapporMetric* RapporService::LookUpMetric(const std::string& metric_name, |
- const RapporParameters& parameters) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(IsInitialized()); |
- auto it = metrics_map_.find(metric_name); |
- if (it != metrics_map_.end()) { |
- RapporMetric* metric = it->second.get(); |
- DCHECK_EQ(parameters.ToString(), metric->parameters().ToString()); |
- return metric; |
- } |
- |
- RapporMetric* new_metric = new RapporMetric(metric_name, parameters, cohort_); |
- metrics_map_[metric_name] = base::WrapUnique(new_metric); |
- return new_metric; |
-} |
- |
-std::unique_ptr<Sample> RapporService::CreateSample(RapporType type) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- DCHECK(IsInitialized()); |
- return base::WrapUnique( |
- new Sample(cohort_, internal::kRapporParametersForType[type])); |
-} |
- |
-void RapporService::RecordSampleObj(const std::string& metric_name, |
- std::unique_ptr<Sample> sample) { |
- DCHECK(thread_checker_.CalledOnValidThread()); |
- if (!RecordingAllowed(sample->parameters())) |
- return; |
- DVLOG(1) << "Recording sample of metric \"" << metric_name << "\""; |
- sampler_.AddSample(metric_name, std::move(sample)); |
-} |
- |
-} // namespace rappor |