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
20d4c5debc65bb35ee61c2764bda059b7f307fd093Tianjie Xu#include <memory>
21d4c5debc65bb35ee61c2764bda059b7f307fd093Tianjie Xu
22282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include <base/time/time.h>
23282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
24282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/common/constants.h"
25282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/common/error_code.h"
26282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/metrics_constants.h"
27282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/system_state.h"
28282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
29282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xunamespace chromeos_update_engine {
30282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
311b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xuenum class ServerToCheck;
321b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xuenum class CertificateCheckResult;
331b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xu
34d4c5debc65bb35ee61c2764bda059b7f307fd093Tianjie Xunamespace metrics {
35d4c5debc65bb35ee61c2764bda059b7f307fd093Tianjie Xu
36d4c5debc65bb35ee61c2764bda059b7f307fd093Tianjie Xustd::unique_ptr<MetricsReporterInterface> CreateMetricsReporter();
37d4c5debc65bb35ee61c2764bda059b7f307fd093Tianjie Xu
38d4c5debc65bb35ee61c2764bda059b7f307fd093Tianjie Xu}  // namespace metrics
39d4c5debc65bb35ee61c2764bda059b7f307fd093Tianjie Xu
40282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xuclass MetricsReporterInterface {
41282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu public:
42282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual ~MetricsReporterInterface() = default;
43282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
44282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void Initialize() = 0;
45282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
46282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report metrics related to rollback. The
47282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // following metrics are reported:
48282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
49282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricRollbackResult|
50282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportRollbackMetrics(metrics::RollbackResult result) = 0;
51282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
52282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report metrics reported once a day. The
53282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // following metrics are reported:
54282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
55282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricDailyOSAgeDays|
56282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportDailyMetrics(base::TimeDelta os_age) = 0;
57282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
58282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report metrics after completing an update check
59282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // with the ChromeOS update server ("Omaha"). The following metrics
60282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // are reported:
61282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
62282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckResult|
63282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckReaction|
64282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckDownloadErrorCode|
65282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckTimeSinceLastCheckMinutes|
66282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCheckTimeSinceLastCheckUptimeMinutes|
67282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
68282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricCheckResult| metric will only be reported if |result|
69282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // is not |kUnset|.
70282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
71282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricCheckReaction| metric will only be reported if
72282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |reaction| is not |kUnset|.
73282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
74282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricCheckDownloadErrorCode| will only be reported if
75282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |download_error_code| is not |kUnset|.
76282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
77282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The values for the |kMetricCheckTimeSinceLastCheckMinutes| and
78282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricCheckTimeSinceLastCheckUptimeMinutes| metrics are
79282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // automatically reported and calculated by maintaining persistent
80282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // and process-local state variables.
81282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportUpdateCheckMetrics(
82282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      SystemState* system_state,
83282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::CheckResult result,
84282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::CheckReaction reaction,
85282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::DownloadErrorCode download_error_code) = 0;
86282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
87282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report metrics after the completion of each
88282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // update attempt. The following metrics are reported:
89282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
90282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptNumber|
91282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptPayloadType|
92282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptPayloadSizeMiB|
931b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xu  //  |kMetricAttemptDurationMinutes|
941b66114d367d1b85b4397bb559e274dbd0ebcd31Tianjie Xu  //  |kMetricAttemptDurationUptimeMinutes|
95282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptTimeSinceLastAttemptMinutes|
96282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptTimeSinceLastAttemptUptimeMinutes|
97282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptResult|
98282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricAttemptInternalErrorCode|
99282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
100282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricAttemptInternalErrorCode| metric will only be reported
101282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // if |internal_error_code| is not |kErrorSuccess|.
102282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
103282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The |kMetricAttemptDownloadErrorCode| metric will only be
104282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // reported if |payload_download_error_code| is not |kUnset|.
105282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
106282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The values for the |kMetricAttemptTimeSinceLastAttemptMinutes| and
107282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricAttemptTimeSinceLastAttemptUptimeMinutes| metrics are
108282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // automatically calculated and reported by maintaining persistent and
109282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // process-local state variables.
1101f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  virtual void ReportUpdateAttemptMetrics(SystemState* system_state,
1111f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          int attempt_number,
1121f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          PayloadType payload_type,
1131f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          base::TimeDelta duration,
1141f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          base::TimeDelta duration_uptime,
1151f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          int64_t payload_size,
1161f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          metrics::AttemptResult attempt_result,
1171f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu                                          ErrorCode internal_error_code) = 0;
1181f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu
1191f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // Helper function to report download metrics after the completion of each
1201f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // update attempt. The following metrics are reported:
1211f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  //
1221f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptPayloadBytesDownloadedMiB|
1231f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptPayloadDownloadSpeedKBps|
1241f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptDownloadSource|
1251f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptDownloadErrorCode|
1261f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  // |kMetricAttemptConnectionType|
1271f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu  virtual void ReportUpdateAttemptDownloadMetrics(
128282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int64_t payload_bytes_downloaded,
129282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int64_t payload_download_speed_bps,
130282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      DownloadSource download_source,
131282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::DownloadErrorCode payload_download_error_code,
132282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      metrics::ConnectionType connection_type) = 0;
133282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
134282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Reports the |kAbnormalTermination| for the |kMetricAttemptResult|
135282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // metric. No other metrics in the UpdateEngine.Attempt.* namespace
136282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // will be reported.
137282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportAbnormallyTerminatedUpdateAttemptMetrics() = 0;
138282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
139282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the after the completion of a successful
140282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // update attempt. The following metrics are reported:
141282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
142282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateAttemptCount|
143282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateUpdatesAbandonedCount|
144282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdatePayloadType|
145282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdatePayloadSizeMiB|
146282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpsServer|
147282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpServer|
148282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpPeer|
149282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateBytesDownloadedMiB|
150282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateDownloadSourcesUsed|
151282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateDownloadOverheadPercentage|
152282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateTotalDurationMinutes|
153282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateRebootCount|
154282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricSuccessfulUpdateUrlSwitchCount|
155282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
156282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // The values for the |kMetricSuccessfulUpdateDownloadSourcesUsed| are
157282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricSuccessfulUpdateBytesDownloadedMiB| metrics automatically
158282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // calculated from examining the |num_bytes_downloaded| array.
159282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportSuccessfulUpdateMetrics(
160282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int attempt_count,
161282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int updates_abandoned_count,
162282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      PayloadType payload_type,
163282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int64_t payload_size,
164282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int64_t num_bytes_downloaded[kNumDownloadSources],
165282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int download_overhead_percentage,
166282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      base::TimeDelta total_duration,
167282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int reboot_count,
168282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu      int url_switch_count) = 0;
169282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
170282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the after the completion of a SSL certificate
171282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // check. One of the following metrics is reported:
172282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
173282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCertificateCheckUpdateCheck|
174282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //  |kMetricCertificateCheckDownload|
175282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportCertificateCheckMetrics(ServerToCheck server_to_check,
176282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu                                             CertificateCheckResult result) = 0;
177282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
178282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the number failed update attempts. The following
179282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // metrics are reported:
180282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
181282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricFailedUpdateCount|
182282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportFailedUpdateCount(int target_attempt) = 0;
183282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
184282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the time interval in minutes between a
185282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // successful update and the reboot into the updated system. The following
186282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // metrics are reported:
187282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
188282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricTimeToRebootMinutes|
189282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportTimeToReboot(int time_to_reboot_minutes) = 0;
190282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
191282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // Helper function to report the source of installation data. The following
192282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // metrics are reported:
193282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  //
194282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  // |kMetricInstallDateProvisioningSource|
195282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu  virtual void ReportInstallDateProvisioningSource(int source, int max) = 0;
196282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu};
197282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
198282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu}  // namespace chromeos_update_engine
199282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu
200282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#endif  // UPDATE_ENGINE_METRICS_REPORTER_INTERFACE_H_
201