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