1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "components/metrics/field_trials_provider.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <string>
8*6777b538SAndroid Build Coastguard Worker #include <vector>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
11*6777b538SAndroid Build Coastguard Worker #include "components/variations/active_field_trials.h"
12*6777b538SAndroid Build Coastguard Worker #include "components/variations/synthetic_trial_registry.h"
13*6777b538SAndroid Build Coastguard Worker #include "third_party/metrics_proto/system_profile.pb.h"
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker namespace variations {
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker
WriteFieldTrials(const std::vector<ActiveGroupId> & field_trial_ids,metrics::SystemProfileProto * system_profile)19*6777b538SAndroid Build Coastguard Worker void WriteFieldTrials(const std::vector<ActiveGroupId>& field_trial_ids,
20*6777b538SAndroid Build Coastguard Worker metrics::SystemProfileProto* system_profile) {
21*6777b538SAndroid Build Coastguard Worker for (const ActiveGroupId& id : field_trial_ids) {
22*6777b538SAndroid Build Coastguard Worker metrics::SystemProfileProto::FieldTrial* field_trial =
23*6777b538SAndroid Build Coastguard Worker system_profile->add_field_trial();
24*6777b538SAndroid Build Coastguard Worker field_trial->set_name_id(id.name);
25*6777b538SAndroid Build Coastguard Worker field_trial->set_group_id(id.group);
26*6777b538SAndroid Build Coastguard Worker }
27*6777b538SAndroid Build Coastguard Worker }
28*6777b538SAndroid Build Coastguard Worker
29*6777b538SAndroid Build Coastguard Worker } // namespace
30*6777b538SAndroid Build Coastguard Worker
FieldTrialsProvider(SyntheticTrialRegistry * registry,base::StringPiece suffix)31*6777b538SAndroid Build Coastguard Worker FieldTrialsProvider::FieldTrialsProvider(SyntheticTrialRegistry* registry,
32*6777b538SAndroid Build Coastguard Worker base::StringPiece suffix)
33*6777b538SAndroid Build Coastguard Worker : registry_(registry), suffix_(suffix) {}
34*6777b538SAndroid Build Coastguard Worker FieldTrialsProvider::~FieldTrialsProvider() = default;
35*6777b538SAndroid Build Coastguard Worker
GetFieldTrialIds(std::vector<ActiveGroupId> * field_trial_ids) const36*6777b538SAndroid Build Coastguard Worker void FieldTrialsProvider::GetFieldTrialIds(
37*6777b538SAndroid Build Coastguard Worker std::vector<ActiveGroupId>* field_trial_ids) const {
38*6777b538SAndroid Build Coastguard Worker // As the trial groups are included in metrics reports, we must not include
39*6777b538SAndroid Build Coastguard Worker // the low anonymity trials.
40*6777b538SAndroid Build Coastguard Worker variations::GetFieldTrialActiveGroupIds(suffix_, field_trial_ids);
41*6777b538SAndroid Build Coastguard Worker }
42*6777b538SAndroid Build Coastguard Worker
ProvideSystemProfileMetrics(metrics::SystemProfileProto * system_profile_proto)43*6777b538SAndroid Build Coastguard Worker void FieldTrialsProvider::ProvideSystemProfileMetrics(
44*6777b538SAndroid Build Coastguard Worker metrics::SystemProfileProto* system_profile_proto) {
45*6777b538SAndroid Build Coastguard Worker // ProvideSystemProfileMetricsWithLogCreationTime() should be called instead.
46*6777b538SAndroid Build Coastguard Worker NOTREACHED();
47*6777b538SAndroid Build Coastguard Worker }
48*6777b538SAndroid Build Coastguard Worker
ProvideSystemProfileMetricsWithLogCreationTime(base::TimeTicks log_creation_time,metrics::SystemProfileProto * system_profile_proto)49*6777b538SAndroid Build Coastguard Worker void FieldTrialsProvider::ProvideSystemProfileMetricsWithLogCreationTime(
50*6777b538SAndroid Build Coastguard Worker base::TimeTicks log_creation_time,
51*6777b538SAndroid Build Coastguard Worker metrics::SystemProfileProto* system_profile_proto) {
52*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/40697205): Maybe call ProvideCurrentSessionData() instead
53*6777b538SAndroid Build Coastguard Worker // from places in which ProvideSystemProfileMetricsWithLogCreationTime() is
54*6777b538SAndroid Build Coastguard Worker // called, e.g. startup_data.cc and background_tracing_metrics_provider.cc.
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker log_creation_time_ = log_creation_time;
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker const std::string& version = variations::GetSeedVersion();
59*6777b538SAndroid Build Coastguard Worker if (!version.empty())
60*6777b538SAndroid Build Coastguard Worker system_profile_proto->set_variations_seed_version(version);
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/40133600): Determine whether this can be deleted.
63*6777b538SAndroid Build Coastguard Worker GetAndWriteFieldTrials(system_profile_proto);
64*6777b538SAndroid Build Coastguard Worker }
65*6777b538SAndroid Build Coastguard Worker
ProvideCurrentSessionData(metrics::ChromeUserMetricsExtension * uma_proto)66*6777b538SAndroid Build Coastguard Worker void FieldTrialsProvider::ProvideCurrentSessionData(
67*6777b538SAndroid Build Coastguard Worker metrics::ChromeUserMetricsExtension* uma_proto) {
68*6777b538SAndroid Build Coastguard Worker // This function is called from both
69*6777b538SAndroid Build Coastguard Worker // ProvideSystemProfileMetricsWithLogCreationTime() and
70*6777b538SAndroid Build Coastguard Worker // ProvideCurrentSessionData() so that field trials activated in other metrics
71*6777b538SAndroid Build Coastguard Worker // providers are captured. We need both calls because in some scenarios in
72*6777b538SAndroid Build Coastguard Worker // which this class is used, only the former function gets called.
73*6777b538SAndroid Build Coastguard Worker DCHECK(!log_creation_time_.is_null());
74*6777b538SAndroid Build Coastguard Worker GetAndWriteFieldTrials(uma_proto->mutable_system_profile());
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker
SetLogCreationTimeForTesting(base::TimeTicks time)77*6777b538SAndroid Build Coastguard Worker void FieldTrialsProvider::SetLogCreationTimeForTesting(base::TimeTicks time) {
78*6777b538SAndroid Build Coastguard Worker log_creation_time_ = time;
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker
GetAndWriteFieldTrials(metrics::SystemProfileProto * system_profile_proto) const81*6777b538SAndroid Build Coastguard Worker void FieldTrialsProvider::GetAndWriteFieldTrials(
82*6777b538SAndroid Build Coastguard Worker metrics::SystemProfileProto* system_profile_proto) const {
83*6777b538SAndroid Build Coastguard Worker system_profile_proto->clear_field_trial();
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker std::vector<ActiveGroupId> field_trials;
86*6777b538SAndroid Build Coastguard Worker GetFieldTrialIds(&field_trials);
87*6777b538SAndroid Build Coastguard Worker WriteFieldTrials(field_trials, system_profile_proto);
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard Worker // May be null in tests.
90*6777b538SAndroid Build Coastguard Worker if (registry_) {
91*6777b538SAndroid Build Coastguard Worker std::vector<ActiveGroupId> synthetic_trials;
92*6777b538SAndroid Build Coastguard Worker registry_->GetSyntheticFieldTrialsOlderThan(log_creation_time_,
93*6777b538SAndroid Build Coastguard Worker &synthetic_trials, suffix_);
94*6777b538SAndroid Build Coastguard Worker WriteFieldTrials(synthetic_trials, system_profile_proto);
95*6777b538SAndroid Build Coastguard Worker }
96*6777b538SAndroid Build Coastguard Worker }
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker } // namespace variations
99