metrics_reporter_interface.h revision 1f93d098d6d6c341ed7471352fda80c936471a17
1282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu//
2282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// Copyright (C) 2017 The Android Open Source Project
3282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu//
4282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// Licensed under the Apache License, Version 2.0 (the "License");
5282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// you may not use this file except in compliance with the License.
6282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// You may obtain a copy of the License at
7282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu//
8282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu//      http://www.apache.org/licenses/LICENSE-2.0
9282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu//
10282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// Unless required by applicable law or agreed to in writing, software
11282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// distributed under the License is distributed on an "AS IS" BASIS,
12282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// See the License for the specific language governing permissions and
14282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu// limitations under the License.
15282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu//
16282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
17282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#ifndef UPDATE_ENGINE_METRICS_REPORTER_INTERFACE_H_
18282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#define UPDATE_ENGINE_METRICS_REPORTER_INTERFACE_H_
19282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
20282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include <base/time/time.h>
21282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
22282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/common/constants.h"
23282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/common/error_code.h"
24282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/metrics_constants.h"
25282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/system_state.h"
26282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
27282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xunamespace chromeos_update_engine {
28282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
291b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xuenum class ServerToCheck;
301b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xuenum class CertificateCheckResult;
311b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xu
32282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xuclass MetricsReporterInterface {
33282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu public:
34282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual ~MetricsReporterInterface() = default;
35282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
36282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void Initialize() = 0;
37282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
38282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report metrics related to rollback. The
39282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // following metrics are reported:
40282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
41282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricRollbackResult|
42282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportRollbackMetrics(metrics::RollbackResult result) = 0;
43282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
44282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report metrics reported once a day. The
45282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // following metrics are reported:
46282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
47282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricDailyOSAgeDays|
48282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportDailyMetrics(base::TimeDelta os_age) = 0;
49282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
50282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report metrics after completing an update check
51282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // with the ChromeOS update server ("Omaha"). The following metrics
52282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // are reported:
53282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
54282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckResult|
55282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckReaction|
56282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckDownloadErrorCode|
57282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckTimeSinceLastCheckMinutes|
58282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckTimeSinceLastCheckUptimeMinutes|
59282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
60282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricCheckResult| metric will only be reported if |result|
61282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // is not |kUnset|.
62282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
63282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricCheckReaction| metric will only be reported if
64282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |reaction| is not |kUnset|.
65282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
66282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricCheckDownloadErrorCode| will only be reported if
67282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |download_error_code| is not |kUnset|.
68282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
69282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The values for the |kMetricCheckTimeSinceLastCheckMinutes| and
70282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricCheckTimeSinceLastCheckUptimeMinutes| metrics are
71282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // automatically reported and calculated by maintaining persistent
72282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // and process-local state variables.
73282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportUpdateCheckMetrics(
74282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      SystemState* system_state,
75282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::CheckResult result,
76282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::CheckReaction reaction,
77282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::DownloadErrorCode download_error_code) = 0;
78282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
79282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report metrics after the completion of each
80282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // update attempt. The following metrics are reported:
81282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
82282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptNumber|
83282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptPayloadType|
84282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptPayloadSizeMiB|
851b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xu  //  |kMetricAttemptDurationMinutes|
861b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xu  //  |kMetricAttemptDurationUptimeMinutes|
87282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptTimeSinceLastAttemptMinutes|
88282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptTimeSinceLastAttemptUptimeMinutes|
89282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptResult|
90282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptInternalErrorCode|
91282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
92282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricAttemptInternalErrorCode| metric will only be reported
93282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // if |internal_error_code| is not |kErrorSuccess|.
94282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
95282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricAttemptDownloadErrorCode| metric will only be
96282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // reported if |payload_download_error_code| is not |kUnset|.
97282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
98282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The values for the |kMetricAttemptTimeSinceLastAttemptMinutes| and
99282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricAttemptTimeSinceLastAttemptUptimeMinutes| metrics are
100282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // automatically calculated and reported by maintaining persistent and
101282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // process-local state variables.
1021f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  virtual void ReportUpdateAttemptMetrics(SystemState* system_state,
1031f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          int attempt_number,
1041f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          PayloadType payload_type,
1051f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          base::TimeDelta duration,
1061f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          base::TimeDelta duration_uptime,
1071f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          int64_t payload_size,
1081f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          metrics::AttemptResult attempt_result,
1091f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          ErrorCode internal_error_code) = 0;
1101f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu
1111f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // Helper function to report download metrics after the completion of each
1121f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // update attempt. The following metrics are reported:
1131f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  //
1141f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptPayloadBytesDownloadedMiB|
1151f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptPayloadDownloadSpeedKBps|
1161f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptDownloadSource|
1171f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptDownloadErrorCode|
1181f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptConnectionType|
1191f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  virtual void ReportUpdateAttemptDownloadMetrics(
120282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int64_t payload_bytes_downloaded,
121282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int64_t payload_download_speed_bps,
122282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      DownloadSource download_source,
123282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::DownloadErrorCode payload_download_error_code,
124282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::ConnectionType connection_type) = 0;
125282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
126282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Reports the |kAbnormalTermination| for the |kMetricAttemptResult|
127282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // metric. No other metrics in the UpdateEngine.Attempt.* namespace
128282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // will be reported.
129282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportAbnormallyTerminatedUpdateAttemptMetrics() = 0;
130282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
131282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the after the completion of a successful
132282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // update attempt. The following metrics are reported:
133282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
134282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateAttemptCount|
135282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateUpdatesAbandonedCount|
136282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdatePayloadType|
137282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdatePayloadSizeMiB|
138282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpsServer|
139282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpServer|
140282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpPeer|
141282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateBytesDownloadedMiB|
142282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateDownloadSourcesUsed|
143282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateDownloadOverheadPercentage|
144282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateTotalDurationMinutes|
145282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateRebootCount|
146282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateUrlSwitchCount|
147282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
148282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The values for the |kMetricSuccessfulUpdateDownloadSourcesUsed| are
149282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricSuccessfulUpdateBytesDownloadedMiB| metrics automatically
150282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // calculated from examining the |num_bytes_downloaded| array.
151282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportSuccessfulUpdateMetrics(
152282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int attempt_count,
153282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int updates_abandoned_count,
154282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      PayloadType payload_type,
155282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int64_t payload_size,
156282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int64_t num_bytes_downloaded[kNumDownloadSources],
157282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int download_overhead_percentage,
158282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      base::TimeDelta total_duration,
159282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int reboot_count,
160282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int url_switch_count) = 0;
161282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
162282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the after the completion of a SSL certificate
163282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // check. One of the following metrics is reported:
164282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
165282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCertificateCheckUpdateCheck|
166282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCertificateCheckDownload|
167282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportCertificateCheckMetrics(ServerToCheck server_to_check,
168282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu                                             CertificateCheckResult result) = 0;
169282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
170282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the number failed update attempts. The following
171282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // metrics are reported:
172282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
173282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricFailedUpdateCount|
174282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportFailedUpdateCount(int target_attempt) = 0;
175282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
176282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the time interval in minutes between a
177282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // successful update and the reboot into the updated system. The following
178282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // metrics are reported:
179282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
180282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricTimeToRebootMinutes|
181282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportTimeToReboot(int time_to_reboot_minutes) = 0;
182282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
183282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the source of installation data. The following
184282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // metrics are reported:
185282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
186282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricInstallDateProvisioningSource|
187282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportInstallDateProvisioningSource(int source, int max) = 0;
188282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu};
189282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
190282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu}  // namespace chromeos_update_engine
191282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
192282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#endif  // UPDATE_ENGINE_METRICS_REPORTER_INTERFACE_H_
193