1 // Copyright 2022 The Chromium Authors
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/debug/metrics_internals_utils.h"
6
7 #include "base/strings/string_piece.h"
8 #include "components/metrics/metrics_pref_names.h"
9 #include "components/variations/client_filterable_state.h"
10 #include "components/variations/proto/study.pb.h"
11 #include "components/variations/service/variations_service.h"
12
13 namespace metrics {
14 namespace {
15
ChannelToString(variations::Study::Channel channel)16 std::string ChannelToString(variations::Study::Channel channel) {
17 switch (channel) {
18 case variations::Study::UNKNOWN:
19 return "Unknown";
20 case variations::Study::CANARY:
21 return "Canary";
22 case variations::Study::DEV:
23 return "Dev";
24 case variations::Study::BETA:
25 return "Beta";
26 case variations::Study::STABLE:
27 return "Stable";
28 }
29 NOTREACHED();
30 }
31
PlatformToString(variations::Study::Platform platform)32 std::string PlatformToString(variations::Study::Platform platform) {
33 switch (platform) {
34 case variations::Study::PLATFORM_WINDOWS:
35 return "Windows";
36 case variations::Study::PLATFORM_MAC:
37 return "Mac";
38 case variations::Study::PLATFORM_LINUX:
39 return "Linux";
40 case variations::Study::PLATFORM_CHROMEOS:
41 return "ChromeOS";
42 case variations::Study::PLATFORM_ANDROID:
43 return "Android";
44 case variations::Study::PLATFORM_IOS:
45 return "iOS";
46 case variations::Study::PLATFORM_ANDROID_WEBVIEW:
47 return "WebView";
48 case variations::Study::PLATFORM_FUCHSIA:
49 return "Fuchsia";
50 case variations::Study::PLATFORM_ANDROID_WEBLAYER:
51 return "WebLayer";
52 case variations::Study::PLATFORM_CHROMEOS_LACROS:
53 return "ChromeOS Lacros";
54 }
55 NOTREACHED();
56 }
57
CpuArchitectureToString(variations::Study::CpuArchitecture cpu_architecture)58 std::string CpuArchitectureToString(
59 variations::Study::CpuArchitecture cpu_architecture) {
60 switch (cpu_architecture) {
61 case variations::Study::X86_64:
62 return "x86_64";
63 case variations::Study::ARM64:
64 return "arm64";
65 case variations::Study::X86_32:
66 return "x86_32";
67 case variations::Study::ARM32:
68 return "arm32";
69 case variations::Study::TRANSLATED_X86_64:
70 return "translated_x86_64";
71 }
72 NOTREACHED();
73 }
74
FormFactorToString(variations::Study::FormFactor form_factor)75 std::string FormFactorToString(variations::Study::FormFactor form_factor) {
76 switch (form_factor) {
77 case variations::Study::DESKTOP:
78 return "Desktop";
79 case variations::Study::PHONE:
80 return "Phone";
81 case variations::Study::TABLET:
82 return "Tablet";
83 case variations::Study::KIOSK:
84 return "Kiosk";
85 case variations::Study::MEET_DEVICE:
86 return "Meet Device";
87 case variations::Study::TV:
88 return "TV";
89 case variations::Study::AUTOMOTIVE:
90 return "Automotive";
91 case variations::Study::FOLDABLE:
92 return "Foldable";
93 }
94 NOTREACHED();
95 }
96
BoolToString(bool val)97 std::string BoolToString(bool val) {
98 return val ? "Yes" : "No";
99 }
100
CreateKeyValueDict(base::StringPiece key,base::StringPiece value)101 base::Value::Dict CreateKeyValueDict(base::StringPiece key,
102 base::StringPiece value) {
103 base::Value::Dict dict;
104 dict.Set("key", key);
105 dict.Set("value", value);
106 return dict;
107 }
108
109 } // namespace
110
GetUmaSummary(MetricsService * metrics_service)111 base::Value::List GetUmaSummary(MetricsService* metrics_service) {
112 base::Value::List list;
113 list.Append(CreateKeyValueDict("Client ID", metrics_service->GetClientId()));
114 // TODO(crbug/1363747): Add the server-side client ID.
115 list.Append(CreateKeyValueDict(
116 "Metrics Reporting Enabled",
117 BoolToString(metrics_service->IsMetricsReportingEnabled())));
118 list.Append(
119 CreateKeyValueDict("Currently Recording",
120 BoolToString(metrics_service->recording_active())));
121 list.Append(
122 CreateKeyValueDict("Currently Reporting",
123 BoolToString(metrics_service->reporting_active())));
124 return list;
125 }
126
GetVariationsSummary(metrics_services_manager::MetricsServicesManager * metrics_service_manager)127 base::Value::List GetVariationsSummary(
128 metrics_services_manager::MetricsServicesManager* metrics_service_manager) {
129 base::Value::List list;
130 std::unique_ptr<variations::ClientFilterableState> state =
131 metrics_service_manager->GetVariationsService()
132 ->GetClientFilterableStateForVersion();
133 list.Append(CreateKeyValueDict("Channel", ChannelToString(state->channel)));
134 list.Append(CreateKeyValueDict("Version", state->version.GetString()));
135 list.Append(
136 CreateKeyValueDict("Platform", PlatformToString(state->platform)));
137 list.Append(CreateKeyValueDict("OS Version", state->os_version.GetString()));
138 list.Append(CreateKeyValueDict(
139 "CPU Architecture", CpuArchitectureToString(state->cpu_architecture)));
140 list.Append(CreateKeyValueDict("Hardware Class", state->hardware_class));
141 list.Append(CreateKeyValueDict("Form Factor",
142 FormFactorToString(state->form_factor)));
143 list.Append(CreateKeyValueDict("Low End Device",
144 BoolToString(state->is_low_end_device)));
145 list.Append(CreateKeyValueDict("Country (Session Consistency)",
146 state->session_consistency_country));
147 list.Append(CreateKeyValueDict("Country (Permanent Consistency)",
148 state->permanent_consistency_country));
149 list.Append(CreateKeyValueDict("Locale", state->locale));
150 list.Append(
151 CreateKeyValueDict("Enterprise", BoolToString(state->IsEnterprise())));
152 return list;
153 }
154
155 } // namespace metrics
156