Avi Drissman | 8ba1bad | 2022-09-13 19:22:36 | [diff] [blame] | 1 | // Copyright 2017 The Chromium Authors |
Steven Holte | 5c6dd63 | 2017-07-19 23:25:49 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "components/metrics/field_trials_provider.h" |
| 6 | |
Yue Ru Sun | 1787d5a | 2020-02-25 20:00:50 | [diff] [blame] | 7 | #include <string> |
Helmut Januschka | ff1c3ec | 2024-04-25 19:38:32 | [diff] [blame] | 8 | #include <string_view> |
Yue Ru Sun | 1787d5a | 2020-02-25 20:00:50 | [diff] [blame] | 9 | #include <vector> |
| 10 | |
Steven Holte | 5c6dd63 | 2017-07-19 23:25:49 | [diff] [blame] | 11 | #include "components/variations/active_field_trials.h" |
| 12 | #include "components/variations/synthetic_trial_registry.h" |
Steven Holte | f9d5ed6 | 2017-10-21 02:02:30 | [diff] [blame] | 13 | #include "third_party/metrics_proto/system_profile.pb.h" |
Steven Holte | 5c6dd63 | 2017-07-19 23:25:49 | [diff] [blame] | 14 | |
| 15 | namespace variations { |
| 16 | |
| 17 | namespace { |
| 18 | |
| 19 | void WriteFieldTrials(const std::vector<ActiveGroupId>& field_trial_ids, |
| 20 | metrics::SystemProfileProto* system_profile) { |
| 21 | for (const ActiveGroupId& id : field_trial_ids) { |
| 22 | metrics::SystemProfileProto::FieldTrial* field_trial = |
| 23 | system_profile->add_field_trial(); |
| 24 | field_trial->set_name_id(id.name); |
| 25 | field_trial->set_group_id(id.group); |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | } // namespace |
| 30 | |
Robert Kaplow | d45b620 | 2017-07-20 02:01:46 | [diff] [blame] | 31 | FieldTrialsProvider::FieldTrialsProvider(SyntheticTrialRegistry* registry, |
Helmut Januschka | ff1c3ec | 2024-04-25 19:38:32 | [diff] [blame] | 32 | std::string_view suffix) |
Robert Kaplow | d45b620 | 2017-07-20 02:01:46 | [diff] [blame] | 33 | : registry_(registry), suffix_(suffix) {} |
Steven Holte | 5c6dd63 | 2017-07-19 23:25:49 | [diff] [blame] | 34 | FieldTrialsProvider::~FieldTrialsProvider() = default; |
| 35 | |
| 36 | void FieldTrialsProvider::GetFieldTrialIds( |
| 37 | std::vector<ActiveGroupId>* field_trial_ids) const { |
James Lee | 01bb2e9 | 2023-04-15 19:46:40 | [diff] [blame] | 38 | // As the trial groups are included in metrics reports, we must not include |
| 39 | // the low anonymity trials. |
James Lee | 514e2ef | 2023-04-18 15:33:33 | [diff] [blame] | 40 | variations::GetFieldTrialActiveGroupIds(suffix_, field_trial_ids); |
Steven Holte | 5c6dd63 | 2017-07-19 23:25:49 | [diff] [blame] | 41 | } |
| 42 | |
Alexei Svitkine | 70c9502 | 2019-08-21 18:13:24 | [diff] [blame] | 43 | void FieldTrialsProvider::ProvideSystemProfileMetrics( |
| 44 | metrics::SystemProfileProto* system_profile_proto) { |
| 45 | // ProvideSystemProfileMetricsWithLogCreationTime() should be called instead. |
Peter Boström | 65b0692 | 2024-11-08 20:34:12 | [diff] [blame] | 46 | NOTREACHED(); |
Steven Holte | 5c6dd63 | 2017-07-19 23:25:49 | [diff] [blame] | 47 | } |
| 48 | |
Alexei Svitkine | 70c9502 | 2019-08-21 18:13:24 | [diff] [blame] | 49 | void FieldTrialsProvider::ProvideSystemProfileMetricsWithLogCreationTime( |
| 50 | base::TimeTicks log_creation_time, |
Steven Holte | 5c6dd63 | 2017-07-19 23:25:49 | [diff] [blame] | 51 | metrics::SystemProfileProto* system_profile_proto) { |
Alison Gale | b8be952 | 2024-04-16 00:00:31 | [diff] [blame] | 52 | // TODO(crbug.com/40697205): Maybe call ProvideCurrentSessionData() instead |
| 53 | // from places in which ProvideSystemProfileMetricsWithLogCreationTime() is |
| 54 | // called, e.g. startup_data.cc and background_tracing_metrics_provider.cc. |
Caitlin Fischer | d0cd0b9 | 2020-06-03 12:10:48 | [diff] [blame] | 55 | |
| 56 | log_creation_time_ = log_creation_time; |
| 57 | |
Steven Holte | a70ef7d | 2018-11-21 20:03:16 | [diff] [blame] | 58 | const std::string& version = variations::GetSeedVersion(); |
| 59 | if (!version.empty()) |
| 60 | system_profile_proto->set_variations_seed_version(version); |
Caitlin Fischer | d0cd0b9 | 2020-06-03 12:10:48 | [diff] [blame] | 61 | |
Alison Gale | b8be952 | 2024-04-16 00:00:31 | [diff] [blame] | 62 | // TODO(crbug.com/40133600): Determine whether this can be deleted. |
Caitlin Fischer | d0cd0b9 | 2020-06-03 12:10:48 | [diff] [blame] | 63 | GetAndWriteFieldTrials(system_profile_proto); |
| 64 | } |
| 65 | |
| 66 | void FieldTrialsProvider::ProvideCurrentSessionData( |
| 67 | metrics::ChromeUserMetricsExtension* uma_proto) { |
| 68 | // This function is called from both |
| 69 | // ProvideSystemProfileMetricsWithLogCreationTime() and |
| 70 | // ProvideCurrentSessionData() so that field trials activated in other metrics |
| 71 | // providers are captured. We need both calls because in some scenarios in |
| 72 | // which this class is used, only the former function gets called. |
| 73 | DCHECK(!log_creation_time_.is_null()); |
| 74 | GetAndWriteFieldTrials(uma_proto->mutable_system_profile()); |
| 75 | } |
| 76 | |
| 77 | void FieldTrialsProvider::SetLogCreationTimeForTesting(base::TimeTicks time) { |
| 78 | log_creation_time_ = time; |
| 79 | } |
| 80 | |
| 81 | void FieldTrialsProvider::GetAndWriteFieldTrials( |
| 82 | metrics::SystemProfileProto* system_profile_proto) const { |
| 83 | system_profile_proto->clear_field_trial(); |
| 84 | |
| 85 | std::vector<ActiveGroupId> field_trials; |
| 86 | GetFieldTrialIds(&field_trials); |
| 87 | WriteFieldTrials(field_trials, system_profile_proto); |
Robert Kaplow | d45b620 | 2017-07-20 02:01:46 | [diff] [blame] | 88 | |
Mike Wittman | cfd2f37 | 2022-03-09 02:30:14 | [diff] [blame] | 89 | // May be null in tests. |
Robert Kaplow | d45b620 | 2017-07-20 02:01:46 | [diff] [blame] | 90 | if (registry_) { |
Robert Kaplow | d45b620 | 2017-07-20 02:01:46 | [diff] [blame] | 91 | std::vector<ActiveGroupId> synthetic_trials; |
Caitlin Fischer | d0cd0b9 | 2020-06-03 12:10:48 | [diff] [blame] | 92 | registry_->GetSyntheticFieldTrialsOlderThan(log_creation_time_, |
Luc Nguyen | d28c202 | 2022-05-12 18:58:57 | [diff] [blame] | 93 | &synthetic_trials, suffix_); |
Robert Kaplow | d45b620 | 2017-07-20 02:01:46 | [diff] [blame] | 94 | WriteFieldTrials(synthetic_trials, system_profile_proto); |
| 95 | } |
Steven Holte | 5c6dd63 | 2017-07-19 23:25:49 | [diff] [blame] | 96 | } |
| 97 | |
| 98 | } // namespace variations |