blob: 22c0aa946af9c1db8443393a8b757537793b4331 [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
Amin Hassaniec7bc112020-10-29 16:47:58 -070017#include "update_engine/cros/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/constants.h"
26#include "update_engine/common/prefs_interface.h"
Amin Hassaniec7bc112020-10-29 16:47:58 -070027#include "update_engine/common/system_state.h"
Alex Deymo39910dc2015-11-09 17:04:30 -080028#include "update_engine/common/utils.h"
Amin Hassaniec7bc112020-10-29 16:47:58 -070029#include "update_engine/cros/omaha_request_params.h"
Alex Deymoa2591792015-11-17 00:39:40 -030030#include "update_engine/metrics_utils.h"
David Zeuthen33bae492014-02-25 16:16:18 -080031
Amin Hassaniec7bc112020-10-29 16:47:58 -070032using base::Time;
33using base::TimeDelta;
David Zeuthen33bae492014-02-25 16:16:18 -080034using std::string;
35
36namespace chromeos_update_engine {
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";
May Lippert60aa3ca2018-08-15 16:55:29 -070091const char kMetricSuccessfulUpdateDurationFromSeenDays[] =
92 "UpdateEngine.SuccessfulUpdate.DurationFromSeenDays.NoTimeRestriction";
93const char kMetricSuccessfulUpdateDurationFromSeenTimeRestrictedDays[] =
94 "UpdateEngine.SuccessfulUpdate.DurationFromSeenDays.TimeRestricted";
Tianjie Xu98333a82017-09-22 21:29:29 -070095const char kMetricSuccessfulUpdatePayloadType[] =
David Zeuthen33bae492014-02-25 16:16:18 -080096 "UpdateEngine.SuccessfulUpdate.PayloadType";
Tianjie Xu98333a82017-09-22 21:29:29 -070097const char kMetricSuccessfulUpdatePayloadSizeMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080098 "UpdateEngine.SuccessfulUpdate.PayloadSizeMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070099const char kMetricSuccessfulUpdateRebootCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800100 "UpdateEngine.SuccessfulUpdate.RebootCount";
Tianjie Xu98333a82017-09-22 21:29:29 -0700101const char kMetricSuccessfulUpdateTotalDurationMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800102 "UpdateEngine.SuccessfulUpdate.TotalDurationMinutes";
Sen Jiang8712e962018-05-08 12:12:28 -0700103const char kMetricSuccessfulUpdateTotalDurationUptimeMinutes[] =
104 "UpdateEngine.SuccessfulUpdate.TotalDurationUptimeMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -0700105const char kMetricSuccessfulUpdateUpdatesAbandonedCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800106 "UpdateEngine.SuccessfulUpdate.UpdatesAbandonedCount";
Tianjie Xu98333a82017-09-22 21:29:29 -0700107const char kMetricSuccessfulUpdateUrlSwitchCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800108 "UpdateEngine.SuccessfulUpdate.UrlSwitchCount";
109
David Zeuthen96197df2014-04-16 12:22:39 -0700110// UpdateEngine.Rollback.* metric.
Tianjie Xu98333a82017-09-22 21:29:29 -0700111const char kMetricRollbackResult[] = "UpdateEngine.Rollback.Result";
David Zeuthen96197df2014-04-16 12:22:39 -0700112
Marton Hunyadya0302682018-05-16 18:52:13 +0200113// UpdateEngine.EnterpriseRollback.* metrics.
114const char kMetricEnterpriseRollbackFailure[] =
115 "UpdateEngine.EnterpriseRollback.Failure";
116const char kMetricEnterpriseRollbackSuccess[] =
117 "UpdateEngine.EnterpriseRollback.Success";
118
Alex Deymoc1c17b42015-11-23 03:53:15 -0300119// UpdateEngine.CertificateCheck.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -0700120const char kMetricCertificateCheckUpdateCheck[] =
Alex Deymoc1c17b42015-11-23 03:53:15 -0300121 "UpdateEngine.CertificateCheck.UpdateCheck";
Tianjie Xu98333a82017-09-22 21:29:29 -0700122const char kMetricCertificateCheckDownload[] =
Alex Deymoc1c17b42015-11-23 03:53:15 -0300123 "UpdateEngine.CertificateCheck.Download";
124
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +0200125// UpdateEngine.KernelKey.* metrics.
126const char kMetricKernelMinVersion[] = "UpdateEngine.KernelKey.MinVersion";
127const char kMetricKernelMaxRollforwardVersion[] =
128 "UpdateEngine.KernelKey.MaxRollforwardVersion";
129const char kMetricKernelMaxRollforwardSetSuccess[] =
130 "UpdateEngine.KernelKey.MaxRollforwardSetSuccess";
131
David Zeuthen33bae492014-02-25 16:16:18 -0800132// UpdateEngine.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -0700133const char kMetricFailedUpdateCount[] = "UpdateEngine.FailedUpdateCount";
134const char kMetricInstallDateProvisioningSource[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800135 "UpdateEngine.InstallDateProvisioningSource";
Tianjie Xu98333a82017-09-22 21:29:29 -0700136const char kMetricTimeToRebootMinutes[] = "UpdateEngine.TimeToRebootMinutes";
137
Tianjie Xud4c5deb2017-10-24 11:17:03 -0700138std::unique_ptr<MetricsReporterInterface> CreateMetricsReporter() {
139 return std::make_unique<MetricsReporterOmaha>();
140}
141
Tianjie Xu98333a82017-09-22 21:29:29 -0700142} // namespace metrics
143
144MetricsReporterOmaha::MetricsReporterOmaha()
145 : metrics_lib_(new MetricsLibrary()) {}
David Zeuthen33bae492014-02-25 16:16:18 -0800146
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 Xu98333a82017-09-22 21:29:29 -0700149 metrics_lib_->SendToUMA(metric,
150 static_cast<int>(os_age.InDays()),
151 0, // min: 0 days
152 6 * 30, // max: 6 months (approx)
153 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700154}
155
156void MetricsReporterOmaha::ReportUpdateCheckMetrics(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700157 metrics::CheckResult result,
158 metrics::CheckReaction reaction,
159 metrics::DownloadErrorCode download_error_code) {
David Zeuthen33bae492014-02-25 16:16:18 -0800160 string metric;
161 int value;
162 int max_value;
163
164 if (result != metrics::CheckResult::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700165 metric = metrics::kMetricCheckResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800166 value = static_cast<int>(result);
167 max_value = static_cast<int>(metrics::CheckResult::kNumConstants) - 1;
Tianjie Xu98333a82017-09-22 21:29:29 -0700168 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800169 }
170 if (reaction != metrics::CheckReaction::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700171 metric = metrics::kMetricCheckReaction;
David Zeuthen33bae492014-02-25 16:16:18 -0800172 value = static_cast<int>(reaction);
173 max_value = static_cast<int>(metrics::CheckReaction::kNumConstants) - 1;
Tianjie Xu98333a82017-09-22 21:29:29 -0700174 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800175 }
176 if (download_error_code != metrics::DownloadErrorCode::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700177 metric = metrics::kMetricCheckDownloadErrorCode;
David Zeuthen33bae492014-02-25 16:16:18 -0800178 value = static_cast<int>(download_error_code);
Tianjie Xu98333a82017-09-22 21:29:29 -0700179 metrics_lib_->SendSparseToUMA(metric, value);
David Zeuthen33bae492014-02-25 16:16:18 -0800180 }
181
182 base::TimeDelta time_since_last;
Amin Hassani538bd592020-11-04 20:46:08 -0800183 if (WallclockDurationHelper(kPrefsMetricsCheckLastReportingTime,
Amin Hassaniec7bc112020-10-29 16:47:58 -0700184 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700185 metric = metrics::kMetricCheckTimeSinceLastCheckMinutes;
Tianjie Xu98333a82017-09-22 21:29:29 -0700186 metrics_lib_->SendToUMA(metric,
187 time_since_last.InMinutes(),
188 0, // min: 0 min
189 30 * 24 * 60, // max: 30 days
190 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800191 }
192
193 base::TimeDelta uptime_since_last;
194 static int64_t uptime_since_last_storage = 0;
Amin Hassani538bd592020-11-04 20:46:08 -0800195 if (MonotonicDurationHelper(&uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700196 metric = metrics::kMetricCheckTimeSinceLastCheckUptimeMinutes;
Tianjie Xu98333a82017-09-22 21:29:29 -0700197 metrics_lib_->SendToUMA(metric,
198 uptime_since_last.InMinutes(),
199 0, // min: 0 min
200 30 * 24 * 60, // max: 30 days
201 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800202 }
Marton Hunyadya0302682018-05-16 18:52:13 +0200203
204 // First section of target version specified for the update.
Amin Hassani538bd592020-11-04 20:46:08 -0800205 if (SystemState::Get()->request_params()) {
Marton Hunyadya0302682018-05-16 18:52:13 +0200206 string target_version =
Amin Hassani538bd592020-11-04 20:46:08 -0800207 SystemState::Get()->request_params()->target_version_prefix();
Marton Hunyadya0302682018-05-16 18:52:13 +0200208 value = utils::VersionPrefix(target_version);
209 if (value != 0) {
210 metric = metrics::kMetricCheckTargetVersion;
Marton Hunyadya0302682018-05-16 18:52:13 +0200211 metrics_lib_->SendSparseToUMA(metric, value);
Amin Hassani538bd592020-11-04 20:46:08 -0800212 if (SystemState::Get()->request_params()->rollback_allowed()) {
Marton Hunyadya0302682018-05-16 18:52:13 +0200213 metric = metrics::kMetricCheckRollbackTargetVersion;
Marton Hunyadya0302682018-05-16 18:52:13 +0200214 metrics_lib_->SendSparseToUMA(metric, value);
215 }
216 }
217 }
David Zeuthen33bae492014-02-25 16:16:18 -0800218}
219
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700220void MetricsReporterOmaha::ReportAbnormallyTerminatedUpdateAttemptMetrics() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700221 string metric = metrics::kMetricAttemptResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700222 metrics::AttemptResult attempt_result =
223 metrics::AttemptResult::kAbnormalTermination;
David Zeuthen4e1d1492014-04-25 13:12:27 -0700224
Tianjie Xu98333a82017-09-22 21:29:29 -0700225 metrics_lib_->SendEnumToUMA(
David Zeuthen4e1d1492014-04-25 13:12:27 -0700226 metric,
227 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700228 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen4e1d1492014-04-25 13:12:27 -0700229}
230
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700231void MetricsReporterOmaha::ReportUpdateAttemptMetrics(
David Zeuthen33bae492014-02-25 16:16:18 -0800232 int attempt_number,
233 PayloadType payload_type,
234 base::TimeDelta duration,
235 base::TimeDelta duration_uptime,
236 int64_t payload_size,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700237 metrics::AttemptResult attempt_result,
Tianjie Xu1f93d092017-10-09 12:13:29 -0700238 ErrorCode internal_error_code) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700239 string metric = metrics::kMetricAttemptNumber;
Tianjie Xu98333a82017-09-22 21:29:29 -0700240 metrics_lib_->SendToUMA(metric,
241 attempt_number,
242 0, // min: 0 attempts
243 49, // max: 49 attempts
244 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800245
Tianjie Xu98333a82017-09-22 21:29:29 -0700246 metric = metrics::kMetricAttemptPayloadType;
Tianjie Xu98333a82017-09-22 21:29:29 -0700247 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
David Zeuthen33bae492014-02-25 16:16:18 -0800248
Tianjie Xu98333a82017-09-22 21:29:29 -0700249 metric = metrics::kMetricAttemptDurationMinutes;
Tianjie Xu98333a82017-09-22 21:29:29 -0700250 metrics_lib_->SendToUMA(metric,
251 duration.InMinutes(),
252 0, // min: 0 min
253 10 * 24 * 60, // max: 10 days
254 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800255
Tianjie Xu98333a82017-09-22 21:29:29 -0700256 metric = metrics::kMetricAttemptDurationUptimeMinutes;
Tianjie Xu98333a82017-09-22 21:29:29 -0700257 metrics_lib_->SendToUMA(metric,
258 duration_uptime.InMinutes(),
259 0, // min: 0 min
260 10 * 24 * 60, // max: 10 days
261 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800262
Tianjie Xu98333a82017-09-22 21:29:29 -0700263 metric = metrics::kMetricAttemptPayloadSizeMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800264 int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
Tianjie Xu98333a82017-09-22 21:29:29 -0700265 metrics_lib_->SendToUMA(metric,
266 payload_size_mib,
267 0, // min: 0 MiB
268 1024, // max: 1024 MiB = 1 GiB
269 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800270
Tianjie Xu98333a82017-09-22 21:29:29 -0700271 metric = metrics::kMetricAttemptResult;
Tianjie Xu98333a82017-09-22 21:29:29 -0700272 metrics_lib_->SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800273 metric,
274 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700275 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800276
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700277 if (internal_error_code != ErrorCode::kSuccess) {
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700278 ReportInternalErrorCode(internal_error_code);
David Zeuthen33bae492014-02-25 16:16:18 -0800279 }
280
David Zeuthen33bae492014-02-25 16:16:18 -0800281 base::TimeDelta time_since_last;
Amin Hassani538bd592020-11-04 20:46:08 -0800282 if (WallclockDurationHelper(kPrefsMetricsAttemptLastReportingTime,
Amin Hassaniec7bc112020-10-29 16:47:58 -0700283 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700284 metric = metrics::kMetricAttemptTimeSinceLastAttemptMinutes;
Tianjie Xu98333a82017-09-22 21:29:29 -0700285 metrics_lib_->SendToUMA(metric,
286 time_since_last.InMinutes(),
287 0, // min: 0 min
288 30 * 24 * 60, // max: 30 days
289 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800290 }
291
292 static int64_t uptime_since_last_storage = 0;
293 base::TimeDelta uptime_since_last;
Amin Hassani538bd592020-11-04 20:46:08 -0800294 if (MonotonicDurationHelper(&uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700295 metric = metrics::kMetricAttemptTimeSinceLastAttemptUptimeMinutes;
Tianjie Xu98333a82017-09-22 21:29:29 -0700296 metrics_lib_->SendToUMA(metric,
297 uptime_since_last.InMinutes(),
298 0, // min: 0 min
299 30 * 24 * 60, // max: 30 days
300 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800301 }
Tianjie Xu1f93d092017-10-09 12:13:29 -0700302}
303
304void MetricsReporterOmaha::ReportUpdateAttemptDownloadMetrics(
305 int64_t payload_bytes_downloaded,
306 int64_t payload_download_speed_bps,
307 DownloadSource download_source,
308 metrics::DownloadErrorCode payload_download_error_code,
309 metrics::ConnectionType connection_type) {
310 string metric = metrics::kMetricAttemptPayloadBytesDownloadedMiB;
311 int64_t payload_bytes_downloaded_mib =
312 payload_bytes_downloaded / kNumBytesInOneMiB;
Tianjie Xu1f93d092017-10-09 12:13:29 -0700313 metrics_lib_->SendToUMA(metric,
314 payload_bytes_downloaded_mib,
315 0, // min: 0 MiB
316 1024, // max: 1024 MiB = 1 GiB
317 50); // num_buckets
318
319 metric = metrics::kMetricAttemptPayloadDownloadSpeedKBps;
320 int64_t payload_download_speed_kbps = payload_download_speed_bps / 1000;
Tianjie Xu1f93d092017-10-09 12:13:29 -0700321 metrics_lib_->SendToUMA(metric,
322 payload_download_speed_kbps,
323 0, // min: 0 kB/s
324 10 * 1000, // max: 10000 kB/s = 10 MB/s
325 50); // num_buckets
326
327 metric = metrics::kMetricAttemptDownloadSource;
Tianjie Xu1f93d092017-10-09 12:13:29 -0700328 metrics_lib_->SendEnumToUMA(metric, download_source, kNumDownloadSources);
329
330 if (payload_download_error_code != metrics::DownloadErrorCode::kUnset) {
331 metric = metrics::kMetricAttemptDownloadErrorCode;
Tianjie Xu1f93d092017-10-09 12:13:29 -0700332 metrics_lib_->SendSparseToUMA(
333 metric, static_cast<int>(payload_download_error_code));
334 }
David Zeuthenb281f072014-04-02 10:20:19 -0700335
Tianjie Xu98333a82017-09-22 21:29:29 -0700336 metric = metrics::kMetricAttemptConnectionType;
Tianjie Xu98333a82017-09-22 21:29:29 -0700337 metrics_lib_->SendEnumToUMA(
David Zeuthenb281f072014-04-02 10:20:19 -0700338 metric,
339 static_cast<int>(connection_type),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700340 static_cast<int>(metrics::ConnectionType::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800341}
342
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700343void MetricsReporterOmaha::ReportSuccessfulUpdateMetrics(
344 int attempt_count,
345 int updates_abandoned_count,
346 PayloadType payload_type,
347 int64_t payload_size,
348 int64_t num_bytes_downloaded[kNumDownloadSources],
349 int download_overhead_percentage,
350 base::TimeDelta total_duration,
Sen Jiang8712e962018-05-08 12:12:28 -0700351 base::TimeDelta total_duration_uptime,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700352 int reboot_count,
353 int url_switch_count) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700354 string metric = metrics::kMetricSuccessfulUpdatePayloadSizeMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700355 int64_t mbs = payload_size / kNumBytesInOneMiB;
Tianjie Xu98333a82017-09-22 21:29:29 -0700356 metrics_lib_->SendToUMA(metric,
357 mbs,
358 0, // min: 0 MiB
359 1024, // max: 1024 MiB = 1 GiB
360 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800361
362 int64_t total_bytes = 0;
363 int download_sources_used = 0;
364 for (int i = 0; i < kNumDownloadSources + 1; i++) {
365 DownloadSource source = static_cast<DownloadSource>(i);
366
367 // Only consider this download source (and send byte counts) as
368 // having been used if we downloaded a non-trivial amount of bytes
Alex Vakulenko072359c2014-07-18 11:41:07 -0700369 // (e.g. at least 1 MiB) that contributed to the
David Zeuthen33bae492014-02-25 16:16:18 -0800370 // update. Otherwise we're going to end up with a lot of zero-byte
371 // events in the histogram.
372
Tianjie Xu98333a82017-09-22 21:29:29 -0700373 metric = metrics::kMetricSuccessfulUpdateBytesDownloadedMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800374 if (i < kNumDownloadSources) {
375 metric += utils::ToString(source);
376 mbs = num_bytes_downloaded[i] / kNumBytesInOneMiB;
377 total_bytes += num_bytes_downloaded[i];
378 if (mbs > 0)
379 download_sources_used |= (1 << i);
380 } else {
381 mbs = total_bytes / kNumBytesInOneMiB;
382 }
383
384 if (mbs > 0) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700385 metrics_lib_->SendToUMA(metric,
386 mbs,
387 0, // min: 0 MiB
388 1024, // max: 1024 MiB = 1 GiB
389 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800390 }
391 }
392
Tianjie Xu98333a82017-09-22 21:29:29 -0700393 metric = metrics::kMetricSuccessfulUpdateDownloadSourcesUsed;
Tianjie Xu98333a82017-09-22 21:29:29 -0700394 metrics_lib_->SendToUMA(metric,
395 download_sources_used,
396 0, // min
397 (1 << kNumDownloadSources) - 1, // max
398 1 << kNumDownloadSources); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800399
Tianjie Xu98333a82017-09-22 21:29:29 -0700400 metric = metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage;
Tianjie Xu98333a82017-09-22 21:29:29 -0700401 metrics_lib_->SendToUMA(metric,
402 download_overhead_percentage,
403 0, // min: 0% overhead
404 1000, // max: 1000% overhead
405 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800406
Tianjie Xu98333a82017-09-22 21:29:29 -0700407 metric = metrics::kMetricSuccessfulUpdateUrlSwitchCount;
Tianjie Xu98333a82017-09-22 21:29:29 -0700408 metrics_lib_->SendToUMA(metric,
409 url_switch_count,
410 0, // min: 0 URL switches
411 49, // max: 49 URL switches
412 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800413
Tianjie Xu98333a82017-09-22 21:29:29 -0700414 metric = metrics::kMetricSuccessfulUpdateTotalDurationMinutes;
Tianjie Xu98333a82017-09-22 21:29:29 -0700415 metrics_lib_->SendToUMA(metric,
416 static_cast<int>(total_duration.InMinutes()),
417 0, // min: 0 min
418 365 * 24 * 60, // max: 365 days ~= 1 year
419 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800420
Sen Jiang8712e962018-05-08 12:12:28 -0700421 metric = metrics::kMetricSuccessfulUpdateTotalDurationUptimeMinutes;
Sen Jiang8712e962018-05-08 12:12:28 -0700422 metrics_lib_->SendToUMA(metric,
423 static_cast<int>(total_duration_uptime.InMinutes()),
424 0, // min: 0 min
425 30 * 24 * 60, // max: 30 days
426 50); // num_buckets
427
Tianjie Xu98333a82017-09-22 21:29:29 -0700428 metric = metrics::kMetricSuccessfulUpdateRebootCount;
Tianjie Xu98333a82017-09-22 21:29:29 -0700429 metrics_lib_->SendToUMA(metric,
430 reboot_count,
431 0, // min: 0 reboots
432 49, // max: 49 reboots
433 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800434
Tianjie Xu98333a82017-09-22 21:29:29 -0700435 metric = metrics::kMetricSuccessfulUpdatePayloadType;
436 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
David Zeuthen33bae492014-02-25 16:16:18 -0800437
Tianjie Xu98333a82017-09-22 21:29:29 -0700438 metric = metrics::kMetricSuccessfulUpdateAttemptCount;
439 metrics_lib_->SendToUMA(metric,
440 attempt_count,
441 1, // min: 1 attempt
442 50, // max: 50 attempts
443 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800444
Tianjie Xu98333a82017-09-22 21:29:29 -0700445 metric = metrics::kMetricSuccessfulUpdateUpdatesAbandonedCount;
Tianjie Xu98333a82017-09-22 21:29:29 -0700446 metrics_lib_->SendToUMA(metric,
447 updates_abandoned_count,
448 0, // min: 0 counts
449 49, // max: 49 counts
450 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800451}
452
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700453void MetricsReporterOmaha::ReportRollbackMetrics(
454 metrics::RollbackResult result) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700455 string metric = metrics::kMetricRollbackResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700456 int value = static_cast<int>(result);
Tianjie Xu98333a82017-09-22 21:29:29 -0700457 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700458 metric, value, static_cast<int>(metrics::RollbackResult::kNumConstants));
David Zeuthen96197df2014-04-16 12:22:39 -0700459}
460
Marton Hunyadya0302682018-05-16 18:52:13 +0200461void MetricsReporterOmaha::ReportEnterpriseRollbackMetrics(
462 bool success, const string& rollback_version) {
463 int value = utils::VersionPrefix(rollback_version);
464 string metric = metrics::kMetricEnterpriseRollbackSuccess;
465 if (!success)
466 metric = metrics::kMetricEnterpriseRollbackFailure;
Marton Hunyadya0302682018-05-16 18:52:13 +0200467 metrics_lib_->SendSparseToUMA(metric, value);
468}
469
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700470void MetricsReporterOmaha::ReportCertificateCheckMetrics(
471 ServerToCheck server_to_check, CertificateCheckResult result) {
Alex Deymoc1c17b42015-11-23 03:53:15 -0300472 string metric;
473 switch (server_to_check) {
474 case ServerToCheck::kUpdate:
Tianjie Xu98333a82017-09-22 21:29:29 -0700475 metric = metrics::kMetricCertificateCheckUpdateCheck;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300476 break;
477 case ServerToCheck::kDownload:
Tianjie Xu98333a82017-09-22 21:29:29 -0700478 metric = metrics::kMetricCertificateCheckDownload;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300479 break;
Alex Deymo33e91e72015-12-01 18:26:08 -0300480 case ServerToCheck::kNone:
481 return;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300482 }
Tianjie Xu98333a82017-09-22 21:29:29 -0700483 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700484 metric,
485 static_cast<int>(result),
Alex Deymoc1c17b42015-11-23 03:53:15 -0300486 static_cast<int>(CertificateCheckResult::kNumConstants));
487}
488
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700489void MetricsReporterOmaha::ReportFailedUpdateCount(int target_attempt) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700490 string metric = metrics::kMetricFailedUpdateCount;
491 metrics_lib_->SendToUMA(metric,
492 target_attempt,
493 1, // min value
494 50, // max value
495 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700496}
497
498void MetricsReporterOmaha::ReportTimeToReboot(int time_to_reboot_minutes) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700499 string metric = metrics::kMetricTimeToRebootMinutes;
500 metrics_lib_->SendToUMA(metric,
501 time_to_reboot_minutes,
502 0, // min: 0 minute
503 30 * 24 * 60, // max: 1 month (approx)
504 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700505}
506
507void MetricsReporterOmaha::ReportInstallDateProvisioningSource(int source,
508 int max) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700509 metrics_lib_->SendEnumToUMA(metrics::kMetricInstallDateProvisioningSource,
510 source, // Sample.
511 max);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700512}
David Zeuthen33bae492014-02-25 16:16:18 -0800513
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700514void MetricsReporterOmaha::ReportInternalErrorCode(ErrorCode error_code) {
515 auto metric = metrics::kMetricAttemptInternalErrorCode;
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700516 metrics_lib_->SendEnumToUMA(metric,
517 static_cast<int>(error_code),
518 static_cast<int>(ErrorCode::kUmaReportedMax));
519}
520
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +0200521void MetricsReporterOmaha::ReportKeyVersionMetrics(
522 int kernel_min_version,
523 int kernel_max_rollforward_version,
524 bool kernel_max_rollforward_success) {
525 int value = kernel_min_version;
526 string metric = metrics::kMetricKernelMinVersion;
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +0200527 metrics_lib_->SendSparseToUMA(metric, value);
528
529 value = kernel_max_rollforward_version;
530 metric = metrics::kMetricKernelMaxRollforwardVersion;
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +0200531 metrics_lib_->SendSparseToUMA(metric, value);
532
533 bool bool_value = kernel_max_rollforward_success;
534 metric = metrics::kMetricKernelMaxRollforwardSetSuccess;
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +0200535 metrics_lib_->SendBoolToUMA(metric, bool_value);
536}
537
May Lippert60aa3ca2018-08-15 16:55:29 -0700538void MetricsReporterOmaha::ReportEnterpriseUpdateSeenToDownloadDays(
539 bool has_time_restriction_policy, int time_to_update_days) {
540 string metric =
541 has_time_restriction_policy
542 ? metrics::kMetricSuccessfulUpdateDurationFromSeenTimeRestrictedDays
543 : metrics::kMetricSuccessfulUpdateDurationFromSeenDays;
May Lippert60aa3ca2018-08-15 16:55:29 -0700544
545 metrics_lib_->SendToUMA(metric,
546 time_to_update_days,
547 1, // min: 1 days
548 6 * 30, // max: 6 months (approx)
549 50); // num_buckets
550}
551
Amin Hassaniec7bc112020-10-29 16:47:58 -0700552bool MetricsReporterOmaha::WallclockDurationHelper(
Amin Hassaniec7bc112020-10-29 16:47:58 -0700553 const std::string& state_variable_key,
554 TimeDelta* out_duration) {
555 bool ret = false;
Amin Hassani538bd592020-11-04 20:46:08 -0800556 Time now = SystemState::Get()->clock()->GetWallclockTime();
Amin Hassaniec7bc112020-10-29 16:47:58 -0700557 int64_t stored_value;
Amin Hassani538bd592020-11-04 20:46:08 -0800558 if (SystemState::Get()->prefs()->GetInt64(state_variable_key,
559 &stored_value)) {
Amin Hassaniec7bc112020-10-29 16:47:58 -0700560 Time stored_time = Time::FromInternalValue(stored_value);
561 if (stored_time > now) {
562 LOG(ERROR) << "Stored time-stamp used for " << state_variable_key
563 << " is in the future.";
564 } else {
565 *out_duration = now - stored_time;
566 ret = true;
567 }
568 }
569
Amin Hassani538bd592020-11-04 20:46:08 -0800570 if (!SystemState::Get()->prefs()->SetInt64(state_variable_key,
571 now.ToInternalValue())) {
Amin Hassaniec7bc112020-10-29 16:47:58 -0700572 LOG(ERROR) << "Error storing time-stamp in " << state_variable_key;
573 }
574
575 return ret;
576}
577
Amin Hassani538bd592020-11-04 20:46:08 -0800578bool MetricsReporterOmaha::MonotonicDurationHelper(int64_t* storage,
Amin Hassaniec7bc112020-10-29 16:47:58 -0700579 TimeDelta* out_duration) {
580 bool ret = false;
Amin Hassani538bd592020-11-04 20:46:08 -0800581 Time now = SystemState::Get()->clock()->GetMonotonicTime();
Amin Hassaniec7bc112020-10-29 16:47:58 -0700582 if (*storage != 0) {
583 Time stored_time = Time::FromInternalValue(*storage);
584 *out_duration = now - stored_time;
585 ret = true;
586 }
587 *storage = now.ToInternalValue();
588
589 return ret;
590}
591
David Zeuthen33bae492014-02-25 16:16:18 -0800592} // namespace chromeos_update_engine