1 //
2 // Copyright (C) 2017 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //      http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #ifndef UPDATE_ENGINE_CROS_METRICS_REPORTER_OMAHA_H_
18 #define UPDATE_ENGINE_CROS_METRICS_REPORTER_OMAHA_H_
19 
20 #include <memory>
21 #include <string>
22 
23 #include <base/time/time.h>
24 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
25 #include <metrics/metrics_library.h>
26 
27 #include "update_engine/certificate_checker.h"
28 #include "update_engine/common/constants.h"
29 #include "update_engine/common/error_code.h"
30 #include "update_engine/common/metrics_constants.h"
31 #include "update_engine/common/metrics_reporter_interface.h"
32 
33 namespace chromeos_update_engine {
34 
35 class SystemState;
36 
37 namespace metrics {
38 
39 // UpdateEngine.Daily.* metrics.
40 extern const char kMetricDailyOSAgeDays[];
41 
42 // UpdateEngine.Check.* metrics.
43 extern const char kMetricCheckDownloadErrorCode[];
44 extern const char kMetricCheckReaction[];
45 extern const char kMetricCheckResult[];
46 extern const char kMetricCheckTargetVersion[];
47 extern const char kMetricCheckRollbackTargetVersion[];
48 extern const char kMetricCheckTimeSinceLastCheckMinutes[];
49 extern const char kMetricCheckTimeSinceLastCheckUptimeMinutes[];
50 
51 // UpdateEngine.Attempt.* metrics.
52 extern const char kMetricAttemptNumber[];
53 extern const char kMetricAttemptPayloadType[];
54 extern const char kMetricAttemptPayloadSizeMiB[];
55 extern const char kMetricAttemptConnectionType[];
56 extern const char kMetricAttemptDurationMinutes[];
57 extern const char kMetricAttemptDurationUptimeMinutes[];
58 extern const char kMetricAttemptTimeSinceLastAttemptMinutes[];
59 extern const char kMetricAttemptTimeSinceLastAttemptUptimeMinutes[];
60 extern const char kMetricAttemptPayloadBytesDownloadedMiB[];
61 extern const char kMetricAttemptPayloadDownloadSpeedKBps[];
62 extern const char kMetricAttemptDownloadSource[];
63 extern const char kMetricAttemptResult[];
64 extern const char kMetricAttemptInternalErrorCode[];
65 extern const char kMetricAttemptDownloadErrorCode[];
66 
67 // UpdateEngine.SuccessfulUpdate.* metrics.
68 extern const char kMetricSuccessfulUpdateAttemptCount[];
69 extern const char kMetricSuccessfulUpdateBytesDownloadedMiB[];
70 extern const char kMetricSuccessfulUpdateDownloadOverheadPercentage[];
71 extern const char kMetricSuccessfulUpdateDownloadSourcesUsed[];
72 extern const char kMetricSuccessfulUpdateDurationFromSeenDays[];
73 extern const char kMetricSuccessfulUpdateDurationFromSeenTimeRestrictedDays[];
74 extern const char kMetricSuccessfulUpdatePayloadType[];
75 extern const char kMetricSuccessfulUpdatePayloadSizeMiB[];
76 extern const char kMetricSuccessfulUpdateRebootCount[];
77 extern const char kMetricSuccessfulUpdateTotalDurationMinutes[];
78 extern const char kMetricSuccessfulUpdateTotalDurationUptimeMinutes[];
79 extern const char kMetricSuccessfulUpdateUpdatesAbandonedCount[];
80 extern const char kMetricSuccessfulUpdateUrlSwitchCount[];
81 
82 // UpdateEngine.Rollback.* metric.
83 extern const char kMetricRollbackResult[];
84 
85 // UpdateEngine.EnterpriseRollback.* metrics.
86 extern const char kMetricEnterpriseRollbackFailure[];
87 extern const char kMetricEnterpriseRollbackSuccess[];
88 
89 // UpdateEngine.CertificateCheck.* metrics.
90 extern const char kMetricCertificateCheckUpdateCheck[];
91 extern const char kMetricCertificateCheckDownload[];
92 
93 // UpdateEngine.KernelKey.* metrics.
94 extern const char kMetricKernelMinVersion[];
95 extern const char kMetricKernelMaxRollforwardVersion[];
96 extern const char kMetricKernelMaxRollforwardSetSuccess[];
97 
98 // UpdateEngine.* metrics.
99 extern const char kMetricFailedUpdateCount[];
100 extern const char kMetricInstallDateProvisioningSource[];
101 extern const char kMetricTimeToRebootMinutes[];
102 
103 }  // namespace metrics
104 
105 class MetricsReporterOmaha : public MetricsReporterInterface {
106  public:
107   MetricsReporterOmaha();
108 
109   ~MetricsReporterOmaha() override = default;
110 
111   void ReportRollbackMetrics(metrics::RollbackResult result) override;
112 
113   void ReportEnterpriseRollbackMetrics(
114       bool success, const std::string& rollback_version) override;
115 
116   void ReportDailyMetrics(base::TimeDelta os_age) override;
117 
118   void ReportUpdateCheckMetrics(
119       metrics::CheckResult result,
120       metrics::CheckReaction reaction,
121       metrics::DownloadErrorCode download_error_code) override;
122 
123   void ReportUpdateAttemptMetrics(int attempt_number,
124                                   PayloadType payload_type,
125                                   base::TimeDelta duration,
126                                   base::TimeDelta duration_uptime,
127                                   int64_t payload_size,
128                                   metrics::AttemptResult attempt_result,
129                                   ErrorCode internal_error_code) override;
130 
131   void ReportUpdateAttemptDownloadMetrics(
132       int64_t payload_bytes_downloaded,
133       int64_t payload_download_speed_bps,
134       DownloadSource download_source,
135       metrics::DownloadErrorCode payload_download_error_code,
136       metrics::ConnectionType connection_type) override;
137 
138   void ReportAbnormallyTerminatedUpdateAttemptMetrics() override;
139 
140   void ReportSuccessfulUpdateMetrics(
141       int attempt_count,
142       int updates_abandoned_count,
143       PayloadType payload_type,
144       int64_t payload_size,
145       int64_t num_bytes_downloaded[kNumDownloadSources],
146       int download_overhead_percentage,
147       base::TimeDelta total_duration,
148       base::TimeDelta total_duration_uptime,
149       int reboot_count,
150       int url_switch_count) override;
151 
152   void ReportCertificateCheckMetrics(ServerToCheck server_to_check,
153                                      CertificateCheckResult result) override;
154 
155   void ReportFailedUpdateCount(int target_attempt) override;
156 
157   void ReportTimeToReboot(int time_to_reboot_minutes) override;
158 
159   void ReportInstallDateProvisioningSource(int source, int max) override;
160 
161   void ReportInternalErrorCode(ErrorCode error_code) override;
162 
163   void ReportKeyVersionMetrics(int kernel_min_version,
164                                int kernel_max_rollforward_version,
165                                bool kernel_max_rollforward_success) override;
166 
167   void ReportEnterpriseUpdateSeenToDownloadDays(
168       bool has_time_restriction_policy, int time_to_update_days) override;
169 
170  private:
171   friend class MetricsReporterOmahaTest;
172   FRIEND_TEST(MetricsReporterOmahaTest, WallclockDurationHelper);
173   FRIEND_TEST(MetricsReporterOmahaTest, MonotonicDurationHelper);
174 
175   // This function returns the duration on the wallclock since the last
176   // time it was called for the same |state_variable_key| value.
177   //
178   // If the function returns |true|, the duration (always non-negative)
179   // is returned in |out_duration|. If the function returns |false|
180   // something went wrong or there was no previous measurement.
181   bool WallclockDurationHelper(const std::string& state_variable_key,
182                                base::TimeDelta* out_duration);
183 
184   // This function returns the duration on the monotonic clock since the
185   // last time it was called for the same |storage| pointer.
186   //
187   // You should pass a pointer to a 64-bit integer in |storage| which
188   // should be initialized to 0.
189   //
190   // If the function returns |true|, the duration (always non-negative)
191   // is returned in |out_duration|. If the function returns |false|
192   // something went wrong or there was no previous measurement.
193   bool MonotonicDurationHelper(int64_t* storage, base::TimeDelta* out_duration);
194 
195   std::unique_ptr<MetricsLibraryInterface> metrics_lib_;
196 
197   DISALLOW_COPY_AND_ASSIGN(MetricsReporterOmaha);
198 };  // class metrics
199 
200 }  // namespace chromeos_update_engine
201 
202 #endif  // UPDATE_ENGINE_CROS_METRICS_REPORTER_OMAHA_H_
203