blob: 3aaf1c6fc605c1b0e2e896bddecde43b59c19f62 [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#include <string>
21
22#include <base/logging.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"
David Zeuthen33bae492014-02-25 16:16:18 -080030#include "update_engine/system_state.h"
David Zeuthen33bae492014-02-25 16:16:18 -080031
32using std::string;
33
34namespace chromeos_update_engine {
35
Tianjie Xu98333a82017-09-22 21:29:29 -070036namespace metrics {
37
David Zeuthen33bae492014-02-25 16:16:18 -080038// UpdateEngine.Daily.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -070039const char kMetricDailyOSAgeDays[] = "UpdateEngine.Daily.OSAgeDays";
David Zeuthen33bae492014-02-25 16:16:18 -080040
41// UpdateEngine.Check.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -070042const char kMetricCheckDownloadErrorCode[] =
David Zeuthen33bae492014-02-25 16:16:18 -080043 "UpdateEngine.Check.DownloadErrorCode";
Tianjie Xu98333a82017-09-22 21:29:29 -070044const char kMetricCheckReaction[] = "UpdateEngine.Check.Reaction";
45const char kMetricCheckResult[] = "UpdateEngine.Check.Result";
46const char kMetricCheckTimeSinceLastCheckMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080047 "UpdateEngine.Check.TimeSinceLastCheckMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070048const char kMetricCheckTimeSinceLastCheckUptimeMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080049 "UpdateEngine.Check.TimeSinceLastCheckUptimeMinutes";
50
51// UpdateEngine.Attempt.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -070052const char kMetricAttemptNumber[] = "UpdateEngine.Attempt.Number";
53const char kMetricAttemptPayloadType[] = "UpdateEngine.Attempt.PayloadType";
54const char kMetricAttemptPayloadSizeMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080055 "UpdateEngine.Attempt.PayloadSizeMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070056const char kMetricAttemptConnectionType[] =
David Zeuthenb281f072014-04-02 10:20:19 -070057 "UpdateEngine.Attempt.ConnectionType";
Tianjie Xu98333a82017-09-22 21:29:29 -070058const char kMetricAttemptDurationMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080059 "UpdateEngine.Attempt.DurationMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070060const char kMetricAttemptDurationUptimeMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080061 "UpdateEngine.Attempt.DurationUptimeMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070062const char kMetricAttemptTimeSinceLastAttemptMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080063 "UpdateEngine.Attempt.TimeSinceLastAttemptMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070064const char kMetricAttemptTimeSinceLastAttemptUptimeMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080065 "UpdateEngine.Attempt.TimeSinceLastAttemptUptimeMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070066const char kMetricAttemptPayloadBytesDownloadedMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080067 "UpdateEngine.Attempt.PayloadBytesDownloadedMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070068const char kMetricAttemptPayloadDownloadSpeedKBps[] =
David Zeuthen33bae492014-02-25 16:16:18 -080069 "UpdateEngine.Attempt.PayloadDownloadSpeedKBps";
Tianjie Xu98333a82017-09-22 21:29:29 -070070const char kMetricAttemptDownloadSource[] =
David Zeuthen33bae492014-02-25 16:16:18 -080071 "UpdateEngine.Attempt.DownloadSource";
Tianjie Xu98333a82017-09-22 21:29:29 -070072const char kMetricAttemptResult[] = "UpdateEngine.Attempt.Result";
73const char kMetricAttemptInternalErrorCode[] =
David Zeuthen33bae492014-02-25 16:16:18 -080074 "UpdateEngine.Attempt.InternalErrorCode";
Tianjie Xu98333a82017-09-22 21:29:29 -070075const char kMetricAttemptDownloadErrorCode[] =
David Zeuthen33bae492014-02-25 16:16:18 -080076 "UpdateEngine.Attempt.DownloadErrorCode";
77
78// UpdateEngine.SuccessfulUpdate.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -070079const char kMetricSuccessfulUpdateAttemptCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -080080 "UpdateEngine.SuccessfulUpdate.AttemptCount";
Tianjie Xu98333a82017-09-22 21:29:29 -070081const char kMetricSuccessfulUpdateBytesDownloadedMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080082 "UpdateEngine.SuccessfulUpdate.BytesDownloadedMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070083const char kMetricSuccessfulUpdateDownloadOverheadPercentage[] =
David Zeuthen33bae492014-02-25 16:16:18 -080084 "UpdateEngine.SuccessfulUpdate.DownloadOverheadPercentage";
Tianjie Xu98333a82017-09-22 21:29:29 -070085const char kMetricSuccessfulUpdateDownloadSourcesUsed[] =
David Zeuthen33bae492014-02-25 16:16:18 -080086 "UpdateEngine.SuccessfulUpdate.DownloadSourcesUsed";
Tianjie Xu98333a82017-09-22 21:29:29 -070087const char kMetricSuccessfulUpdatePayloadType[] =
David Zeuthen33bae492014-02-25 16:16:18 -080088 "UpdateEngine.SuccessfulUpdate.PayloadType";
Tianjie Xu98333a82017-09-22 21:29:29 -070089const char kMetricSuccessfulUpdatePayloadSizeMiB[] =
David Zeuthen33bae492014-02-25 16:16:18 -080090 "UpdateEngine.SuccessfulUpdate.PayloadSizeMiB";
Tianjie Xu98333a82017-09-22 21:29:29 -070091const char kMetricSuccessfulUpdateRebootCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -080092 "UpdateEngine.SuccessfulUpdate.RebootCount";
Tianjie Xu98333a82017-09-22 21:29:29 -070093const char kMetricSuccessfulUpdateTotalDurationMinutes[] =
David Zeuthen33bae492014-02-25 16:16:18 -080094 "UpdateEngine.SuccessfulUpdate.TotalDurationMinutes";
Tianjie Xu98333a82017-09-22 21:29:29 -070095const char kMetricSuccessfulUpdateUpdatesAbandonedCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -080096 "UpdateEngine.SuccessfulUpdate.UpdatesAbandonedCount";
Tianjie Xu98333a82017-09-22 21:29:29 -070097const char kMetricSuccessfulUpdateUrlSwitchCount[] =
David Zeuthen33bae492014-02-25 16:16:18 -080098 "UpdateEngine.SuccessfulUpdate.UrlSwitchCount";
99
David Zeuthen96197df2014-04-16 12:22:39 -0700100// UpdateEngine.Rollback.* metric.
Tianjie Xu98333a82017-09-22 21:29:29 -0700101const char kMetricRollbackResult[] = "UpdateEngine.Rollback.Result";
David Zeuthen96197df2014-04-16 12:22:39 -0700102
Alex Deymoc1c17b42015-11-23 03:53:15 -0300103// UpdateEngine.CertificateCheck.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -0700104const char kMetricCertificateCheckUpdateCheck[] =
Alex Deymoc1c17b42015-11-23 03:53:15 -0300105 "UpdateEngine.CertificateCheck.UpdateCheck";
Tianjie Xu98333a82017-09-22 21:29:29 -0700106const char kMetricCertificateCheckDownload[] =
Alex Deymoc1c17b42015-11-23 03:53:15 -0300107 "UpdateEngine.CertificateCheck.Download";
108
David Zeuthen33bae492014-02-25 16:16:18 -0800109// UpdateEngine.* metrics.
Tianjie Xu98333a82017-09-22 21:29:29 -0700110const char kMetricFailedUpdateCount[] = "UpdateEngine.FailedUpdateCount";
111const char kMetricInstallDateProvisioningSource[] =
David Zeuthen33bae492014-02-25 16:16:18 -0800112 "UpdateEngine.InstallDateProvisioningSource";
Tianjie Xu98333a82017-09-22 21:29:29 -0700113const char kMetricTimeToRebootMinutes[] = "UpdateEngine.TimeToRebootMinutes";
114
115} // namespace metrics
116
117MetricsReporterOmaha::MetricsReporterOmaha()
118 : metrics_lib_(new MetricsLibrary()) {}
David Zeuthen33bae492014-02-25 16:16:18 -0800119
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700120void MetricsReporterOmaha::Initialize() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700121 metrics_lib_->Init();
David Zeuthen33bae492014-02-25 16:16:18 -0800122}
123
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700124void MetricsReporterOmaha::ReportDailyMetrics(base::TimeDelta os_age) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700125 string metric = metrics::kMetricDailyOSAgeDays;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700126 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(os_age) << " for metric "
127 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700128 metrics_lib_->SendToUMA(metric,
129 static_cast<int>(os_age.InDays()),
130 0, // min: 0 days
131 6 * 30, // max: 6 months (approx)
132 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700133}
134
135void MetricsReporterOmaha::ReportUpdateCheckMetrics(
136 SystemState* system_state,
137 metrics::CheckResult result,
138 metrics::CheckReaction reaction,
139 metrics::DownloadErrorCode download_error_code) {
David Zeuthen33bae492014-02-25 16:16:18 -0800140 string metric;
141 int value;
142 int max_value;
143
144 if (result != metrics::CheckResult::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700145 metric = metrics::kMetricCheckResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800146 value = static_cast<int>(result);
147 max_value = static_cast<int>(metrics::CheckResult::kNumConstants) - 1;
148 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700149 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800150 }
151 if (reaction != metrics::CheckReaction::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700152 metric = metrics::kMetricCheckReaction;
David Zeuthen33bae492014-02-25 16:16:18 -0800153 value = static_cast<int>(reaction);
154 max_value = static_cast<int>(metrics::CheckReaction::kNumConstants) - 1;
155 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700156 metrics_lib_->SendEnumToUMA(metric, value, max_value);
David Zeuthen33bae492014-02-25 16:16:18 -0800157 }
158 if (download_error_code != metrics::DownloadErrorCode::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700159 metric = metrics::kMetricCheckDownloadErrorCode;
David Zeuthen33bae492014-02-25 16:16:18 -0800160 value = static_cast<int>(download_error_code);
David Zeuthenc0dd0212014-04-04 14:49:49 -0700161 LOG(INFO) << "Sending " << value << " for metric " << metric << " (sparse)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700162 metrics_lib_->SendSparseToUMA(metric, value);
David Zeuthen33bae492014-02-25 16:16:18 -0800163 }
164
165 base::TimeDelta time_since_last;
Alex Deymoa2591792015-11-17 00:39:40 -0300166 if (metrics_utils::WallclockDurationHelper(
167 system_state,
168 kPrefsMetricsCheckLastReportingTime,
169 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700170 metric = metrics::kMetricCheckTimeSinceLastCheckMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800171 LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
172 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700173 metrics_lib_->SendToUMA(metric,
174 time_since_last.InMinutes(),
175 0, // min: 0 min
176 30 * 24 * 60, // max: 30 days
177 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800178 }
179
180 base::TimeDelta uptime_since_last;
181 static int64_t uptime_since_last_storage = 0;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700182 if (metrics_utils::MonotonicDurationHelper(
183 system_state, &uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700184 metric = metrics::kMetricCheckTimeSinceLastCheckUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800185 LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
186 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700187 metrics_lib_->SendToUMA(metric,
188 uptime_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
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700195void MetricsReporterOmaha::ReportAbnormallyTerminatedUpdateAttemptMetrics() {
Tianjie Xu98333a82017-09-22 21:29:29 -0700196 string metric = metrics::kMetricAttemptResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700197 metrics::AttemptResult attempt_result =
198 metrics::AttemptResult::kAbnormalTermination;
David Zeuthen4e1d1492014-04-25 13:12:27 -0700199
200 LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700201 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700202 metrics_lib_->SendEnumToUMA(
David Zeuthen4e1d1492014-04-25 13:12:27 -0700203 metric,
204 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700205 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen4e1d1492014-04-25 13:12:27 -0700206}
207
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700208void MetricsReporterOmaha::ReportUpdateAttemptMetrics(
209 SystemState* system_state,
David Zeuthen33bae492014-02-25 16:16:18 -0800210 int attempt_number,
211 PayloadType payload_type,
212 base::TimeDelta duration,
213 base::TimeDelta duration_uptime,
214 int64_t payload_size,
215 int64_t payload_bytes_downloaded,
216 int64_t payload_download_speed_bps,
217 DownloadSource download_source,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700218 metrics::AttemptResult attempt_result,
David Zeuthen33bae492014-02-25 16:16:18 -0800219 ErrorCode internal_error_code,
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700220 metrics::DownloadErrorCode payload_download_error_code,
221 metrics::ConnectionType connection_type) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700222 string metric = metrics::kMetricAttemptNumber;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700223 LOG(INFO) << "Uploading " << attempt_number << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700224 metrics_lib_->SendToUMA(metric,
225 attempt_number,
226 0, // min: 0 attempts
227 49, // max: 49 attempts
228 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800229
Tianjie Xu98333a82017-09-22 21:29:29 -0700230 metric = metrics::kMetricAttemptPayloadType;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700231 LOG(INFO) << "Uploading " << utils::ToString(payload_type) << " for metric "
232 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700233 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
David Zeuthen33bae492014-02-25 16:16:18 -0800234
Tianjie Xu98333a82017-09-22 21:29:29 -0700235 metric = metrics::kMetricAttemptDurationMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800236 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700237 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700238 metrics_lib_->SendToUMA(metric,
239 duration.InMinutes(),
240 0, // min: 0 min
241 10 * 24 * 60, // max: 10 days
242 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800243
Tianjie Xu98333a82017-09-22 21:29:29 -0700244 metric = metrics::kMetricAttemptDurationUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800245 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration_uptime)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700246 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700247 metrics_lib_->SendToUMA(metric,
248 duration_uptime.InMinutes(),
249 0, // min: 0 min
250 10 * 24 * 60, // max: 10 days
251 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800252
Tianjie Xu98333a82017-09-22 21:29:29 -0700253 metric = metrics::kMetricAttemptPayloadSizeMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800254 int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700255 LOG(INFO) << "Uploading " << payload_size_mib << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700256 metrics_lib_->SendToUMA(metric,
257 payload_size_mib,
258 0, // min: 0 MiB
259 1024, // max: 1024 MiB = 1 GiB
260 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800261
Tianjie Xu98333a82017-09-22 21:29:29 -0700262 metric = metrics::kMetricAttemptPayloadBytesDownloadedMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800263 int64_t payload_bytes_downloaded_mib =
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700264 payload_bytes_downloaded / kNumBytesInOneMiB;
265 LOG(INFO) << "Uploading " << payload_bytes_downloaded_mib << " for metric "
266 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700267 metrics_lib_->SendToUMA(metric,
268 payload_bytes_downloaded_mib,
269 0, // min: 0 MiB
270 1024, // max: 1024 MiB = 1 GiB
271 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800272
Tianjie Xu98333a82017-09-22 21:29:29 -0700273 metric = metrics::kMetricAttemptPayloadDownloadSpeedKBps;
David Zeuthen33bae492014-02-25 16:16:18 -0800274 int64_t payload_download_speed_kbps = payload_download_speed_bps / 1000;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700275 LOG(INFO) << "Uploading " << payload_download_speed_kbps << " for metric "
276 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700277 metrics_lib_->SendToUMA(metric,
278 payload_download_speed_kbps,
279 0, // min: 0 kB/s
280 10 * 1000, // max: 10000 kB/s = 10 MB/s
281 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800282
Tianjie Xu98333a82017-09-22 21:29:29 -0700283 metric = metrics::kMetricAttemptDownloadSource;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700284 LOG(INFO) << "Uploading " << download_source << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700285 metrics_lib_->SendEnumToUMA(metric, download_source, kNumDownloadSources);
David Zeuthen33bae492014-02-25 16:16:18 -0800286
Tianjie Xu98333a82017-09-22 21:29:29 -0700287 metric = metrics::kMetricAttemptResult;
David Zeuthen33bae492014-02-25 16:16:18 -0800288 LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700289 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700290 metrics_lib_->SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800291 metric,
292 static_cast<int>(attempt_result),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700293 static_cast<int>(metrics::AttemptResult::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800294
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700295 if (internal_error_code != ErrorCode::kSuccess) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700296 metric = metrics::kMetricAttemptInternalErrorCode;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700297 LOG(INFO) << "Uploading " << internal_error_code << " for metric "
298 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700299 metrics_lib_->SendEnumToUMA(metric,
300 static_cast<int>(internal_error_code),
301 static_cast<int>(ErrorCode::kUmaReportedMax));
David Zeuthen33bae492014-02-25 16:16:18 -0800302 }
303
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700304 if (payload_download_error_code != metrics::DownloadErrorCode::kUnset) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700305 metric = metrics::kMetricAttemptDownloadErrorCode;
David Zeuthen33bae492014-02-25 16:16:18 -0800306 LOG(INFO) << "Uploading " << static_cast<int>(payload_download_error_code)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700307 << " for metric " << metric << " (sparse)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700308 metrics_lib_->SendSparseToUMA(
309 metric, static_cast<int>(payload_download_error_code));
David Zeuthen33bae492014-02-25 16:16:18 -0800310 }
311
312 base::TimeDelta time_since_last;
Alex Deymoa2591792015-11-17 00:39:40 -0300313 if (metrics_utils::WallclockDurationHelper(
314 system_state,
315 kPrefsMetricsAttemptLastReportingTime,
316 &time_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700317 metric = metrics::kMetricAttemptTimeSinceLastAttemptMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800318 LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
319 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700320 metrics_lib_->SendToUMA(metric,
321 time_since_last.InMinutes(),
322 0, // min: 0 min
323 30 * 24 * 60, // max: 30 days
324 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800325 }
326
327 static int64_t uptime_since_last_storage = 0;
328 base::TimeDelta uptime_since_last;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700329 if (metrics_utils::MonotonicDurationHelper(
330 system_state, &uptime_since_last_storage, &uptime_since_last)) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700331 metric = metrics::kMetricAttemptTimeSinceLastAttemptUptimeMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800332 LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
333 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700334 metrics_lib_->SendToUMA(metric,
335 uptime_since_last.InMinutes(),
336 0, // min: 0 min
337 30 * 24 * 60, // max: 30 days
338 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800339 }
David Zeuthenb281f072014-04-02 10:20:19 -0700340
Tianjie Xu98333a82017-09-22 21:29:29 -0700341 metric = metrics::kMetricAttemptConnectionType;
David Zeuthenb281f072014-04-02 10:20:19 -0700342 LOG(INFO) << "Uploading " << static_cast<int>(connection_type)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700343 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700344 metrics_lib_->SendEnumToUMA(
David Zeuthenb281f072014-04-02 10:20:19 -0700345 metric,
346 static_cast<int>(connection_type),
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700347 static_cast<int>(metrics::ConnectionType::kNumConstants));
David Zeuthen33bae492014-02-25 16:16:18 -0800348}
349
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700350void MetricsReporterOmaha::ReportSuccessfulUpdateMetrics(
351 int attempt_count,
352 int updates_abandoned_count,
353 PayloadType payload_type,
354 int64_t payload_size,
355 int64_t num_bytes_downloaded[kNumDownloadSources],
356 int download_overhead_percentage,
357 base::TimeDelta total_duration,
358 int reboot_count,
359 int url_switch_count) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700360 string metric = metrics::kMetricSuccessfulUpdatePayloadSizeMiB;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700361 int64_t mbs = payload_size / kNumBytesInOneMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800362 LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700363 metrics_lib_->SendToUMA(metric,
364 mbs,
365 0, // min: 0 MiB
366 1024, // max: 1024 MiB = 1 GiB
367 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800368
369 int64_t total_bytes = 0;
370 int download_sources_used = 0;
371 for (int i = 0; i < kNumDownloadSources + 1; i++) {
372 DownloadSource source = static_cast<DownloadSource>(i);
373
374 // Only consider this download source (and send byte counts) as
375 // having been used if we downloaded a non-trivial amount of bytes
Alex Vakulenko072359c2014-07-18 11:41:07 -0700376 // (e.g. at least 1 MiB) that contributed to the
David Zeuthen33bae492014-02-25 16:16:18 -0800377 // update. Otherwise we're going to end up with a lot of zero-byte
378 // events in the histogram.
379
Tianjie Xu98333a82017-09-22 21:29:29 -0700380 metric = metrics::kMetricSuccessfulUpdateBytesDownloadedMiB;
David Zeuthen33bae492014-02-25 16:16:18 -0800381 if (i < kNumDownloadSources) {
382 metric += utils::ToString(source);
383 mbs = num_bytes_downloaded[i] / kNumBytesInOneMiB;
384 total_bytes += num_bytes_downloaded[i];
385 if (mbs > 0)
386 download_sources_used |= (1 << i);
387 } else {
388 mbs = total_bytes / kNumBytesInOneMiB;
389 }
390
391 if (mbs > 0) {
392 LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700393 metrics_lib_->SendToUMA(metric,
394 mbs,
395 0, // min: 0 MiB
396 1024, // max: 1024 MiB = 1 GiB
397 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800398 }
399 }
400
Tianjie Xu98333a82017-09-22 21:29:29 -0700401 metric = metrics::kMetricSuccessfulUpdateDownloadSourcesUsed;
David Zeuthen33bae492014-02-25 16:16:18 -0800402 LOG(INFO) << "Uploading 0x" << std::hex << download_sources_used
403 << " (bit flags) for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700404 metrics_lib_->SendToUMA(metric,
405 download_sources_used,
406 0, // min
407 (1 << kNumDownloadSources) - 1, // max
408 1 << kNumDownloadSources); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800409
Tianjie Xu98333a82017-09-22 21:29:29 -0700410 metric = metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700411 LOG(INFO) << "Uploading " << download_overhead_percentage << "% for metric "
412 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700413 metrics_lib_->SendToUMA(metric,
414 download_overhead_percentage,
415 0, // min: 0% overhead
416 1000, // max: 1000% overhead
417 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800418
Tianjie Xu98333a82017-09-22 21:29:29 -0700419 metric = metrics::kMetricSuccessfulUpdateUrlSwitchCount;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700420 LOG(INFO) << "Uploading " << url_switch_count << " (count) for metric "
421 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700422 metrics_lib_->SendToUMA(metric,
423 url_switch_count,
424 0, // min: 0 URL switches
425 49, // max: 49 URL switches
426 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800427
Tianjie Xu98333a82017-09-22 21:29:29 -0700428 metric = metrics::kMetricSuccessfulUpdateTotalDurationMinutes;
David Zeuthen33bae492014-02-25 16:16:18 -0800429 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(total_duration)
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700430 << " for metric " << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700431 metrics_lib_->SendToUMA(metric,
432 static_cast<int>(total_duration.InMinutes()),
433 0, // min: 0 min
434 365 * 24 * 60, // max: 365 days ~= 1 year
435 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800436
Tianjie Xu98333a82017-09-22 21:29:29 -0700437 metric = metrics::kMetricSuccessfulUpdateRebootCount;
David Zeuthen33bae492014-02-25 16:16:18 -0800438 LOG(INFO) << "Uploading reboot count of " << reboot_count << " for metric "
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700439 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700440 metrics_lib_->SendToUMA(metric,
441 reboot_count,
442 0, // min: 0 reboots
443 49, // max: 49 reboots
444 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800445
Tianjie Xu98333a82017-09-22 21:29:29 -0700446 metric = metrics::kMetricSuccessfulUpdatePayloadType;
447 metrics_lib_->SendEnumToUMA(metric, payload_type, kNumPayloadTypes);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700448 LOG(INFO) << "Uploading " << utils::ToString(payload_type) << " for metric "
449 << metric;
David Zeuthen33bae492014-02-25 16:16:18 -0800450
Tianjie Xu98333a82017-09-22 21:29:29 -0700451 metric = metrics::kMetricSuccessfulUpdateAttemptCount;
452 metrics_lib_->SendToUMA(metric,
453 attempt_count,
454 1, // min: 1 attempt
455 50, // max: 50 attempts
456 50); // num_buckets
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700457 LOG(INFO) << "Uploading " << attempt_count << " for metric " << metric;
David Zeuthen33bae492014-02-25 16:16:18 -0800458
Tianjie Xu98333a82017-09-22 21:29:29 -0700459 metric = metrics::kMetricSuccessfulUpdateUpdatesAbandonedCount;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700460 LOG(INFO) << "Uploading " << updates_abandoned_count << " (count) for metric "
461 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700462 metrics_lib_->SendToUMA(metric,
463 updates_abandoned_count,
464 0, // min: 0 counts
465 49, // max: 49 counts
466 50); // num_buckets
David Zeuthen33bae492014-02-25 16:16:18 -0800467}
468
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700469void MetricsReporterOmaha::ReportRollbackMetrics(
470 metrics::RollbackResult result) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700471 string metric = metrics::kMetricRollbackResult;
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700472 int value = static_cast<int>(result);
David Zeuthen96197df2014-04-16 12:22:39 -0700473 LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
Tianjie Xu98333a82017-09-22 21:29:29 -0700474 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700475 metric, value, static_cast<int>(metrics::RollbackResult::kNumConstants));
David Zeuthen96197df2014-04-16 12:22:39 -0700476}
477
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700478void MetricsReporterOmaha::ReportCertificateCheckMetrics(
479 ServerToCheck server_to_check, CertificateCheckResult result) {
Alex Deymoc1c17b42015-11-23 03:53:15 -0300480 string metric;
481 switch (server_to_check) {
482 case ServerToCheck::kUpdate:
Tianjie Xu98333a82017-09-22 21:29:29 -0700483 metric = metrics::kMetricCertificateCheckUpdateCheck;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300484 break;
485 case ServerToCheck::kDownload:
Tianjie Xu98333a82017-09-22 21:29:29 -0700486 metric = metrics::kMetricCertificateCheckDownload;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300487 break;
Alex Deymo33e91e72015-12-01 18:26:08 -0300488 case ServerToCheck::kNone:
489 return;
Alex Deymoc1c17b42015-11-23 03:53:15 -0300490 }
491 LOG(INFO) << "Uploading " << static_cast<int>(result) << " for metric "
492 << metric;
Tianjie Xu98333a82017-09-22 21:29:29 -0700493 metrics_lib_->SendEnumToUMA(
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700494 metric,
495 static_cast<int>(result),
Alex Deymoc1c17b42015-11-23 03:53:15 -0300496 static_cast<int>(CertificateCheckResult::kNumConstants));
497}
498
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700499void MetricsReporterOmaha::ReportFailedUpdateCount(int target_attempt) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700500 string metric = metrics::kMetricFailedUpdateCount;
501 metrics_lib_->SendToUMA(metric,
502 target_attempt,
503 1, // min value
504 50, // max value
505 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700506
507 LOG(INFO) << "Uploading " << target_attempt << " (count) for metric "
508 << metric;
509}
510
511void MetricsReporterOmaha::ReportTimeToReboot(int time_to_reboot_minutes) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700512 string metric = metrics::kMetricTimeToRebootMinutes;
513 metrics_lib_->SendToUMA(metric,
514 time_to_reboot_minutes,
515 0, // min: 0 minute
516 30 * 24 * 60, // max: 1 month (approx)
517 kNumDefaultUmaBuckets);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700518
519 LOG(INFO) << "Uploading " << time_to_reboot_minutes << " for metric "
520 << metric;
521}
522
523void MetricsReporterOmaha::ReportInstallDateProvisioningSource(int source,
524 int max) {
Tianjie Xu98333a82017-09-22 21:29:29 -0700525 metrics_lib_->SendEnumToUMA(metrics::kMetricInstallDateProvisioningSource,
526 source, // Sample.
527 max);
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700528}
David Zeuthen33bae492014-02-25 16:16:18 -0800529
530} // namespace chromeos_update_engine