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_OMAHA_H_ 18282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#define UPDATE_ENGINE_METRICS_REPORTER_OMAHA_H_ 19282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 2098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu#include <memory> 2198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 22282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include <base/time/time.h> 23282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include <metrics/metrics_library.h> 24282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 25282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/certificate_checker.h" 26282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/common/constants.h" 27282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/common/error_code.h" 28282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/metrics_constants.h" 29282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/metrics_reporter_interface.h" 30282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#include "update_engine/system_state.h" 31282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 32282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xunamespace chromeos_update_engine { 33282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 34282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xuclass SystemState; 35282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 3698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xunamespace metrics { 3798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 3898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// UpdateEngine.Daily.* metrics. 3998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricDailyOSAgeDays[]; 4098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 4198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// UpdateEngine.Check.* metrics. 4298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricCheckDownloadErrorCode[]; 4398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricCheckReaction[]; 4498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricCheckResult[]; 4598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricCheckTimeSinceLastCheckMinutes[]; 4698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricCheckTimeSinceLastCheckUptimeMinutes[]; 4798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 4898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// UpdateEngine.Attempt.* metrics. 4998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptNumber[]; 5098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptPayloadType[]; 5198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptPayloadSizeMiB[]; 5298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptConnectionType[]; 5398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptDurationMinutes[]; 5498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptDurationUptimeMinutes[]; 5598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptTimeSinceLastAttemptMinutes[]; 5698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptTimeSinceLastAttemptUptimeMinutes[]; 5798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptPayloadBytesDownloadedMiB[]; 5898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptPayloadDownloadSpeedKBps[]; 5998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptDownloadSource[]; 6098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptResult[]; 6198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptInternalErrorCode[]; 6298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricAttemptDownloadErrorCode[]; 6398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 6498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// UpdateEngine.SuccessfulUpdate.* metrics. 6598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdateAttemptCount[]; 6698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdateBytesDownloadedMiB[]; 6798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdateDownloadOverheadPercentage[]; 6898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdateDownloadSourcesUsed[]; 6998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdatePayloadType[]; 7098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdatePayloadSizeMiB[]; 7198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdateRebootCount[]; 7298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdateTotalDurationMinutes[]; 7398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdateUpdatesAbandonedCount[]; 7498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricSuccessfulUpdateUrlSwitchCount[]; 7598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 7698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// UpdateEngine.Rollback.* metric. 7798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricRollbackResult[]; 7898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 7998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// UpdateEngine.CertificateCheck.* metrics. 8098333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricCertificateCheckUpdateCheck[]; 8198333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricCertificateCheckDownload[]; 8298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 8398333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu// UpdateEngine.* metrics. 8498333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricFailedUpdateCount[]; 8598333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricInstallDateProvisioningSource[]; 8698333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xuextern const char kMetricTimeToRebootMinutes[]; 8798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 8898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu} // namespace metrics 8998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 90282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xuclass MetricsReporterOmaha : public MetricsReporterInterface { 91282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu public: 9298333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu MetricsReporterOmaha(); 93282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 94282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu ~MetricsReporterOmaha() override = default; 95282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 96282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void Initialize() override; 97282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 98282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportRollbackMetrics(metrics::RollbackResult result) override; 99282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 100282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportDailyMetrics(base::TimeDelta os_age) override; 101282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 102282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportUpdateCheckMetrics( 103282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu SystemState* system_state, 104282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu metrics::CheckResult result, 105282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu metrics::CheckReaction reaction, 106282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu metrics::DownloadErrorCode download_error_code) override; 107282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 1081f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu void ReportUpdateAttemptMetrics(SystemState* system_state, 1091f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu int attempt_number, 1101f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu PayloadType payload_type, 1111f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu base::TimeDelta duration, 1121f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu base::TimeDelta duration_uptime, 1131f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu int64_t payload_size, 1141f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu metrics::AttemptResult attempt_result, 1151f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu ErrorCode internal_error_code) override; 1161f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu 1171f93d098d6d6c341ed7471352fda80c936471a17Tianjie Xu void ReportUpdateAttemptDownloadMetrics( 118282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int64_t payload_bytes_downloaded, 119282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int64_t payload_download_speed_bps, 120282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu DownloadSource download_source, 121282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu metrics::DownloadErrorCode payload_download_error_code, 122282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu metrics::ConnectionType connection_type) override; 123282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 124282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportAbnormallyTerminatedUpdateAttemptMetrics() override; 125282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 126282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportSuccessfulUpdateMetrics( 127282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int attempt_count, 128282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int updates_abandoned_count, 129282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu PayloadType payload_type, 130282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int64_t payload_size, 131282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int64_t num_bytes_downloaded[kNumDownloadSources], 132282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int download_overhead_percentage, 133282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu base::TimeDelta total_duration, 134282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int reboot_count, 135282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu int url_switch_count) override; 136282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 137282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportCertificateCheckMetrics(ServerToCheck server_to_check, 138282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu CertificateCheckResult result) override; 139282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 140282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportFailedUpdateCount(int target_attempt) override; 141282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 142282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportTimeToReboot(int time_to_reboot_minutes) override; 143282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 144282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu void ReportInstallDateProvisioningSource(int source, int max) override; 145282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 146282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu private: 14798333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu friend class MetricsReporterOmahaTest; 14898333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu 14998333a8a1aa7c8197b350b113a9912baab4a051fTianjie Xu std::unique_ptr<MetricsLibraryInterface> metrics_lib_; 150282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 151282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu DISALLOW_COPY_AND_ASSIGN(MetricsReporterOmaha); 152282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu}; // class metrics 153282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 154282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu} // namespace chromeos_update_engine 155282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu 156282aa1f89de19d7052d844b0f7c53fedc04b802eTianjie Xu#endif // UPDATE_ENGINE_METRICS_REPORTER_OMAHA_H_ 157