//
// 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_