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