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