|  | // | 
|  | // Copyright (C) 2014 The Android Open Source Project | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  | // | 
|  |  | 
|  | #ifndef UPDATE_ENGINE_METRICS_H_ | 
|  | #define UPDATE_ENGINE_METRICS_H_ | 
|  |  | 
|  | #include <base/time/time.h> | 
|  |  | 
|  | #include "update_engine/certificate_checker.h" | 
|  | #include "update_engine/common/constants.h" | 
|  | #include "update_engine/common/error_code.h" | 
|  |  | 
|  | namespace chromeos_update_engine { | 
|  |  | 
|  | class SystemState; | 
|  |  | 
|  | namespace metrics { | 
|  |  | 
|  | // UpdateEngine.Daily.* metrics. | 
|  | extern const char kMetricDailyOSAgeDays[]; | 
|  |  | 
|  | // UpdateEngine.Check.* metrics. | 
|  | extern const char kMetricCheckDownloadErrorCode[]; | 
|  | extern const char kMetricCheckReaction[]; | 
|  | extern const char kMetricCheckResult[]; | 
|  | extern const char kMetricCheckTimeSinceLastCheckMinutes[]; | 
|  | extern const char kMetricCheckTimeSinceLastCheckUptimeMinutes[]; | 
|  |  | 
|  | // UpdateEngine.Attempt.* metrics. | 
|  | extern const char kMetricAttemptNumber[]; | 
|  | extern const char kMetricAttemptPayloadType[]; | 
|  | extern const char kMetricAttemptPayloadSizeMiB[]; | 
|  | extern const char kMetricAttemptConnectionType[]; | 
|  | extern const char kMetricAttemptDurationMinutes[]; | 
|  | extern const char kMetricAttemptDurationUptimeMinutes[]; | 
|  | extern const char kMetricAttemptTimeSinceLastAttemptSeconds[]; | 
|  | extern const char kMetricAttemptTimeSinceLastAttemptUptimeSeconds[]; | 
|  | extern const char kMetricAttemptPayloadBytesDownloaded[]; | 
|  | extern const char kMetricAttemptPayloadDownloadSpeedKBps[]; | 
|  | extern const char kMetricAttemptDownloadSource[]; | 
|  | extern const char kMetricAttemptResult[]; | 
|  | extern const char kMetricAttemptInternalErrorCode[]; | 
|  | extern const char kMetricAttemptDownloadErrorCode[]; | 
|  |  | 
|  | // UpdateEngine.SuccessfulUpdate.* metrics. | 
|  | extern const char kMetricSuccessfulUpdateAttemptCount[]; | 
|  | extern const char kMetricSuccessfulUpdateBytesDownloadedMiB[]; | 
|  | extern const char kMetricSuccessfulUpdateDownloadOverheadPercentage[]; | 
|  | extern const char kMetricSuccessfulUpdateDownloadSourcesUsed[]; | 
|  | extern const char kMetricSuccessfulUpdatePayloadType[]; | 
|  | extern const char kMetricSuccessfulUpdatePayloadSizeMiB[]; | 
|  | extern const char kMetricSuccessfulUpdateTotalDurationMinutes[]; | 
|  | extern const char kMetricSuccessfulUpdateRebootCount[]; | 
|  | extern const char kMetricSuccessfulUpdateUpdatesAbandonedCount[]; | 
|  | extern const char kMetricSuccessfulUpdateUrlSwitchCount[]; | 
|  |  | 
|  | // UpdateEngine.Rollback.* metric. | 
|  | extern const char kMetricRollbackResult[]; | 
|  |  | 
|  | // UpdateEngine.* metrics. | 
|  | extern const char kMetricFailedUpdateCount[]; | 
|  | extern const char kMetricInstallDateProvisioningSource[]; | 
|  | extern const char kMetricTimeToRebootMinutes[]; | 
|  |  | 
|  | // The possible outcomes when checking for updates. | 
|  | // | 
|  | // This is used in the UpdateEngine.Check.Result histogram. | 
|  | enum class CheckResult { | 
|  | kUpdateAvailable,    // Response indicates an update is available. | 
|  | kNoUpdateAvailable,  // Response indicates no updates are available. | 
|  | kDownloadError,      // Error downloading response from Omaha. | 
|  | kParsingError,       // Error parsing response. | 
|  | kRebootPending,      // No update check was performed a reboot is pending. | 
|  |  | 
|  | kNumConstants, | 
|  | kUnset = -1 | 
|  | }; | 
|  |  | 
|  | // Possible ways a device can react to a new update being available. | 
|  | // | 
|  | // This is used in the UpdateEngine.Check.Reaction histogram. | 
|  | enum class CheckReaction { | 
|  | kUpdating,    // Device proceeds to download and apply update. | 
|  | kIgnored  ,   // Device-policy dictates ignoring the update. | 
|  | kDeferring,   // Device-policy dictates waiting. | 
|  | kBackingOff,  // Previous errors dictates waiting. | 
|  |  | 
|  | kNumConstants, | 
|  | kUnset = -1 | 
|  | }; | 
|  |  | 
|  | // The possible ways that downloading from a HTTP or HTTPS server can fail. | 
|  | // | 
|  | // This is used in the UpdateEngine.Check.DownloadErrorCode and | 
|  | // UpdateEngine.Attempt.DownloadErrorCode histograms. | 
|  | enum class DownloadErrorCode { | 
|  | // Errors that can happen in the field. See http://crbug.com/355745 | 
|  | // for how we plan to add more detail in the future. | 
|  | kDownloadError = 0,  // Error downloading data from server. | 
|  |  | 
|  | // IMPORTANT: When adding a new error code, add at the bottom of the | 
|  | // above block and before the kInputMalformed field. This | 
|  | // is to ensure that error codes are not reordered. | 
|  |  | 
|  | // This error code is used to convey that malformed input was given | 
|  | // to the utils::GetDownloadErrorCode() function. This should never | 
|  | // happen but if it does it's because of an internal update_engine | 
|  | // error and we're interested in knowing this. | 
|  | kInputMalformed = 100, | 
|  |  | 
|  | // Bucket for capturing HTTP status codes not in the 200-599 | 
|  | // range. This should never happen in practice but if it does we | 
|  | // want to know. | 
|  | kHttpStatusOther = 101, | 
|  |  | 
|  | // Above 200 and below 600, the value is the HTTP status code. | 
|  | kHttpStatus200 = 200, | 
|  |  | 
|  | kNumConstants = 600, | 
|  |  | 
|  | kUnset = -1 | 
|  | }; | 
|  |  | 
|  | // Possible ways an update attempt can end. | 
|  | // | 
|  | // This is used in the UpdateEngine.Attempt.Result histogram. | 
|  | enum class AttemptResult { | 
|  | kUpdateSucceeded,             // The update succeeded. | 
|  | kInternalError,               // An internal error occurred. | 
|  | kPayloadDownloadError,        // Failure while downloading payload. | 
|  | kMetadataMalformed,           // Metadata was malformed. | 
|  | kOperationMalformed,          // An operation was malformed. | 
|  | kOperationExecutionError,     // An operation failed to execute. | 
|  | kMetadataVerificationFailed,  // Metadata verification failed. | 
|  | kPayloadVerificationFailed,   // Payload verification failed. | 
|  | kVerificationFailed,          // Root or Kernel partition verification failed. | 
|  | kPostInstallFailed,           // The postinstall step failed. | 
|  | kAbnormalTermination,         // The attempt ended abnormally. | 
|  | kUpdateCanceled,              // Update canceled by the user. | 
|  |  | 
|  | kNumConstants, | 
|  |  | 
|  | kUnset = -1 | 
|  | }; | 
|  |  | 
|  | // Possible ways the device is connected to the Internet. | 
|  | // | 
|  | // This is used in the UpdateEngine.Attempt.ConnectionType histogram. | 
|  | enum class ConnectionType { | 
|  | kUnknown,           // Unknown. | 
|  | kEthernet,          // Ethernet. | 
|  | kWifi,              // Wireless. | 
|  | kWimax,             // WiMax. | 
|  | kBluetooth,         // Bluetooth. | 
|  | kCellular,          // Cellular. | 
|  | kTetheredEthernet,  // Tethered (Ethernet). | 
|  | kTetheredWifi,      // Tethered (Wifi). | 
|  |  | 
|  | kNumConstants, | 
|  | kUnset = -1 | 
|  | }; | 
|  |  | 
|  | // Possible ways a rollback can end. | 
|  | // | 
|  | // This is used in the UpdateEngine.Rollback histogram. | 
|  | enum class RollbackResult { | 
|  | kFailed, | 
|  | kSuccess, | 
|  |  | 
|  | kNumConstants | 
|  | }; | 
|  |  | 
|  | // Helper function to report metrics related to rollback. The | 
|  | // following metrics are reported: | 
|  | // | 
|  | //  |kMetricRollbackResult| | 
|  | void ReportRollbackMetrics(SystemState *system_state, | 
|  | RollbackResult result); | 
|  |  | 
|  | // Helper function to report metrics reported once a day. The | 
|  | // following metrics are reported: | 
|  | // | 
|  | //  |kMetricDailyOSAgeDays| | 
|  | void ReportDailyMetrics(SystemState *system_state, | 
|  | base::TimeDelta os_age); | 
|  |  | 
|  | // Helper function to report metrics after completing an update check | 
|  | // with the ChromeOS update server ("Omaha"). The following metrics | 
|  | // are reported: | 
|  | // | 
|  | //  |kMetricCheckResult| | 
|  | //  |kMetricCheckReaction| | 
|  | //  |kMetricCheckDownloadErrorCode| | 
|  | //  |kMetricCheckTimeSinceLastCheckMinutes| | 
|  | //  |kMetricCheckTimeSinceLastCheckUptimeMinutes| | 
|  | // | 
|  | // The |kMetricCheckResult| metric will only be reported if |result| | 
|  | // is not |kUnset|. | 
|  | // | 
|  | // The |kMetricCheckReaction| metric will only be reported if | 
|  | // |reaction| is not |kUnset|. | 
|  | // | 
|  | // The |kMetricCheckDownloadErrorCode| will only be reported if | 
|  | // |download_error_code| is not |kUnset|. | 
|  | // | 
|  | // The values for the |kMetricCheckTimeSinceLastCheckMinutes| and | 
|  | // |kMetricCheckTimeSinceLastCheckUptimeMinutes| metrics are | 
|  | // automatically reported and calculated by maintaining persistent | 
|  | // and process-local state variables. | 
|  | void ReportUpdateCheckMetrics(SystemState *system_state, | 
|  | CheckResult result, | 
|  | CheckReaction reaction, | 
|  | DownloadErrorCode download_error_code); | 
|  |  | 
|  |  | 
|  | // Helper function to report metrics after the completion of each | 
|  | // update attempt. The following metrics are reported: | 
|  | // | 
|  | //  |kMetricAttemptNumber| | 
|  | //  |kMetricAttemptPayloadType| | 
|  | //  |kMetricAttemptPayloadSizeMiB| | 
|  | //  |kMetricAttemptDurationSeconds| | 
|  | //  |kMetricAttemptDurationUptimeSeconds| | 
|  | //  |kMetricAttemptTimeSinceLastAttemptMinutes| | 
|  | //  |kMetricAttemptTimeSinceLastAttemptUptimeMinutes| | 
|  | //  |kMetricAttemptPayloadBytesDownloadedMiB| | 
|  | //  |kMetricAttemptPayloadDownloadSpeedKBps| | 
|  | //  |kMetricAttemptDownloadSource| | 
|  | //  |kMetricAttemptResult| | 
|  | //  |kMetricAttemptInternalErrorCode| | 
|  | //  |kMetricAttemptDownloadErrorCode| | 
|  | // | 
|  | // The |kMetricAttemptInternalErrorCode| metric will only be reported | 
|  | // if |internal_error_code| is not |kErrorSuccess|. | 
|  | // | 
|  | // The |kMetricAttemptDownloadErrorCode| metric will only be | 
|  | // reported if |payload_download_error_code| is not |kUnset|. | 
|  | // | 
|  | // The values for the |kMetricAttemptTimeSinceLastAttemptMinutes| and | 
|  | // |kMetricAttemptTimeSinceLastAttemptUptimeMinutes| metrics are | 
|  | // automatically calculated and reported by maintaining persistent and | 
|  | // process-local state variables. | 
|  | void ReportUpdateAttemptMetrics( | 
|  | SystemState *system_state, | 
|  | int attempt_number, | 
|  | PayloadType payload_type, | 
|  | base::TimeDelta duration, | 
|  | base::TimeDelta duration_uptime, | 
|  | int64_t payload_size, | 
|  | int64_t payload_bytes_downloaded, | 
|  | int64_t payload_download_speed_bps, | 
|  | DownloadSource download_source, | 
|  | AttemptResult attempt_result, | 
|  | ErrorCode internal_error_code, | 
|  | DownloadErrorCode payload_download_error_code, | 
|  | ConnectionType connection_type); | 
|  |  | 
|  | // Reports the |kAbnormalTermination| for the |kMetricAttemptResult| | 
|  | // metric. No other metrics in the UpdateEngine.Attempt.* namespace | 
|  | // will be reported. | 
|  | void ReportAbnormallyTerminatedUpdateAttemptMetrics(SystemState *system_state); | 
|  |  | 
|  | // Helper function to report the after the completion of a successful | 
|  | // update attempt. The following metrics are reported: | 
|  | // | 
|  | //  |kMetricSuccessfulUpdateAttemptCount| | 
|  | //  |kMetricSuccessfulUpdateUpdatesAbandonedCount| | 
|  | //  |kMetricSuccessfulUpdatePayloadType| | 
|  | //  |kMetricSuccessfulUpdatePayloadSizeMiB| | 
|  | //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpsServer| | 
|  | //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpServer| | 
|  | //  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpPeer| | 
|  | //  |kMetricSuccessfulUpdateBytesDownloadedMiB| | 
|  | //  |kMetricSuccessfulUpdateDownloadSourcesUsed| | 
|  | //  |kMetricSuccessfulUpdateDownloadOverheadPercentage| | 
|  | //  |kMetricSuccessfulUpdateTotalDurationMinutes| | 
|  | //  |kMetricSuccessfulUpdateRebootCount| | 
|  | //  |kMetricSuccessfulUpdateUrlSwitchCount| | 
|  | // | 
|  | // The values for the |kMetricSuccessfulUpdateDownloadSourcesUsed| are | 
|  | // |kMetricSuccessfulUpdateBytesDownloadedMiB| metrics automatically | 
|  | // calculated from examining the |num_bytes_downloaded| array. | 
|  | void ReportSuccessfulUpdateMetrics( | 
|  | SystemState *system_state, | 
|  | int attempt_count, | 
|  | int updates_abandoned_count, | 
|  | PayloadType payload_type, | 
|  | int64_t payload_size, | 
|  | int64_t num_bytes_downloaded[kNumDownloadSources], | 
|  | int download_overhead_percentage, | 
|  | base::TimeDelta total_duration, | 
|  | int reboot_count, | 
|  | int url_switch_count); | 
|  |  | 
|  | // Helper function to report the after the completion of a SSL certificate | 
|  | // check. One of the following metrics is reported: | 
|  | // | 
|  | //  |kMetricCertificateCheckUpdateCheck| | 
|  | //  |kMetricCertificateCheckDownload| | 
|  | void ReportCertificateCheckMetrics(SystemState* system_state, | 
|  | ServerToCheck server_to_check, | 
|  | CertificateCheckResult result); | 
|  |  | 
|  | }  // namespace metrics | 
|  |  | 
|  | }  // namespace chromeos_update_engine | 
|  |  | 
|  | #endif  // UPDATE_ENGINE_METRICS_H_ |