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