xref: /aosp_15_r20/external/cronet/components/metrics/field_trials_provider.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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