blob: 0a2b6745127498a1298bd5d85436bbd6ca9ce166 [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";
Tianjie Xu98333a82017-09-22 21:29:29 -070099const char kMetricSuccessfulUpdateUpdatesAbandonedCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800100 "UpdateEngine.SuccessfulUpdate.UpdatesAbandonedCount";
Tianjie Xu98333a82017-09-22 21:29:29 -0700101const char kMetricSuccessfulUpdateUrlSwitchCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800102 "UpdateEngine.SuccessfulUpdate.UrlSwitchCount";
103
David Zeuthen96197df2014-04-16 12:22:39 -0700104// UpdateEngine.Rollback.* metric.
Tianjie Xu98333a82017-09-22 21:29:29 -0700105const char kMetricRollbackResult[] = "UpdateEngine.Rollback.Result";
David Zeuthen96197df2014-04-16 12:22:39 -0700106
Marton Hunyadya0302682018-05-16 18:52:13 +0200107// UpdateEngine.EnterpriseRollback.* metrics.
108const char kMetricEnterpriseRollbackFailure[] =
109 "UpdateEngine.EnterpriseRollback.Failure";
110const char kMetricEnterpriseRollbackSuccess[] =
111 "UpdateEngine.EnterpriseRollback.Success";
112
Alex Deymoc1c17b42015-11-23 03:53:15 -0300113// UpdateEngine.CertificateCheck.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -0700114const char kMetricCertificateCheckUpdateCheck[] =
Alex Deymoc1c17b42015-11-23 03:53:15 -0300115 "UpdateEngine.CertificateCheck.UpdateCheck";
Tianjie Xu98333a82017-09-22 21:29:29 -0700116const char kMetricCertificateCheckDownload[] =
Alex Deymoc1c17b42015-11-23 03:53:15 -0300117 "UpdateEngine.CertificateCheck.Download";
118
David Zeuthen33bae492014-02-25 16:16:18 -0800119// UpdateEngine.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -0700120const char kMetricFailedUpdateCount[] = "UpdateEngine.FailedUpdateCount";
121const char kMetricInstallDateProvisioningSource[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800122 "UpdateEngine.InstallDateProvisioningSource";
Tianjie Xu98333a82017-09-22 21:29:29 -0700123const char kMetricTimeToRebootMinutes[] = "UpdateEngine.TimeToRebootMinutes";
124
Tianjie Xud4c5deb2017-10-24 11:17:03 -0700125std::unique_ptr<MetricsReporterInterface> CreateMetricsReporter() {
126 return std::make_unique<MetricsReporterOmaha>();
127}
128
Tianjie Xu98333a82017-09-22 21:29:29 -0700129} // namespace metrics
130
131MetricsReporterOmaha::MetricsReporterOmaha()
132 : metrics_lib_(new MetricsLibrary()) {}
David Zeuthen33bae492014-02-25 16:16:18 -0800133
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700134void MetricsReporterOmaha::Initialize() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700135 metrics_lib_->Init();
David Zeuthen33bae492014-02-25 16:16:18 -0800136}
137
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700138void MetricsReporterOmaha::ReportDailyMetrics(base::TimeDelta os_age) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700139 string metric = metrics::kMetricDailyOSAgeDays;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700140 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(os_age) << " for metric "
141 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700142 metrics_lib_->SendToUMA(metric,
143 static_cast<int>(os_age.InDays()),
144 0, // min: 0 days
145 6 * 30, // max: 6 months (approx)
146 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700147}
148
149void MetricsReporterOmaha::ReportUpdateCheckMetrics(
150 SystemState* system_state,
151 metrics::CheckResult result,
152 metrics::CheckReaction reaction,
153 metrics::DownloadErrorCode download_error_code) {
David Zeuthen33bae492014-02-25 16:16:18 -0800154 string metric;
155 int value;
156 int max_value;
157
158 if (result != metrics::CheckResult::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700159 metric = metrics::kMetricCheckResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800160 value = static_cast<int>(result);
161 max_value = static_cast<int>(metrics::CheckResult::kNumConstants) - 1;
162 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700163 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800164 }
165 if (reaction != metrics::CheckReaction::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700166 metric = metrics::kMetricCheckReaction;
David Zeuthen33bae492014-02-25 16:16:18 -0800167 value = static_cast<int>(reaction);
168 max_value = static_cast<int>(metrics::CheckReaction::kNumConstants) - 1;
169 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700170 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800171 }
172 if (download_error_code != metrics::DownloadErrorCode::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700173 metric = metrics::kMetricCheckDownloadErrorCode;
David Zeuthen33bae492014-02-25 16:16:18 -0800174 value = static_cast<int>(download_error_code);
David Zeuthenc0dd0212014-04-04 14:49:49 -0700175 LOG(INFO) << "Sending " << value << " for metric " << metric << " (sparse)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700176 metrics_lib_->SendSparseToUMA(metric, value);
David Zeuthen33bae492014-02-25 16:16:18 -0800177 }
178
179 base::TimeDelta time_since_last;
Alex Deymoa2591792015-11-17 00:39:40 -0300180 if (metrics_utils::WallclockDurationHelper(
181 system_state,
182 kPrefsMetricsCheckLastReportingTime,
183 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700184 metric = metrics::kMetricCheckTimeSinceLastCheckMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800185 LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
186 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700187 metrics_lib_->SendToUMA(metric,
188 time_since_last.InMinutes(),
189 0, // min: 0 min
190 30 * 24 * 60, // max: 30 days
191 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800192 }
193
194 base::TimeDelta uptime_since_last;
195 static int64_t uptime_since_last_storage = 0;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700196 if (metrics_utils::MonotonicDurationHelper(
197 system_state, &uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700198 metric = metrics::kMetricCheckTimeSinceLastCheckUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800199 LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
200 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700201 metrics_lib_->SendToUMA(metric,
202 uptime_since_last.InMinutes(),
203 0, // min: 0 min
204 30 * 24 * 60, // max: 30 days
205 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800206 }
Marton Hunyadya0302682018-05-16 18:52:13 +0200207
208 // First section of target version specified for the update.
209 if (system_state && system_state->request_params()) {
210 string target_version =
211 system_state->request_params()->target_version_prefix();
212 value = utils::VersionPrefix(target_version);
213 if (value != 0) {
214 metric = metrics::kMetricCheckTargetVersion;
215 LOG(INFO) << "Sending " << value << " for metric " << metric
216 << " (sparse)";
217 metrics_lib_->SendSparseToUMA(metric, value);
218 if (system_state->request_params()->rollback_allowed()) {
219 metric = metrics::kMetricCheckRollbackTargetVersion;
220 LOG(INFO) << "Sending " << value << " for metric " << metric
221 << " (sparse)";
222 metrics_lib_->SendSparseToUMA(metric, value);
223 }
224 }
225 }
David Zeuthen33bae492014-02-25 16:16:18 -0800226}
227
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700228void MetricsReporterOmaha::ReportAbnormallyTerminatedUpdateAttemptMetrics() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700229 string metric = metrics::kMetricAttemptResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700230 metrics::AttemptResult attempt_result =
231 metrics::AttemptResult::kAbnormalTermination;
David Zeuthen4e1d1492014-04-25 13:12:27 -0700232
233 LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700234 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700235 metrics_lib_->SendEnumToUMA(
David Zeuthen4e1d1492014-04-25 13:12:27 -0700236 metric,
237 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700238 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen4e1d1492014-04-25 13:12:27 -0700239}
240
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700241void MetricsReporterOmaha::ReportUpdateAttemptMetrics(
242 SystemState* system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800243 int attempt_number,
244 PayloadType payload_type,
245 base::TimeDelta duration,
246 base::TimeDelta duration_uptime,
247 int64_t payload_size,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700248 metrics::AttemptResult attempt_result,
Tianjie Xu1f93d092017-10-09 12:13:29 -0700249 ErrorCode internal_error_code) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700250 string metric = metrics::kMetricAttemptNumber;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700251 LOG(INFO) << "Uploading " << attempt_number << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700252 metrics_lib_->SendToUMA(metric,
253 attempt_number,
254 0, // min: 0 attempts
255 49, // max: 49 attempts
256 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800257
Tianjie Xu98333a82017-09-22 21:29:29 -0700258 metric = metrics::kMetricAttemptPayloadType;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700259 LOG(INFO) << "Uploading " << utils::ToString(payload_type) << " for metric "
260 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700261 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
David Zeuthen33bae492014-02-25 16:16:18 -0800262
Tianjie Xu98333a82017-09-22 21:29:29 -0700263 metric = metrics::kMetricAttemptDurationMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800264 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700265 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700266 metrics_lib_->SendToUMA(metric,
267 duration.InMinutes(),
268 0, // min: 0 min
269 10 * 24 * 60, // max: 10 days
270 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800271
Tianjie Xu98333a82017-09-22 21:29:29 -0700272 metric = metrics::kMetricAttemptDurationUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800273 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration_uptime)
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_uptime.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::kMetricAttemptPayloadSizeMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800282 int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700283 LOG(INFO) << "Uploading " << payload_size_mib << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700284 metrics_lib_->SendToUMA(metric,
285 payload_size_mib,
286 0, // min: 0 MiB
287 1024, // max: 1024 MiB = 1 GiB
288 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800289
David Zeuthen33bae492014-02-25 16:16:18 -0800290
David Zeuthen33bae492014-02-25 16:16:18 -0800291
Tianjie Xu98333a82017-09-22 21:29:29 -0700292 metric = metrics::kMetricAttemptResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800293 LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700294 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700295 metrics_lib_->SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800296 metric,
297 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700298 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800299
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700300 if (internal_error_code != ErrorCode::kSuccess) {
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700301 ReportInternalErrorCode(internal_error_code);
David Zeuthen33bae492014-02-25 16:16:18 -0800302 }
303
David Zeuthen33bae492014-02-25 16:16:18 -0800304 base::TimeDelta time_since_last;
Alex Deymoa2591792015-11-17 00:39:40 -0300305 if (metrics_utils::WallclockDurationHelper(
306 system_state,
307 kPrefsMetricsAttemptLastReportingTime,
308 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700309 metric = metrics::kMetricAttemptTimeSinceLastAttemptMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800310 LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
311 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700312 metrics_lib_->SendToUMA(metric,
313 time_since_last.InMinutes(),
314 0, // min: 0 min
315 30 * 24 * 60, // max: 30 days
316 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800317 }
318
319 static int64_t uptime_since_last_storage = 0;
320 base::TimeDelta uptime_since_last;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700321 if (metrics_utils::MonotonicDurationHelper(
322 system_state, &uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700323 metric = metrics::kMetricAttemptTimeSinceLastAttemptUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800324 LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
325 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700326 metrics_lib_->SendToUMA(metric,
327 uptime_since_last.InMinutes(),
328 0, // min: 0 min
329 30 * 24 * 60, // max: 30 days
330 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800331 }
Tianjie Xu1f93d092017-10-09 12:13:29 -0700332}
333
334void MetricsReporterOmaha::ReportUpdateAttemptDownloadMetrics(
335 int64_t payload_bytes_downloaded,
336 int64_t payload_download_speed_bps,
337 DownloadSource download_source,
338 metrics::DownloadErrorCode payload_download_error_code,
339 metrics::ConnectionType connection_type) {
340 string metric = metrics::kMetricAttemptPayloadBytesDownloadedMiB;
341 int64_t payload_bytes_downloaded_mib =
342 payload_bytes_downloaded / kNumBytesInOneMiB;
343 LOG(INFO) << "Uploading " << payload_bytes_downloaded_mib << " for metric "
344 << metric;
345 metrics_lib_->SendToUMA(metric,
346 payload_bytes_downloaded_mib,
347 0, // min: 0 MiB
348 1024, // max: 1024 MiB = 1 GiB
349 50); // num_buckets
350
351 metric = metrics::kMetricAttemptPayloadDownloadSpeedKBps;
352 int64_t payload_download_speed_kbps = payload_download_speed_bps / 1000;
353 LOG(INFO) << "Uploading " << payload_download_speed_kbps << " for metric "
354 << metric;
355 metrics_lib_->SendToUMA(metric,
356 payload_download_speed_kbps,
357 0, // min: 0 kB/s
358 10 * 1000, // max: 10000 kB/s = 10 MB/s
359 50); // num_buckets
360
361 metric = metrics::kMetricAttemptDownloadSource;
362 LOG(INFO) << "Uploading " << download_source << " for metric " << metric;
363 metrics_lib_->SendEnumToUMA(metric, download_source, kNumDownloadSources);
364
365 if (payload_download_error_code != metrics::DownloadErrorCode::kUnset) {
366 metric = metrics::kMetricAttemptDownloadErrorCode;
367 LOG(INFO) << "Uploading " << static_cast<int>(payload_download_error_code)
368 << " for metric " << metric << " (sparse)";
369 metrics_lib_->SendSparseToUMA(
370 metric, static_cast<int>(payload_download_error_code));
371 }
David Zeuthenb281f072014-04-02 10:20:19 -0700372
Tianjie Xu98333a82017-09-22 21:29:29 -0700373 metric = metrics::kMetricAttemptConnectionType;
David Zeuthenb281f072014-04-02 10:20:19 -0700374 LOG(INFO) << "Uploading " << static_cast<int>(connection_type)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700375 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700376 metrics_lib_->SendEnumToUMA(
David Zeuthenb281f072014-04-02 10:20:19 -0700377 metric,
378 static_cast<int>(connection_type),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700379 static_cast<int>(metrics::ConnectionType::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800380}
381
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700382void MetricsReporterOmaha::ReportSuccessfulUpdateMetrics(
383 int attempt_count,
384 int updates_abandoned_count,
385 PayloadType payload_type,
386 int64_t payload_size,
387 int64_t num_bytes_downloaded[kNumDownloadSources],
388 int download_overhead_percentage,
389 base::TimeDelta total_duration,
390 int reboot_count,
391 int url_switch_count) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700392 string metric = metrics::kMetricSuccessfulUpdatePayloadSizeMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700393 int64_t mbs = payload_size / kNumBytesInOneMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800394 LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700395 metrics_lib_->SendToUMA(metric,
396 mbs,
397 0, // min: 0 MiB
398 1024, // max: 1024 MiB = 1 GiB
399 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800400
401 int64_t total_bytes = 0;
402 int download_sources_used = 0;
403 for (int i = 0; i < kNumDownloadSources + 1; i++) {
404 DownloadSource source = static_cast<DownloadSource>(i);
405
406 // Only consider this download source (and send byte counts) as
407 // having been used if we downloaded a non-trivial amount of bytes
Alex Vakulenko072359c2014-07-18 11:41:07 -0700408 // (e.g. at least 1 MiB) that contributed to the
David Zeuthen33bae492014-02-25 16:16:18 -0800409 // update. Otherwise we're going to end up with a lot of zero-byte
410 // events in the histogram.
411
Tianjie Xu98333a82017-09-22 21:29:29 -0700412 metric = metrics::kMetricSuccessfulUpdateBytesDownloadedMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800413 if (i < kNumDownloadSources) {
414 metric += utils::ToString(source);
415 mbs = num_bytes_downloaded[i] / kNumBytesInOneMiB;
416 total_bytes += num_bytes_downloaded[i];
417 if (mbs > 0)
418 download_sources_used |= (1 << i);
419 } else {
420 mbs = total_bytes / kNumBytesInOneMiB;
421 }
422
423 if (mbs > 0) {
424 LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700425 metrics_lib_->SendToUMA(metric,
426 mbs,
427 0, // min: 0 MiB
428 1024, // max: 1024 MiB = 1 GiB
429 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800430 }
431 }
432
Tianjie Xu98333a82017-09-22 21:29:29 -0700433 metric = metrics::kMetricSuccessfulUpdateDownloadSourcesUsed;
David Zeuthen33bae492014-02-25 16:16:18 -0800434 LOG(INFO) << "Uploading 0x" << std::hex << download_sources_used
435 << " (bit flags) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700436 metrics_lib_->SendToUMA(metric,
437 download_sources_used,
438 0, // min
439 (1 << kNumDownloadSources) - 1, // max
440 1 << kNumDownloadSources); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800441
Tianjie Xu98333a82017-09-22 21:29:29 -0700442 metric = metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700443 LOG(INFO) << "Uploading " << download_overhead_percentage << "% for metric "
444 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700445 metrics_lib_->SendToUMA(metric,
446 download_overhead_percentage,
447 0, // min: 0% overhead
448 1000, // max: 1000% overhead
449 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800450
Tianjie Xu98333a82017-09-22 21:29:29 -0700451 metric = metrics::kMetricSuccessfulUpdateUrlSwitchCount;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700452 LOG(INFO) << "Uploading " << url_switch_count << " (count) for metric "
453 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700454 metrics_lib_->SendToUMA(metric,
455 url_switch_count,
456 0, // min: 0 URL switches
457 49, // max: 49 URL switches
458 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800459
Tianjie Xu98333a82017-09-22 21:29:29 -0700460 metric = metrics::kMetricSuccessfulUpdateTotalDurationMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800461 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(total_duration)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700462 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700463 metrics_lib_->SendToUMA(metric,
464 static_cast<int>(total_duration.InMinutes()),
465 0, // min: 0 min
466 365 * 24 * 60, // max: 365 days ~= 1 year
467 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800468
Tianjie Xu98333a82017-09-22 21:29:29 -0700469 metric = metrics::kMetricSuccessfulUpdateRebootCount;
David Zeuthen33bae492014-02-25 16:16:18 -0800470 LOG(INFO) << "Uploading reboot count of " << reboot_count << " for metric "
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700471 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700472 metrics_lib_->SendToUMA(metric,
473 reboot_count,
474 0, // min: 0 reboots
475 49, // max: 49 reboots
476 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800477
Tianjie Xu98333a82017-09-22 21:29:29 -0700478 metric = metrics::kMetricSuccessfulUpdatePayloadType;
479 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700480 LOG(INFO) << "Uploading " << utils::ToString(payload_type) << " for metric "
481 << metric;
David Zeuthen33bae492014-02-25 16:16:18 -0800482
Tianjie Xu98333a82017-09-22 21:29:29 -0700483 metric = metrics::kMetricSuccessfulUpdateAttemptCount;
484 metrics_lib_->SendToUMA(metric,
485 attempt_count,
486 1, // min: 1 attempt
487 50, // max: 50 attempts
488 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700489 LOG(INFO) << "Uploading " << attempt_count << " for metric " << metric;
David Zeuthen33bae492014-02-25 16:16:18 -0800490
Tianjie Xu98333a82017-09-22 21:29:29 -0700491 metric = metrics::kMetricSuccessfulUpdateUpdatesAbandonedCount;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700492 LOG(INFO) << "Uploading " << updates_abandoned_count << " (count) for metric "
493 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700494 metrics_lib_->SendToUMA(metric,
495 updates_abandoned_count,
496 0, // min: 0 counts
497 49, // max: 49 counts
498 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800499}
500
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700501void MetricsReporterOmaha::ReportRollbackMetrics(
502 metrics::RollbackResult result) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700503 string metric = metrics::kMetricRollbackResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700504 int value = static_cast<int>(result);
David Zeuthen96197df2014-04-16 12:22:39 -0700505 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700506 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700507 metric, value, static_cast<int>(metrics::RollbackResult::kNumConstants));
David Zeuthen96197df2014-04-16 12:22:39 -0700508}
509
Marton Hunyadya0302682018-05-16 18:52:13 +0200510void MetricsReporterOmaha::ReportEnterpriseRollbackMetrics(
511 bool success, const string& rollback_version) {
512 int value = utils::VersionPrefix(rollback_version);
513 string metric = metrics::kMetricEnterpriseRollbackSuccess;
514 if (!success)
515 metric = metrics::kMetricEnterpriseRollbackFailure;
516 LOG(INFO) << "Sending " << value << " for metric " << metric;
517 metrics_lib_->SendSparseToUMA(metric, value);
518}
519
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700520void MetricsReporterOmaha::ReportCertificateCheckMetrics(
521 ServerToCheck server_to_check, CertificateCheckResult result) {
Alex Deymoc1c17b42015-11-23 03:53:15 -0300522 string metric;
523 switch (server_to_check) {
524 case ServerToCheck::kUpdate:
Tianjie Xu98333a82017-09-22 21:29:29 -0700525 metric = metrics::kMetricCertificateCheckUpdateCheck;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300526 break;
527 case ServerToCheck::kDownload:
Tianjie Xu98333a82017-09-22 21:29:29 -0700528 metric = metrics::kMetricCertificateCheckDownload;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300529 break;
Alex Deymo33e91e72015-12-01 18:26:08 -0300530 case ServerToCheck::kNone:
531 return;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300532 }
533 LOG(INFO) << "Uploading " << static_cast<int>(result) << " for metric "
534 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700535 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700536 metric,
537 static_cast<int>(result),
Alex Deymoc1c17b42015-11-23 03:53:15 -0300538 static_cast<int>(CertificateCheckResult::kNumConstants));
539}
540
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700541void MetricsReporterOmaha::ReportFailedUpdateCount(int target_attempt) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700542 string metric = metrics::kMetricFailedUpdateCount;
543 metrics_lib_->SendToUMA(metric,
544 target_attempt,
545 1, // min value
546 50, // max value
547 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700548
549 LOG(INFO) << "Uploading " << target_attempt << " (count) for metric "
550 << metric;
551}
552
553void MetricsReporterOmaha::ReportTimeToReboot(int time_to_reboot_minutes) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700554 string metric = metrics::kMetricTimeToRebootMinutes;
555 metrics_lib_->SendToUMA(metric,
556 time_to_reboot_minutes,
557 0, // min: 0 minute
558 30 * 24 * 60, // max: 1 month (approx)
559 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700560
561 LOG(INFO) << "Uploading " << time_to_reboot_minutes << " for metric "
562 << metric;
563}
564
565void MetricsReporterOmaha::ReportInstallDateProvisioningSource(int source,
566 int max) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700567 metrics_lib_->SendEnumToUMA(metrics::kMetricInstallDateProvisioningSource,
568 source, // Sample.
569 max);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700570}
David Zeuthen33bae492014-02-25 16:16:18 -0800571
Amin Hassani80f4d4c2018-05-16 13:34:00 -0700572void MetricsReporterOmaha::ReportInternalErrorCode(ErrorCode error_code) {
573 auto metric = metrics::kMetricAttemptInternalErrorCode;
574 LOG(INFO) << "Uploading " << error_code << " for metric " << metric;
575 metrics_lib_->SendEnumToUMA(metric,
576 static_cast<int>(error_code),
577 static_cast<int>(ErrorCode::kUmaReportedMax));
578}
579
David Zeuthen33bae492014-02-25 16:16:18 -0800580} // namespace chromeos_update_engine