blob: f0c664395cc6c2fb76872381ef24e22094f66ae1 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2014 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
David Zeuthen33bae492014-02-25 16:16:18 -080016
Tianjie Xu282aa1f2017-09-05 13:42:45 -070017#include "update_engine/metrics_reporter_omaha.h"
David Zeuthen33bae492014-02-25 16:16:18 -080018
Tianjie Xu98333a82017-09-22 21:29:29 -070019#include <memory>
David Zeuthen33bae492014-02-25 16:16:18 -080020
21#include <base/logging.h>
Marton Hunyadya0302682018-05-16 18:52:13 +020022#include <base/strings/string_number_conversions.h>
Alex Deymoa2591792015-11-17 00:39:40 -030023#include <metrics/metrics_library.h>
David Zeuthen33bae492014-02-25 16:16:18 -080024
Alex Deymo39910dc2015-11-09 17:04:30 -080025#include "update_engine/common/clock_interface.h"
26#include "update_engine/common/constants.h"
27#include "update_engine/common/prefs_interface.h"
28#include "update_engine/common/utils.h"
Alex Deymoa2591792015-11-17 00:39:40 -030029#include "update_engine/metrics_utils.h"
Marton Hunyadya0302682018-05-16 18:52:13 +020030#include "update_engine/omaha_request_params.h"
David Zeuthen33bae492014-02-25 16:16:18 -080031#include "update_engine/system_state.h"
David Zeuthen33bae492014-02-25 16:16:18 -080032
33using std::string;
34
35namespace chromeos_update_engine {
36
Tianjie Xu98333a82017-09-22 21:29:29 -070037namespace metrics {
38
David Zeuthen33bae492014-02-25 16:16:18 -080039// UpdateEngine.Daily.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -070040const char kMetricDailyOSAgeDays[] = "UpdateEngine.Daily.OSAgeDays";
David Zeuthen33bae492014-02-25 16:16:18 -080041
42// UpdateEngine.Check.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -070043const char kMetricCheckDownloadErrorCode[] =
David Zeuthen33bae492014-02-25 16:16:18 -080044 "UpdateEngine.Check.DownloadErrorCode";
Tianjie Xu98333a82017-09-22 21:29:29 -070045const char kMetricCheckReaction[] = "UpdateEngine.Check.Reaction";
46const char kMetricCheckResult[] = "UpdateEngine.Check.Result";
Marton Hunyadya0302682018-05-16 18:52:13 +020047const char kMetricCheckTargetVersion[] = "UpdateEngine.Check.TargetVersion";
48const char kMetricCheckRollbackTargetVersion[] =
49 "UpdateEngine.Check.RollbackTargetVersion";
Tianjie Xu98333a82017-09-22 21:29:29 -070050const char kMetricCheckTimeSinceLastCheckMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080051 "UpdateEngine.Check.TimeSinceLastCheckMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070052const char kMetricCheckTimeSinceLastCheckUptimeMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080053 "UpdateEngine.Check.TimeSinceLastCheckUptimeMinutes";
54
55// UpdateEngine.Attempt.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -070056const char kMetricAttemptNumber[] = "UpdateEngine.Attempt.Number";
57const char kMetricAttemptPayloadType[] = "UpdateEngine.Attempt.PayloadType";
58const char kMetricAttemptPayloadSizeMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080059 "UpdateEngine.Attempt.PayloadSizeMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070060const char kMetricAttemptConnectionType[] =
David Zeuthenb281f072014-04-02 10:20:19 -070061 "UpdateEngine.Attempt.ConnectionType";
Tianjie Xu98333a82017-09-22 21:29:29 -070062const char kMetricAttemptDurationMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080063 "UpdateEngine.Attempt.DurationMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070064const char kMetricAttemptDurationUptimeMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080065 "UpdateEngine.Attempt.DurationUptimeMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070066const char kMetricAttemptTimeSinceLastAttemptMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080067 "UpdateEngine.Attempt.TimeSinceLastAttemptMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070068const char kMetricAttemptTimeSinceLastAttemptUptimeMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080069 "UpdateEngine.Attempt.TimeSinceLastAttemptUptimeMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070070const char kMetricAttemptPayloadBytesDownloadedMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080071 "UpdateEngine.Attempt.PayloadBytesDownloadedMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070072const char kMetricAttemptPayloadDownloadSpeedKBps[] =
David Zeuthen33bae492014-02-25 16:16:18 -080073 "UpdateEngine.Attempt.PayloadDownloadSpeedKBps";
Tianjie Xu98333a82017-09-22 21:29:29 -070074const char kMetricAttemptDownloadSource[] =
David Zeuthen33bae492014-02-25 16:16:18 -080075 "UpdateEngine.Attempt.DownloadSource";
Tianjie Xu98333a82017-09-22 21:29:29 -070076const char kMetricAttemptResult[] = "UpdateEngine.Attempt.Result";
77const char kMetricAttemptInternalErrorCode[] =
David Zeuthen33bae492014-02-25 16:16:18 -080078 "UpdateEngine.Attempt.InternalErrorCode";
Tianjie Xu98333a82017-09-22 21:29:29 -070079const char kMetricAttemptDownloadErrorCode[] =
David Zeuthen33bae492014-02-25 16:16:18 -080080 "UpdateEngine.Attempt.DownloadErrorCode";
81
82// UpdateEngine.SuccessfulUpdate.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -070083const char kMetricSuccessfulUpdateAttemptCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -080084 "UpdateEngine.SuccessfulUpdate.AttemptCount";
Tianjie Xu98333a82017-09-22 21:29:29 -070085const char kMetricSuccessfulUpdateBytesDownloadedMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080086 "UpdateEngine.SuccessfulUpdate.BytesDownloadedMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070087const char kMetricSuccessfulUpdateDownloadOverheadPercentage[] =
David Zeuthen33bae492014-02-25 16:16:18 -080088 "UpdateEngine.SuccessfulUpdate.DownloadOverheadPercentage";
Tianjie Xu98333a82017-09-22 21:29:29 -070089const char kMetricSuccessfulUpdateDownloadSourcesUsed[] =
David Zeuthen33bae492014-02-25 16:16:18 -080090 "UpdateEngine.SuccessfulUpdate.DownloadSourcesUsed";
Tianjie Xu98333a82017-09-22 21:29:29 -070091const char kMetricSuccessfulUpdatePayloadType[] =
David Zeuthen33bae492014-02-25 16:16:18 -080092 "UpdateEngine.SuccessfulUpdate.PayloadType";
Tianjie Xu98333a82017-09-22 21:29:29 -070093const char kMetricSuccessfulUpdatePayloadSizeMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080094 "UpdateEngine.SuccessfulUpdate.PayloadSizeMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070095const char kMetricSuccessfulUpdateRebootCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -080096 "UpdateEngine.SuccessfulUpdate.RebootCount";
Tianjie Xu98333a82017-09-22 21:29:29 -070097const char kMetricSuccessfulUpdateTotalDurationMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080098 "UpdateEngine.SuccessfulUpdate.TotalDurationMinutes";
Sen Jiang8712e962018-05-08 12:12:28 -070099const char kMetricSuccessfulUpdateTotalDurationUptimeMinutes[] =
100 "UpdateEngine.SuccessfulUpdate.TotalDurationUptimeMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -0700101const char kMetricSuccessfulUpdateUpdatesAbandonedCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800102 "UpdateEngine.SuccessfulUpdate.UpdatesAbandonedCount";
Tianjie Xu98333a82017-09-22 21:29:29 -0700103const char kMetricSuccessfulUpdateUrlSwitchCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800104 "UpdateEngine.SuccessfulUpdate.UrlSwitchCount";
105
David Zeuthen96197df2014-04-16 12:22:39 -0700106// UpdateEngine.Rollback.* metric.
Tianjie Xu98333a82017-09-22 21:29:29 -0700107const char kMetricRollbackResult[] = "UpdateEngine.Rollback.Result";
David Zeuthen96197df2014-04-16 12:22:39 -0700108
Marton Hunyadya0302682018-05-16 18:52:13 +0200109// UpdateEngine.EnterpriseRollback.* metrics.
110const char kMetricEnterpriseRollbackFailure[] =
111 "UpdateEngine.EnterpriseRollback.Failure";
112const char kMetricEnterpriseRollbackSuccess[] =
113 "UpdateEngine.EnterpriseRollback.Success";
114
Alex Deymoc1c17b42015-11-23 03:53:15 -0300115// UpdateEngine.CertificateCheck.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -0700116const char kMetricCertificateCheckUpdateCheck[] =
Alex Deymoc1c17b42015-11-23 03:53:15 -0300117 "UpdateEngine.CertificateCheck.UpdateCheck";
Tianjie Xu98333a82017-09-22 21:29:29 -0700118const char kMetricCertificateCheckDownload[] =
Alex Deymoc1c17b42015-11-23 03:53:15 -0300119 "UpdateEngine.CertificateCheck.Download";
120
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +0200121// UpdateEngine.KernelKey.* metrics.
122const char kMetricKernelMinVersion[] = "UpdateEngine.KernelKey.MinVersion";
123const char kMetricKernelMaxRollforwardVersion[] =
124 "UpdateEngine.KernelKey.MaxRollforwardVersion";
125const char kMetricKernelMaxRollforwardSetSuccess[] =
126 "UpdateEngine.KernelKey.MaxRollforwardSetSuccess";
127
David Zeuthen33bae492014-02-25 16:16:18 -0800128// UpdateEngine.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -0700129const char kMetricFailedUpdateCount[] = "UpdateEngine.FailedUpdateCount";
130const char kMetricInstallDateProvisioningSource[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800131 "UpdateEngine.InstallDateProvisioningSource";
Tianjie Xu98333a82017-09-22 21:29:29 -0700132const char kMetricTimeToRebootMinutes[] = "UpdateEngine.TimeToRebootMinutes";
133
Tianjie Xud4c5deb2017-10-24 11:17:03 -0700134std::unique_ptr<MetricsReporterInterface> CreateMetricsReporter() {
135 return std::make_unique<MetricsReporterOmaha>();
136}
137
Tianjie Xu98333a82017-09-22 21:29:29 -0700138} // namespace metrics
139
140MetricsReporterOmaha::MetricsReporterOmaha()
141 : metrics_lib_(new MetricsLibrary()) {}
David Zeuthen33bae492014-02-25 16:16:18 -0800142
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700143void MetricsReporterOmaha::Initialize() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700144 metrics_lib_->Init();
David Zeuthen33bae492014-02-25 16:16:18 -0800145}
146
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700147void MetricsReporterOmaha::ReportDailyMetrics(base::TimeDelta os_age) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700148 string metric = metrics::kMetricDailyOSAgeDays;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700149 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(os_age) << " for metric "
150 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700151 metrics_lib_->SendToUMA(metric,
152 static_cast<int>(os_age.InDays()),
153 0, // min: 0 days
154 6 * 30, // max: 6 months (approx)
155 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700156}
157
158void MetricsReporterOmaha::ReportUpdateCheckMetrics(
159 SystemState* system_state,
160 metrics::CheckResult result,
161 metrics::CheckReaction reaction,
162 metrics::DownloadErrorCode download_error_code) {
David Zeuthen33bae492014-02-25 16:16:18 -0800163 string metric;
164 int value;
165 int max_value;
166
167 if (result != metrics::CheckResult::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700168 metric = metrics::kMetricCheckResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800169 value = static_cast<int>(result);
170 max_value = static_cast<int>(metrics::CheckResult::kNumConstants) - 1;
171 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700172 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800173 }
174 if (reaction != metrics::CheckReaction::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700175 metric = metrics::kMetricCheckReaction;
David Zeuthen33bae492014-02-25 16:16:18 -0800176 value = static_cast<int>(reaction);
177 max_value = static_cast<int>(metrics::CheckReaction::kNumConstants) - 1;
178 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700179 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800180 }
181 if (download_error_code != metrics::DownloadErrorCode::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700182 metric = metrics::kMetricCheckDownloadErrorCode;
David Zeuthen33bae492014-02-25 16:16:18 -0800183 value = static_cast<int>(download_error_code);
David Zeuthenc0dd0212014-04-04 14:49:49 -0700184 LOG(INFO) << "Sending " << value << " for metric " << metric << " (sparse)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700185 metrics_lib_->SendSparseToUMA(metric, value);
David Zeuthen33bae492014-02-25 16:16:18 -0800186 }
187
188 base::TimeDelta time_since_last;
Alex Deymoa2591792015-11-17 00:39:40 -0300189 if (metrics_utils::WallclockDurationHelper(
190 system_state,
191 kPrefsMetricsCheckLastReportingTime,
192 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700193 metric = metrics::kMetricCheckTimeSinceLastCheckMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800194 LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
195 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700196 metrics_lib_->SendToUMA(metric,
197 time_since_last.InMinutes(),
198 0, // min: 0 min
199 30 * 24 * 60, // max: 30 days
200 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800201 }
202
203 base::TimeDelta uptime_since_last;
204 static int64_t uptime_since_last_storage = 0;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700205 if (metrics_utils::MonotonicDurationHelper(
206 system_state, &uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700207 metric = metrics::kMetricCheckTimeSinceLastCheckUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800208 LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
209 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700210 metrics_lib_->SendToUMA(metric,
211 uptime_since_last.InMinutes(),
212 0, // min: 0 min
213 30 * 24 * 60, // max: 30 days
214 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800215 }
Marton Hunyadya0302682018-05-16 18:52:13 +0200216
217 // First section of target version specified for the update.
218 if (system_state && system_state->request_params()) {
219 string target_version =
220 system_state->request_params()->target_version_prefix();
221 value = utils::VersionPrefix(target_version);
222 if (value != 0) {
223 metric = metrics::kMetricCheckTargetVersion;
224 LOG(INFO) << "Sending " << value << " for metric " << metric
225 << " (sparse)";
226 metrics_lib_->SendSparseToUMA(metric, value);
227 if (system_state->request_params()->rollback_allowed()) {
228 metric = metrics::kMetricCheckRollbackTargetVersion;
229 LOG(INFO) << "Sending " << value << " for metric " << metric
230 << " (sparse)";
231 metrics_lib_->SendSparseToUMA(metric, value);
232 }
233 }
234 }
David Zeuthen33bae492014-02-25 16:16:18 -0800235}
236
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700237void MetricsReporterOmaha::ReportAbnormallyTerminatedUpdateAttemptMetrics() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700238 string metric = metrics::kMetricAttemptResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700239 metrics::AttemptResult attempt_result =
240 metrics::AttemptResult::kAbnormalTermination;
David Zeuthen4e1d1492014-04-25 13:12:27 -0700241
242 LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700243 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700244 metrics_lib_->SendEnumToUMA(
David Zeuthen4e1d1492014-04-25 13:12:27 -0700245 metric,
246 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700247 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen4e1d1492014-04-25 13:12:27 -0700248}
249
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700250void MetricsReporterOmaha::ReportUpdateAttemptMetrics(
251 SystemState* system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800252 int attempt_number,
253 PayloadType payload_type,
254 base::TimeDelta duration,
255 base::TimeDelta duration_uptime,
256 int64_t payload_size,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700257 metrics::AttemptResult attempt_result,
Tianjie Xu1f93d092017-10-09 12:13:29 -0700258 ErrorCode internal_error_code) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700259 string metric = metrics::kMetricAttemptNumber;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700260 LOG(INFO) << "Uploading " << attempt_number << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700261 metrics_lib_->SendToUMA(metric,
262 attempt_number,
263 0, // min: 0 attempts
264 49, // max: 49 attempts
265 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800266
Tianjie Xu98333a82017-09-22 21:29:29 -0700267 metric = metrics::kMetricAttemptPayloadType;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700268 LOG(INFO) << "Uploading " << utils::ToString(payload_type) << " for metric "
269 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700270 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
David Zeuthen33bae492014-02-25 16:16:18 -0800271
Tianjie Xu98333a82017-09-22 21:29:29 -0700272 metric = metrics::kMetricAttemptDurationMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800273 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700274 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700275 metrics_lib_->SendToUMA(metric,
276 duration.InMinutes(),
277 0, // min: 0 min
278 10 * 24 * 60, // max: 10 days
279 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800280
Tianjie Xu98333a82017-09-22 21:29:29 -0700281 metric = metrics::kMetricAttemptDurationUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800282 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration_uptime)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700283 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700284 metrics_lib_->SendToUMA(metric,
285 duration_uptime.InMinutes(),
286 0, // min: 0 min
287 10 * 24 * 60, // max: 10 days
288 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800289
Tianjie Xu98333a82017-09-22 21:29:29 -0700290 metric = metrics::kMetricAttemptPayloadSizeMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800291 int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700292 LOG(INFO) << "Uploading " << payload_size_mib << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700293 metrics_lib_->SendToUMA(metric,
294 payload_size_mib,
295 0, // min: 0 MiB
296 1024, // max: 1024 MiB = 1 GiB
297 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800298
David Zeuthen33bae492014-02-25 16:16:18 -0800299
David Zeuthen33bae492014-02-25 16:16:18 -0800300
Tianjie Xu98333a82017-09-22 21:29:29 -0700301 metric = metrics::kMetricAttemptResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800302 LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700303 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700304 metrics_lib_->SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800305 metric,
306 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700307 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800308
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700309 if (internal_error_code != ErrorCode::kSuccess) {
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700310 ReportInternalErrorCode(internal_error_code);
David Zeuthen33bae492014-02-25 16:16:18 -0800311 }
312
David Zeuthen33bae492014-02-25 16:16:18 -0800313 base::TimeDelta time_since_last;
Alex Deymoa2591792015-11-17 00:39:40 -0300314 if (metrics_utils::WallclockDurationHelper(
315 system_state,
316 kPrefsMetricsAttemptLastReportingTime,
317 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700318 metric = metrics::kMetricAttemptTimeSinceLastAttemptMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800319 LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
320 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700321 metrics_lib_->SendToUMA(metric,
322 time_since_last.InMinutes(),
323 0, // min: 0 min
324 30 * 24 * 60, // max: 30 days
325 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800326 }
327
328 static int64_t uptime_since_last_storage = 0;
329 base::TimeDelta uptime_since_last;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700330 if (metrics_utils::MonotonicDurationHelper(
331 system_state, &uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700332 metric = metrics::kMetricAttemptTimeSinceLastAttemptUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800333 LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
334 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700335 metrics_lib_->SendToUMA(metric,
336 uptime_since_last.InMinutes(),
337 0, // min: 0 min
338 30 * 24 * 60, // max: 30 days
339 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800340 }
Tianjie Xu1f93d092017-10-09 12:13:29 -0700341}
342
343void MetricsReporterOmaha::ReportUpdateAttemptDownloadMetrics(
344 int64_t payload_bytes_downloaded,
345 int64_t payload_download_speed_bps,
346 DownloadSource download_source,
347 metrics::DownloadErrorCode payload_download_error_code,
348 metrics::ConnectionType connection_type) {
349 string metric = metrics::kMetricAttemptPayloadBytesDownloadedMiB;
350 int64_t payload_bytes_downloaded_mib =
351 payload_bytes_downloaded / kNumBytesInOneMiB;
352 LOG(INFO) << "Uploading " << payload_bytes_downloaded_mib << " for metric "
353 << metric;
354 metrics_lib_->SendToUMA(metric,
355 payload_bytes_downloaded_mib,
356 0, // min: 0 MiB
357 1024, // max: 1024 MiB = 1 GiB
358 50); // num_buckets
359
360 metric = metrics::kMetricAttemptPayloadDownloadSpeedKBps;
361 int64_t payload_download_speed_kbps = payload_download_speed_bps / 1000;
362 LOG(INFO) << "Uploading " << payload_download_speed_kbps << " for metric "
363 << metric;
364 metrics_lib_->SendToUMA(metric,
365 payload_download_speed_kbps,
366 0, // min: 0 kB/s
367 10 * 1000, // max: 10000 kB/s = 10 MB/s
368 50); // num_buckets
369
370 metric = metrics::kMetricAttemptDownloadSource;
371 LOG(INFO) << "Uploading " << download_source << " for metric " << metric;
372 metrics_lib_->SendEnumToUMA(metric, download_source, kNumDownloadSources);
373
374 if (payload_download_error_code != metrics::DownloadErrorCode::kUnset) {
375 metric = metrics::kMetricAttemptDownloadErrorCode;
376 LOG(INFO) << "Uploading " << static_cast<int>(payload_download_error_code)
377 << " for metric " << metric << " (sparse)";
378 metrics_lib_->SendSparseToUMA(
379 metric, static_cast<int>(payload_download_error_code));
380 }
David Zeuthenb281f072014-04-02 10:20:19 -0700381
Tianjie Xu98333a82017-09-22 21:29:29 -0700382 metric = metrics::kMetricAttemptConnectionType;
David Zeuthenb281f072014-04-02 10:20:19 -0700383 LOG(INFO) << "Uploading " << static_cast<int>(connection_type)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700384 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700385 metrics_lib_->SendEnumToUMA(
David Zeuthenb281f072014-04-02 10:20:19 -0700386 metric,
387 static_cast<int>(connection_type),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700388 static_cast<int>(metrics::ConnectionType::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800389}
390
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700391void MetricsReporterOmaha::ReportSuccessfulUpdateMetrics(
392 int attempt_count,
393 int updates_abandoned_count,
394 PayloadType payload_type,
395 int64_t payload_size,
396 int64_t num_bytes_downloaded[kNumDownloadSources],
397 int download_overhead_percentage,
398 base::TimeDelta total_duration,
Sen Jiang8712e962018-05-08 12:12:28 -0700399 base::TimeDelta total_duration_uptime,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700400 int reboot_count,
401 int url_switch_count) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700402 string metric = metrics::kMetricSuccessfulUpdatePayloadSizeMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700403 int64_t mbs = payload_size / kNumBytesInOneMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800404 LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700405 metrics_lib_->SendToUMA(metric,
406 mbs,
407 0, // min: 0 MiB
408 1024, // max: 1024 MiB = 1 GiB
409 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800410
411 int64_t total_bytes = 0;
412 int download_sources_used = 0;
413 for (int i = 0; i < kNumDownloadSources + 1; i++) {
414 DownloadSource source = static_cast<DownloadSource>(i);
415
416 // Only consider this download source (and send byte counts) as
417 // having been used if we downloaded a non-trivial amount of bytes
Alex Vakulenko072359c2014-07-18 11:41:07 -0700418 // (e.g. at least 1 MiB) that contributed to the
David Zeuthen33bae492014-02-25 16:16:18 -0800419 // update. Otherwise we're going to end up with a lot of zero-byte
420 // events in the histogram.
421
Tianjie Xu98333a82017-09-22 21:29:29 -0700422 metric = metrics::kMetricSuccessfulUpdateBytesDownloadedMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800423 if (i < kNumDownloadSources) {
424 metric += utils::ToString(source);
425 mbs = num_bytes_downloaded[i] / kNumBytesInOneMiB;
426 total_bytes += num_bytes_downloaded[i];
427 if (mbs > 0)
428 download_sources_used |= (1 << i);
429 } else {
430 mbs = total_bytes / kNumBytesInOneMiB;
431 }
432
433 if (mbs > 0) {
434 LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700435 metrics_lib_->SendToUMA(metric,
436 mbs,
437 0, // min: 0 MiB
438 1024, // max: 1024 MiB = 1 GiB
439 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800440 }
441 }
442
Tianjie Xu98333a82017-09-22 21:29:29 -0700443 metric = metrics::kMetricSuccessfulUpdateDownloadSourcesUsed;
David Zeuthen33bae492014-02-25 16:16:18 -0800444 LOG(INFO) << "Uploading 0x" << std::hex << download_sources_used
445 << " (bit flags) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700446 metrics_lib_->SendToUMA(metric,
447 download_sources_used,
448 0, // min
449 (1 << kNumDownloadSources) - 1, // max
450 1 << kNumDownloadSources); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800451
Tianjie Xu98333a82017-09-22 21:29:29 -0700452 metric = metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700453 LOG(INFO) << "Uploading " << download_overhead_percentage << "% for metric "
454 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700455 metrics_lib_->SendToUMA(metric,
456 download_overhead_percentage,
457 0, // min: 0% overhead
458 1000, // max: 1000% overhead
459 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800460
Tianjie Xu98333a82017-09-22 21:29:29 -0700461 metric = metrics::kMetricSuccessfulUpdateUrlSwitchCount;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700462 LOG(INFO) << "Uploading " << url_switch_count << " (count) for metric "
463 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700464 metrics_lib_->SendToUMA(metric,
465 url_switch_count,
466 0, // min: 0 URL switches
467 49, // max: 49 URL switches
468 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800469
Tianjie Xu98333a82017-09-22 21:29:29 -0700470 metric = metrics::kMetricSuccessfulUpdateTotalDurationMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800471 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(total_duration)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700472 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700473 metrics_lib_->SendToUMA(metric,
474 static_cast<int>(total_duration.InMinutes()),
475 0, // min: 0 min
476 365 * 24 * 60, // max: 365 days ~= 1 year
477 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800478
Sen Jiang8712e962018-05-08 12:12:28 -0700479 metric = metrics::kMetricSuccessfulUpdateTotalDurationUptimeMinutes;
480 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(total_duration_uptime)
481 << " for metric " << metric;
482 metrics_lib_->SendToUMA(metric,
483 static_cast<int>(total_duration_uptime.InMinutes()),
484 0, // min: 0 min
485 30 * 24 * 60, // max: 30 days
486 50); // num_buckets
487
Tianjie Xu98333a82017-09-22 21:29:29 -0700488 metric = metrics::kMetricSuccessfulUpdateRebootCount;
David Zeuthen33bae492014-02-25 16:16:18 -0800489 LOG(INFO) << "Uploading reboot count of " << reboot_count << " for metric "
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700490 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700491 metrics_lib_->SendToUMA(metric,
492 reboot_count,
493 0, // min: 0 reboots
494 49, // max: 49 reboots
495 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800496
Tianjie Xu98333a82017-09-22 21:29:29 -0700497 metric = metrics::kMetricSuccessfulUpdatePayloadType;
498 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700499 LOG(INFO) << "Uploading " << utils::ToString(payload_type) << " for metric "
500 << metric;
David Zeuthen33bae492014-02-25 16:16:18 -0800501
Tianjie Xu98333a82017-09-22 21:29:29 -0700502 metric = metrics::kMetricSuccessfulUpdateAttemptCount;
503 metrics_lib_->SendToUMA(metric,
504 attempt_count,
505 1, // min: 1 attempt
506 50, // max: 50 attempts
507 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700508 LOG(INFO) << "Uploading " << attempt_count << " for metric " << metric;
David Zeuthen33bae492014-02-25 16:16:18 -0800509
Tianjie Xu98333a82017-09-22 21:29:29 -0700510 metric = metrics::kMetricSuccessfulUpdateUpdatesAbandonedCount;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700511 LOG(INFO) << "Uploading " << updates_abandoned_count << " (count) for metric "
512 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700513 metrics_lib_->SendToUMA(metric,
514 updates_abandoned_count,
515 0, // min: 0 counts
516 49, // max: 49 counts
517 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800518}
519
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700520void MetricsReporterOmaha::ReportRollbackMetrics(
521 metrics::RollbackResult result) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700522 string metric = metrics::kMetricRollbackResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700523 int value = static_cast<int>(result);
David Zeuthen96197df2014-04-16 12:22:39 -0700524 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700525 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700526 metric, value, static_cast<int>(metrics::RollbackResult::kNumConstants));
David Zeuthen96197df2014-04-16 12:22:39 -0700527}
528
Marton Hunyadya0302682018-05-16 18:52:13 +0200529void MetricsReporterOmaha::ReportEnterpriseRollbackMetrics(
530 bool success, const string& rollback_version) {
531 int value = utils::VersionPrefix(rollback_version);
532 string metric = metrics::kMetricEnterpriseRollbackSuccess;
533 if (!success)
534 metric = metrics::kMetricEnterpriseRollbackFailure;
535 LOG(INFO) << "Sending " << value << " for metric " << metric;
536 metrics_lib_->SendSparseToUMA(metric, value);
537}
538
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700539void MetricsReporterOmaha::ReportCertificateCheckMetrics(
540 ServerToCheck server_to_check, CertificateCheckResult result) {
Alex Deymoc1c17b42015-11-23 03:53:15 -0300541 string metric;
542 switch (server_to_check) {
543 case ServerToCheck::kUpdate:
Tianjie Xu98333a82017-09-22 21:29:29 -0700544 metric = metrics::kMetricCertificateCheckUpdateCheck;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300545 break;
546 case ServerToCheck::kDownload:
Tianjie Xu98333a82017-09-22 21:29:29 -0700547 metric = metrics::kMetricCertificateCheckDownload;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300548 break;
Alex Deymo33e91e72015-12-01 18:26:08 -0300549 case ServerToCheck::kNone:
550 return;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300551 }
552 LOG(INFO) << "Uploading " << static_cast<int>(result) << " for metric "
553 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700554 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700555 metric,
556 static_cast<int>(result),
Alex Deymoc1c17b42015-11-23 03:53:15 -0300557 static_cast<int>(CertificateCheckResult::kNumConstants));
558}
559
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700560void MetricsReporterOmaha::ReportFailedUpdateCount(int target_attempt) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700561 string metric = metrics::kMetricFailedUpdateCount;
562 metrics_lib_->SendToUMA(metric,
563 target_attempt,
564 1, // min value
565 50, // max value
566 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700567
568 LOG(INFO) << "Uploading " << target_attempt << " (count) for metric "
569 << metric;
570}
571
572void MetricsReporterOmaha::ReportTimeToReboot(int time_to_reboot_minutes) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700573 string metric = metrics::kMetricTimeToRebootMinutes;
574 metrics_lib_->SendToUMA(metric,
575 time_to_reboot_minutes,
576 0, // min: 0 minute
577 30 * 24 * 60, // max: 1 month (approx)
578 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700579
580 LOG(INFO) << "Uploading " << time_to_reboot_minutes << " for metric "
581 << metric;
582}
583
584void MetricsReporterOmaha::ReportInstallDateProvisioningSource(int source,
585 int max) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700586 metrics_lib_->SendEnumToUMA(metrics::kMetricInstallDateProvisioningSource,
587 source, // Sample.
588 max);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700589}
David Zeuthen33bae492014-02-25 16:16:18 -0800590
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700591void MetricsReporterOmaha::ReportInternalErrorCode(ErrorCode error_code) {
592 auto metric = metrics::kMetricAttemptInternalErrorCode;
593 LOG(INFO) << "Uploading " << error_code << " for metric " << metric;
594 metrics_lib_->SendEnumToUMA(metric,
595 static_cast<int>(error_code),
596 static_cast<int>(ErrorCode::kUmaReportedMax));
597}
598
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +0200599void MetricsReporterOmaha::ReportKeyVersionMetrics(
600 int kernel_min_version,
601 int kernel_max_rollforward_version,
602 bool kernel_max_rollforward_success) {
603 int value = kernel_min_version;
604 string metric = metrics::kMetricKernelMinVersion;
605 LOG(INFO) << "Sending " << value << " for metric " << metric;
606 metrics_lib_->SendSparseToUMA(metric, value);
607
608 value = kernel_max_rollforward_version;
609 metric = metrics::kMetricKernelMaxRollforwardVersion;
610 LOG(INFO) << "Sending " << value << " for metric " << metric;
611 metrics_lib_->SendSparseToUMA(metric, value);
612
613 bool bool_value = kernel_max_rollforward_success;
614 metric = metrics::kMetricKernelMaxRollforwardSetSuccess;
615 LOG(INFO) << "Sending " << bool_value << " for metric " << metric
616 << " (bool)";
617 metrics_lib_->SendBoolToUMA(metric, bool_value);
618}
619
David Zeuthen33bae492014-02-25 16:16:18 -0800620} // namespace chromeos_update_engine