blob: 3ae4f4b9f46fefeb6b73e159bb7a8eda62b80f8d [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";
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::Initialize() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700148 metrics_lib_->Init();
David Zeuthen33bae492014-02-25 16:16:18 -0800149}
150
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700151void MetricsReporterOmaha::ReportDailyMetrics(base::TimeDelta os_age) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700152 string metric = metrics::kMetricDailyOSAgeDays;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700153 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(os_age) << " for metric "
154 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700155 metrics_lib_->SendToUMA(metric,
156 static_cast<int>(os_age.InDays()),
157 0, // min: 0 days
158 6 * 30, // max: 6 months (approx)
159 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700160}
161
162void MetricsReporterOmaha::ReportUpdateCheckMetrics(
163 SystemState* system_state,
164 metrics::CheckResult result,
165 metrics::CheckReaction reaction,
166 metrics::DownloadErrorCode download_error_code) {
David Zeuthen33bae492014-02-25 16:16:18 -0800167 string metric;
168 int value;
169 int max_value;
170
171 if (result != metrics::CheckResult::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700172 metric = metrics::kMetricCheckResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800173 value = static_cast<int>(result);
174 max_value = static_cast<int>(metrics::CheckResult::kNumConstants) - 1;
175 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700176 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800177 }
178 if (reaction != metrics::CheckReaction::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700179 metric = metrics::kMetricCheckReaction;
David Zeuthen33bae492014-02-25 16:16:18 -0800180 value = static_cast<int>(reaction);
181 max_value = static_cast<int>(metrics::CheckReaction::kNumConstants) - 1;
182 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700183 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800184 }
185 if (download_error_code != metrics::DownloadErrorCode::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700186 metric = metrics::kMetricCheckDownloadErrorCode;
David Zeuthen33bae492014-02-25 16:16:18 -0800187 value = static_cast<int>(download_error_code);
David Zeuthenc0dd0212014-04-04 14:49:49 -0700188 LOG(INFO) << "Sending " << value << " for metric " << metric << " (sparse)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700189 metrics_lib_->SendSparseToUMA(metric, value);
David Zeuthen33bae492014-02-25 16:16:18 -0800190 }
191
192 base::TimeDelta time_since_last;
Alex Deymoa2591792015-11-17 00:39:40 -0300193 if (metrics_utils::WallclockDurationHelper(
194 system_state,
195 kPrefsMetricsCheckLastReportingTime,
196 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700197 metric = metrics::kMetricCheckTimeSinceLastCheckMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800198 LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
199 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700200 metrics_lib_->SendToUMA(metric,
201 time_since_last.InMinutes(),
202 0, // min: 0 min
203 30 * 24 * 60, // max: 30 days
204 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800205 }
206
207 base::TimeDelta uptime_since_last;
208 static int64_t uptime_since_last_storage = 0;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700209 if (metrics_utils::MonotonicDurationHelper(
210 system_state, &uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700211 metric = metrics::kMetricCheckTimeSinceLastCheckUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800212 LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
213 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700214 metrics_lib_->SendToUMA(metric,
215 uptime_since_last.InMinutes(),
216 0, // min: 0 min
217 30 * 24 * 60, // max: 30 days
218 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800219 }
Marton Hunyadya0302682018-05-16 18:52:13 +0200220
221 // First section of target version specified for the update.
222 if (system_state && system_state->request_params()) {
223 string target_version =
224 system_state->request_params()->target_version_prefix();
225 value = utils::VersionPrefix(target_version);
226 if (value != 0) {
227 metric = metrics::kMetricCheckTargetVersion;
228 LOG(INFO) << "Sending " << value << " for metric " << metric
229 << " (sparse)";
230 metrics_lib_->SendSparseToUMA(metric, value);
231 if (system_state->request_params()->rollback_allowed()) {
232 metric = metrics::kMetricCheckRollbackTargetVersion;
233 LOG(INFO) << "Sending " << value << " for metric " << metric
234 << " (sparse)";
235 metrics_lib_->SendSparseToUMA(metric, value);
236 }
237 }
238 }
David Zeuthen33bae492014-02-25 16:16:18 -0800239}
240
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700241void MetricsReporterOmaha::ReportAbnormallyTerminatedUpdateAttemptMetrics() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700242 string metric = metrics::kMetricAttemptResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700243 metrics::AttemptResult attempt_result =
244 metrics::AttemptResult::kAbnormalTermination;
David Zeuthen4e1d1492014-04-25 13:12:27 -0700245
246 LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700247 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700248 metrics_lib_->SendEnumToUMA(
David Zeuthen4e1d1492014-04-25 13:12:27 -0700249 metric,
250 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700251 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen4e1d1492014-04-25 13:12:27 -0700252}
253
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700254void MetricsReporterOmaha::ReportUpdateAttemptMetrics(
255 SystemState* system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800256 int attempt_number,
257 PayloadType payload_type,
258 base::TimeDelta duration,
259 base::TimeDelta duration_uptime,
260 int64_t payload_size,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700261 metrics::AttemptResult attempt_result,
Tianjie Xu1f93d092017-10-09 12:13:29 -0700262 ErrorCode internal_error_code) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700263 string metric = metrics::kMetricAttemptNumber;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700264 LOG(INFO) << "Uploading " << attempt_number << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700265 metrics_lib_->SendToUMA(metric,
266 attempt_number,
267 0, // min: 0 attempts
268 49, // max: 49 attempts
269 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800270
Tianjie Xu98333a82017-09-22 21:29:29 -0700271 metric = metrics::kMetricAttemptPayloadType;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700272 LOG(INFO) << "Uploading " << utils::ToString(payload_type) << " for metric "
273 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700274 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
David Zeuthen33bae492014-02-25 16:16:18 -0800275
Tianjie Xu98333a82017-09-22 21:29:29 -0700276 metric = metrics::kMetricAttemptDurationMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800277 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700278 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700279 metrics_lib_->SendToUMA(metric,
280 duration.InMinutes(),
281 0, // min: 0 min
282 10 * 24 * 60, // max: 10 days
283 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800284
Tianjie Xu98333a82017-09-22 21:29:29 -0700285 metric = metrics::kMetricAttemptDurationUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800286 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration_uptime)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700287 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700288 metrics_lib_->SendToUMA(metric,
289 duration_uptime.InMinutes(),
290 0, // min: 0 min
291 10 * 24 * 60, // max: 10 days
292 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800293
Tianjie Xu98333a82017-09-22 21:29:29 -0700294 metric = metrics::kMetricAttemptPayloadSizeMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800295 int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700296 LOG(INFO) << "Uploading " << payload_size_mib << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700297 metrics_lib_->SendToUMA(metric,
298 payload_size_mib,
299 0, // min: 0 MiB
300 1024, // max: 1024 MiB = 1 GiB
301 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800302
David Zeuthen33bae492014-02-25 16:16:18 -0800303
David Zeuthen33bae492014-02-25 16:16:18 -0800304
Tianjie Xu98333a82017-09-22 21:29:29 -0700305 metric = metrics::kMetricAttemptResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800306 LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700307 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700308 metrics_lib_->SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800309 metric,
310 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700311 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800312
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700313 if (internal_error_code != ErrorCode::kSuccess) {
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700314 ReportInternalErrorCode(internal_error_code);
David Zeuthen33bae492014-02-25 16:16:18 -0800315 }
316
David Zeuthen33bae492014-02-25 16:16:18 -0800317 base::TimeDelta time_since_last;
Alex Deymoa2591792015-11-17 00:39:40 -0300318 if (metrics_utils::WallclockDurationHelper(
319 system_state,
320 kPrefsMetricsAttemptLastReportingTime,
321 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700322 metric = metrics::kMetricAttemptTimeSinceLastAttemptMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800323 LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
324 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700325 metrics_lib_->SendToUMA(metric,
326 time_since_last.InMinutes(),
327 0, // min: 0 min
328 30 * 24 * 60, // max: 30 days
329 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800330 }
331
332 static int64_t uptime_since_last_storage = 0;
333 base::TimeDelta uptime_since_last;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700334 if (metrics_utils::MonotonicDurationHelper(
335 system_state, &uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700336 metric = metrics::kMetricAttemptTimeSinceLastAttemptUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800337 LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
338 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700339 metrics_lib_->SendToUMA(metric,
340 uptime_since_last.InMinutes(),
341 0, // min: 0 min
342 30 * 24 * 60, // max: 30 days
343 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800344 }
Tianjie Xu1f93d092017-10-09 12:13:29 -0700345}
346
347void MetricsReporterOmaha::ReportUpdateAttemptDownloadMetrics(
348 int64_t payload_bytes_downloaded,
349 int64_t payload_download_speed_bps,
350 DownloadSource download_source,
351 metrics::DownloadErrorCode payload_download_error_code,
352 metrics::ConnectionType connection_type) {
353 string metric = metrics::kMetricAttemptPayloadBytesDownloadedMiB;
354 int64_t payload_bytes_downloaded_mib =
355 payload_bytes_downloaded / kNumBytesInOneMiB;
356 LOG(INFO) << "Uploading " << payload_bytes_downloaded_mib << " for metric "
357 << metric;
358 metrics_lib_->SendToUMA(metric,
359 payload_bytes_downloaded_mib,
360 0, // min: 0 MiB
361 1024, // max: 1024 MiB = 1 GiB
362 50); // num_buckets
363
364 metric = metrics::kMetricAttemptPayloadDownloadSpeedKBps;
365 int64_t payload_download_speed_kbps = payload_download_speed_bps / 1000;
366 LOG(INFO) << "Uploading " << payload_download_speed_kbps << " for metric "
367 << metric;
368 metrics_lib_->SendToUMA(metric,
369 payload_download_speed_kbps,
370 0, // min: 0 kB/s
371 10 * 1000, // max: 10000 kB/s = 10 MB/s
372 50); // num_buckets
373
374 metric = metrics::kMetricAttemptDownloadSource;
375 LOG(INFO) << "Uploading " << download_source << " for metric " << metric;
376 metrics_lib_->SendEnumToUMA(metric, download_source, kNumDownloadSources);
377
378 if (payload_download_error_code != metrics::DownloadErrorCode::kUnset) {
379 metric = metrics::kMetricAttemptDownloadErrorCode;
380 LOG(INFO) << "Uploading " << static_cast<int>(payload_download_error_code)
381 << " for metric " << metric << " (sparse)";
382 metrics_lib_->SendSparseToUMA(
383 metric, static_cast<int>(payload_download_error_code));
384 }
David Zeuthenb281f072014-04-02 10:20:19 -0700385
Tianjie Xu98333a82017-09-22 21:29:29 -0700386 metric = metrics::kMetricAttemptConnectionType;
David Zeuthenb281f072014-04-02 10:20:19 -0700387 LOG(INFO) << "Uploading " << static_cast<int>(connection_type)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700388 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700389 metrics_lib_->SendEnumToUMA(
David Zeuthenb281f072014-04-02 10:20:19 -0700390 metric,
391 static_cast<int>(connection_type),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700392 static_cast<int>(metrics::ConnectionType::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800393}
394
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700395void MetricsReporterOmaha::ReportSuccessfulUpdateMetrics(
396 int attempt_count,
397 int updates_abandoned_count,
398 PayloadType payload_type,
399 int64_t payload_size,
400 int64_t num_bytes_downloaded[kNumDownloadSources],
401 int download_overhead_percentage,
402 base::TimeDelta total_duration,
Sen Jiang8712e962018-05-08 12:12:28 -0700403 base::TimeDelta total_duration_uptime,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700404 int reboot_count,
405 int url_switch_count) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700406 string metric = metrics::kMetricSuccessfulUpdatePayloadSizeMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700407 int64_t mbs = payload_size / kNumBytesInOneMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800408 LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700409 metrics_lib_->SendToUMA(metric,
410 mbs,
411 0, // min: 0 MiB
412 1024, // max: 1024 MiB = 1 GiB
413 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800414
415 int64_t total_bytes = 0;
416 int download_sources_used = 0;
417 for (int i = 0; i < kNumDownloadSources + 1; i++) {
418 DownloadSource source = static_cast<DownloadSource>(i);
419
420 // Only consider this download source (and send byte counts) as
421 // having been used if we downloaded a non-trivial amount of bytes
Alex Vakulenko072359c2014-07-18 11:41:07 -0700422 // (e.g. at least 1 MiB) that contributed to the
David Zeuthen33bae492014-02-25 16:16:18 -0800423 // update. Otherwise we're going to end up with a lot of zero-byte
424 // events in the histogram.
425
Tianjie Xu98333a82017-09-22 21:29:29 -0700426 metric = metrics::kMetricSuccessfulUpdateBytesDownloadedMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800427 if (i < kNumDownloadSources) {
428 metric += utils::ToString(source);
429 mbs = num_bytes_downloaded[i] / kNumBytesInOneMiB;
430 total_bytes += num_bytes_downloaded[i];
431 if (mbs > 0)
432 download_sources_used |= (1 << i);
433 } else {
434 mbs = total_bytes / kNumBytesInOneMiB;
435 }
436
437 if (mbs > 0) {
438 LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700439 metrics_lib_->SendToUMA(metric,
440 mbs,
441 0, // min: 0 MiB
442 1024, // max: 1024 MiB = 1 GiB
443 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800444 }
445 }
446
Tianjie Xu98333a82017-09-22 21:29:29 -0700447 metric = metrics::kMetricSuccessfulUpdateDownloadSourcesUsed;
David Zeuthen33bae492014-02-25 16:16:18 -0800448 LOG(INFO) << "Uploading 0x" << std::hex << download_sources_used
449 << " (bit flags) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700450 metrics_lib_->SendToUMA(metric,
451 download_sources_used,
452 0, // min
453 (1 << kNumDownloadSources) - 1, // max
454 1 << kNumDownloadSources); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800455
Tianjie Xu98333a82017-09-22 21:29:29 -0700456 metric = metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700457 LOG(INFO) << "Uploading " << download_overhead_percentage << "% for metric "
458 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700459 metrics_lib_->SendToUMA(metric,
460 download_overhead_percentage,
461 0, // min: 0% overhead
462 1000, // max: 1000% overhead
463 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800464
Tianjie Xu98333a82017-09-22 21:29:29 -0700465 metric = metrics::kMetricSuccessfulUpdateUrlSwitchCount;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700466 LOG(INFO) << "Uploading " << url_switch_count << " (count) for metric "
467 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700468 metrics_lib_->SendToUMA(metric,
469 url_switch_count,
470 0, // min: 0 URL switches
471 49, // max: 49 URL switches
472 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800473
Tianjie Xu98333a82017-09-22 21:29:29 -0700474 metric = metrics::kMetricSuccessfulUpdateTotalDurationMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800475 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(total_duration)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700476 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700477 metrics_lib_->SendToUMA(metric,
478 static_cast<int>(total_duration.InMinutes()),
479 0, // min: 0 min
480 365 * 24 * 60, // max: 365 days ~= 1 year
481 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800482
Sen Jiang8712e962018-05-08 12:12:28 -0700483 metric = metrics::kMetricSuccessfulUpdateTotalDurationUptimeMinutes;
484 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(total_duration_uptime)
485 << " for metric " << metric;
486 metrics_lib_->SendToUMA(metric,
487 static_cast<int>(total_duration_uptime.InMinutes()),
488 0, // min: 0 min
489 30 * 24 * 60, // max: 30 days
490 50); // num_buckets
491
Tianjie Xu98333a82017-09-22 21:29:29 -0700492 metric = metrics::kMetricSuccessfulUpdateRebootCount;
David Zeuthen33bae492014-02-25 16:16:18 -0800493 LOG(INFO) << "Uploading reboot count of " << reboot_count << " for metric "
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700494 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700495 metrics_lib_->SendToUMA(metric,
496 reboot_count,
497 0, // min: 0 reboots
498 49, // max: 49 reboots
499 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800500
Tianjie Xu98333a82017-09-22 21:29:29 -0700501 metric = metrics::kMetricSuccessfulUpdatePayloadType;
502 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700503 LOG(INFO) << "Uploading " << utils::ToString(payload_type) << " for metric "
504 << metric;
David Zeuthen33bae492014-02-25 16:16:18 -0800505
Tianjie Xu98333a82017-09-22 21:29:29 -0700506 metric = metrics::kMetricSuccessfulUpdateAttemptCount;
507 metrics_lib_->SendToUMA(metric,
508 attempt_count,
509 1, // min: 1 attempt
510 50, // max: 50 attempts
511 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700512 LOG(INFO) << "Uploading " << attempt_count << " for metric " << metric;
David Zeuthen33bae492014-02-25 16:16:18 -0800513
Tianjie Xu98333a82017-09-22 21:29:29 -0700514 metric = metrics::kMetricSuccessfulUpdateUpdatesAbandonedCount;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700515 LOG(INFO) << "Uploading " << updates_abandoned_count << " (count) for metric "
516 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700517 metrics_lib_->SendToUMA(metric,
518 updates_abandoned_count,
519 0, // min: 0 counts
520 49, // max: 49 counts
521 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800522}
523
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700524void MetricsReporterOmaha::ReportRollbackMetrics(
525 metrics::RollbackResult result) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700526 string metric = metrics::kMetricRollbackResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700527 int value = static_cast<int>(result);
David Zeuthen96197df2014-04-16 12:22:39 -0700528 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700529 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700530 metric, value, static_cast<int>(metrics::RollbackResult::kNumConstants));
David Zeuthen96197df2014-04-16 12:22:39 -0700531}
532
Marton Hunyadya0302682018-05-16 18:52:13 +0200533void MetricsReporterOmaha::ReportEnterpriseRollbackMetrics(
534 bool success, const string& rollback_version) {
535 int value = utils::VersionPrefix(rollback_version);
536 string metric = metrics::kMetricEnterpriseRollbackSuccess;
537 if (!success)
538 metric = metrics::kMetricEnterpriseRollbackFailure;
539 LOG(INFO) << "Sending " << value << " for metric " << metric;
540 metrics_lib_->SendSparseToUMA(metric, value);
541}
542
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700543void MetricsReporterOmaha::ReportCertificateCheckMetrics(
544 ServerToCheck server_to_check, CertificateCheckResult result) {
Alex Deymoc1c17b42015-11-23 03:53:15 -0300545 string metric;
546 switch (server_to_check) {
547 case ServerToCheck::kUpdate:
Tianjie Xu98333a82017-09-22 21:29:29 -0700548 metric = metrics::kMetricCertificateCheckUpdateCheck;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300549 break;
550 case ServerToCheck::kDownload:
Tianjie Xu98333a82017-09-22 21:29:29 -0700551 metric = metrics::kMetricCertificateCheckDownload;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300552 break;
Alex Deymo33e91e72015-12-01 18:26:08 -0300553 case ServerToCheck::kNone:
554 return;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300555 }
556 LOG(INFO) << "Uploading " << static_cast<int>(result) << " for metric "
557 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700558 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700559 metric,
560 static_cast<int>(result),
Alex Deymoc1c17b42015-11-23 03:53:15 -0300561 static_cast<int>(CertificateCheckResult::kNumConstants));
562}
563
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700564void MetricsReporterOmaha::ReportFailedUpdateCount(int target_attempt) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700565 string metric = metrics::kMetricFailedUpdateCount;
566 metrics_lib_->SendToUMA(metric,
567 target_attempt,
568 1, // min value
569 50, // max value
570 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700571
572 LOG(INFO) << "Uploading " << target_attempt << " (count) for metric "
573 << metric;
574}
575
576void MetricsReporterOmaha::ReportTimeToReboot(int time_to_reboot_minutes) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700577 string metric = metrics::kMetricTimeToRebootMinutes;
578 metrics_lib_->SendToUMA(metric,
579 time_to_reboot_minutes,
580 0, // min: 0 minute
581 30 * 24 * 60, // max: 1 month (approx)
582 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700583
584 LOG(INFO) << "Uploading " << time_to_reboot_minutes << " for metric "
585 << metric;
586}
587
588void MetricsReporterOmaha::ReportInstallDateProvisioningSource(int source,
589 int max) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700590 metrics_lib_->SendEnumToUMA(metrics::kMetricInstallDateProvisioningSource,
591 source, // Sample.
592 max);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700593}
David Zeuthen33bae492014-02-25 16:16:18 -0800594
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700595void MetricsReporterOmaha::ReportInternalErrorCode(ErrorCode error_code) {
596 auto metric = metrics::kMetricAttemptInternalErrorCode;
597 LOG(INFO) << "Uploading " << error_code << " for metric " << metric;
598 metrics_lib_->SendEnumToUMA(metric,
599 static_cast<int>(error_code),
600 static_cast<int>(ErrorCode::kUmaReportedMax));
601}
602
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +0200603void MetricsReporterOmaha::ReportKeyVersionMetrics(
604 int kernel_min_version,
605 int kernel_max_rollforward_version,
606 bool kernel_max_rollforward_success) {
607 int value = kernel_min_version;
608 string metric = metrics::kMetricKernelMinVersion;
609 LOG(INFO) << "Sending " << value << " for metric " << metric;
610 metrics_lib_->SendSparseToUMA(metric, value);
611
612 value = kernel_max_rollforward_version;
613 metric = metrics::kMetricKernelMaxRollforwardVersion;
614 LOG(INFO) << "Sending " << value << " for metric " << metric;
615 metrics_lib_->SendSparseToUMA(metric, value);
616
617 bool bool_value = kernel_max_rollforward_success;
618 metric = metrics::kMetricKernelMaxRollforwardSetSuccess;
619 LOG(INFO) << "Sending " << bool_value << " for metric " << metric
620 << " (bool)";
621 metrics_lib_->SendBoolToUMA(metric, bool_value);
622}
623
May Lippert60aa3ca2018-08-15 16:55:29 -0700624void MetricsReporterOmaha::ReportEnterpriseUpdateSeenToDownloadDays(
625 bool has_time_restriction_policy, int time_to_update_days) {
626 string metric =
627 has_time_restriction_policy
628 ? metrics::kMetricSuccessfulUpdateDurationFromSeenTimeRestrictedDays
629 : metrics::kMetricSuccessfulUpdateDurationFromSeenDays;
630 LOG(INFO) << "Sending " << time_to_update_days << " for metric " << metric;
631
632 metrics_lib_->SendToUMA(metric,
633 time_to_update_days,
634 1, // min: 1 days
635 6 * 30, // max: 6 months (approx)
636 50); // num_buckets
637}
638
David Zeuthen33bae492014-02-25 16:16:18 -0800639} // namespace chromeos_update_engine