// 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. #include "components/metrics/field_trials_provider.h" #include "base/strings/string_piece.h" #include "components/variations/active_field_trials.h" #include "components/variations/synthetic_trial_registry.h" #include "third_party/metrics_proto/system_profile.pb.h" namespace variations { namespace { void WriteFieldTrials(const std::vector& field_trial_ids, metrics::SystemProfileProto* system_profile) { for (const ActiveGroupId& id : field_trial_ids) { metrics::SystemProfileProto::FieldTrial* field_trial = system_profile->add_field_trial(); field_trial->set_name_id(id.name); field_trial->set_group_id(id.group); } } } // namespace FieldTrialsProvider::FieldTrialsProvider(SyntheticTrialRegistry* registry, base::StringPiece suffix) : registry_(registry), suffix_(suffix) {} FieldTrialsProvider::~FieldTrialsProvider() = default; void FieldTrialsProvider::GetFieldTrialIds( std::vector* field_trial_ids) const { // We use the default field trial suffixing (no suffix). variations::GetFieldTrialActiveGroupIds(suffix_, field_trial_ids); } void FieldTrialsProvider::OnDidCreateMetricsLog() { if (registry_) { creation_times_.push_back(base::TimeTicks::Now()); } } void FieldTrialsProvider::ProvideSystemProfileMetrics( metrics::SystemProfileProto* system_profile_proto) { std::vector field_trial_ids; GetFieldTrialIds(&field_trial_ids); WriteFieldTrials(field_trial_ids, system_profile_proto); if (registry_) { base::TimeTicks creation_time; // Should always be true, but don't crash even if there is a bug. if (!creation_times_.empty()) { creation_time = creation_times_.back(); creation_times_.pop_back(); } std::vector synthetic_trials; registry_->GetSyntheticFieldTrialsOlderThan(creation_time, &synthetic_trials); WriteFieldTrials(synthetic_trials, system_profile_proto); } } } // namespace variations