metrics.h revision 33bae491eded4ef4f1eb4f4ef0f01ef0e5463f3a
133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Copyright 2014 The Chromium OS Authors. All rights reserved.
233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Use of this source code is governed by a BSD-style license that can be
333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// found in the LICENSE file.
433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_METRICS_H_
633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#define CHROMEOS_PLATFORM_UPDATE_ENGINE_METRICS_H_
733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include <base/time/time.h>
933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
1033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include "update_engine/constants.h"
1133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include "update_engine/error_code.h"
1233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
1333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthennamespace chromeos_update_engine {
1433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
1533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenclass SystemState;
1633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
1733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthennamespace metrics {
1833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
1933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Daily.* metrics.
2033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricDailyOSAgeDays[];
2133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Check.* metrics.
2333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckDownloadErrorCode[];
2433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckReaction[];
2533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckResult[];
2633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckTimeSinceLastCheckMinutes[];
2733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckTimeSinceLastCheckUptimeMinutes[];
2833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Attempt.* metrics.
3033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptNumber[];
3133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadType[];
3233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadSizeMiB[];
3333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptDurationMinutes[];
3433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptDurationUptimeMinutes[];
3533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptTimeSinceLastAttemptSeconds[];
3633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptTimeSinceLastAttemptUptimeSeconds[];
3733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadBytesOffset[];
3833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadBytesNeeded[];
3933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadBytesDownloaded[];
4033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadDownloadSpeedKBps[];
4133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptDownloadSource[];
4233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptResult[];
4333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptInternalErrorCode[];
4433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptDownloadErrorCode[];
4533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
4633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.SuccessfulUpdate.* metrics.
4733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateAttemptCount[];
4833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateBytesDownloadedMiB[];
4933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateDownloadOverheadPercentage[];
5033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateDownloadSourcesUsed[];
5133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdatePayloadType[];
5233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdatePayloadSizeMiB[];
5333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateTotalDurationMinutes[];
5433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateRebootCount[];
5533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateUpdatesAbandonedCount[];
5633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateUrlSwitchCount[];
5733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
5833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.* metrics.
5933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricFailedUpdateCount[];
6033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricInstallDateProvisioningSource[];
6133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricTimeToRebootMinutes[];
6233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
6333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The possible outcomes when checking for updates.
6433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
6533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// This is used in the UpdateEngine.Check.Result histogram.
6633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenenum class CheckResult {
6733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUpdateAvailable,    // Response indicates an update is available.
6833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNoUpdateAvailable,  // Response indicates no updates are available.
6933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kDownloadError,      // Error downloading response from Omaha.
7033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kParsingError,       // Error parsing response.
7133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kRebootPending,      // No update check was performed a reboot is pending.
7233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
7333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNumConstants,
7433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUnset = -1
7533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen};
7633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
7733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Possible ways a device can react to a new update being available.
7833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
7933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// This is used in the UpdateEngine.Check.Reaction histogram.
8033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenenum class CheckReaction {
8133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUpdating,    // Device proceeds to download and apply update.
8233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kIgnored  ,   // Device-policy dictates ignoring the update.
8333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kDeferring,   // Device-policy dictates waiting.
8433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kBackingOff,  // Previous errors dictates waiting.
8533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
8633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNumConstants,
8733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUnset = -1
8833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen};
8933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
9033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The possible ways that downloading from a HTTP or HTTPS server can fail.
9133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
9233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// This is used in the UpdateEngine.Check.DownloadErrorCode and
9333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Attempt.DownloadErrorCode histograms.
9433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenenum class DownloadErrorCode {
9533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // Errors that can happen in the field. See http://crbug.com/355745
9633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // for how we plan to add more detail in the future.
9733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kDownloadError = 0,  // Error downloading data from server.
9833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
9933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // IMPORTANT: When adding a new error code, add at the bottom of the
10033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // above block and before the kInputMalformed field. This
10133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // is to ensure that error codes are not reordered.
10233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
10333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // This error code is used to convey that malformed input was given
10433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // to the utils::GetDownloadErrorCode() function. This should never
10533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // happen but if it does it's because of an internal update_engine
10633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // error and we're interested in knowing this.
10733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kInputMalformed = 100,
10833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
10933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // Bucket for capturing HTTP status codes not in the 200-599
11033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // range. This should never happen in practice but if it does we
11133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // want to know.
11233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kHttpStatusOther = 101,
11333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
11433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // Above 200 and below 600, the value is the HTTP status code.
11533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kHttpStatus200 = 200,
11633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
11733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNumConstants = 600,
11833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
11933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUnset = -1
12033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen};
12133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
12233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Possible ways an update attempt can end.
12333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
12433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// This is used in the UpdateEngine.Attempt.Result histogram.
12533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenenum class AttemptResult {
12633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUpdateSucceeded,             // The update succeeded.
12733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kInternalError,               // An internal error occurred.
12833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kPayloadDownloadError,        // Failure while downloading payload.
12933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kMetadataMalformed,           // Metadata was malformed.
13033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kOperationMalformed,          // An operation was malformed.
13133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kOperationExecutionError,     // An operation failed to execute.
13233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kMetadataVerificationFailed,  // Metadata verification failed.
13333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kPayloadVerificationFailed,   // Payload verification failed.
13433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kVerificationFailed,          // Root or Kernel partition verification failed.
13533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kPostInstallFailed,           // The postinstall step failed.
13633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kAbnormalTermination,         // The attempt ended abnormally.
13733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
13833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNumConstants,
13933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
14033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUnset = -1
14133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen};
14233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
14333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Helper function to report metrics reported once a day. The
14433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// following metrics are reported:
14533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
14633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricDailyOSAgeDays|
14733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportDailyMetrics(SystemState *system_state,
14833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        base::TimeDelta os_age);
14933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
15033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Helper function to report metrics after completing an update check
15133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// with the ChromeOS update server ("Omaha"). The following metrics
15233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// are reported:
15333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
15433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckResult|
15533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckReaction|
15633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckDownloadErrorCode|
15733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckTimeSinceLastCheckMinutes|
15833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckTimeSinceLastCheckUptimeMinutes|
15933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
16033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricCheckResult| metric will only be reported if |result|
16133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// is not |kUnset|.
16233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
16333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricCheckReaction| metric will only be reported if
16433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |reaction| is not |kUnset|.
16533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
16633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricCheckDownloadErrorCode| will only be reported if
16733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |download_error_code| is not |kUnset|.
16833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
16933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The values for the |kMetricCheckTimeSinceLastCheckMinutes| and
17033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |kMetricCheckTimeSinceLastCheckUptimeMinutes| metrics are
17133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// automatically reported and calculated by maintaining persistent
17233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// and process-local state variables.
17333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportUpdateCheckMetrics(SystemState *system_state,
17433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              CheckResult result,
17533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              CheckReaction reaction,
17633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              DownloadErrorCode download_error_code);
17733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
17833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
17933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Helper function to report metrics after the completion of each
18033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// update attempt. The following metrics are reported:
18133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
18233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptNumber|
18333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptPayloadType|
18433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptPayloadSizeMiB|
18533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptDurationSeconds|
18633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptDurationUptimeSeconds|
18733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptTimeSinceLastAttemptMinutes|
18833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptTimeSinceLastAttemptUptimeMinutes|
18933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptPayloadBytesDownloadedMiB|
19033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptPayloadDownloadSpeedKBps|
19133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptDownloadSource|
19233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptResult|
19333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptInternalErrorCode|
19433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptDownloadErrorCode|
19533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
19633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricAttemptInternalErrorCode| metric will only be reported
19733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// if |internal_error_code| is not |kErrorSuccess|.
19833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
19933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricAttemptDownloadErrorCode| metric will only be
20033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// reported if |payload_download_error_code| is not |kUnset|.
20133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
20233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The values for the |kMetricAttemptTimeSinceLastAttemptMinutes| and
20333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |kMetricAttemptTimeSinceLastAttemptUptimeMinutes| metrics are
20433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// automatically calculated and reported by maintaining persistent and
20533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// process-local state variables.
20633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportUpdateAttemptMetrics(
20733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    SystemState *system_state,
20833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int attempt_number,
20933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    PayloadType payload_type,
21033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    base::TimeDelta duration,
21133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    base::TimeDelta duration_uptime,
21233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t payload_size,
21333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t payload_bytes_downloaded,
21433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t payload_download_speed_bps,
21533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    DownloadSource download_source,
21633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    AttemptResult attempt_result,
21733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    ErrorCode internal_error_code,
21833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    DownloadErrorCode payload_download_error_code);
21933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
22033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Helper function to report the after the completion of a successful
22133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// update attempt. The following metrics are reported:
22233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
22333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateAttemptCount|
22433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateUpdatesAbandonedCount|
22533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdatePayloadType|
22633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdatePayloadSizeMiB|
22733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpsServer|
22833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpServer|
22933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpPeer|
23033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateBytesDownloadedMiB|
23133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateDownloadSourcesUsed|
23233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateDownloadOverheadPercentage|
23333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateTotalDurationMinutes|
23433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateRebootCount|
23533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateUrlSwitchCount|
23633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
23733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The values for the |kMetricSuccessfulUpdateDownloadSourcesUsed| are
23833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |kMetricSuccessfulUpdateBytesDownloadedMiB| metrics automatically
23933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// calculated from examining the |num_bytes_downloaded| array.
24033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportSuccessfulUpdateMetrics(
24133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    SystemState *system_state,
24233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int attempt_count,
24333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int updates_abandoned_count,
24433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    PayloadType payload_type,
24533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t payload_size,
24633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t num_bytes_downloaded[kNumDownloadSources],
24733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int download_overhead_percentage,
24833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    base::TimeDelta total_duration,
24933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int reboot_count,
25033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int url_switch_count);
25133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
25233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}  // namespace metrics
25333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
25433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}  // namespace chromeos_update_engine
25533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
25633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_METRICS_H_
257