1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2014 The Android Open Source Project
3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License");
5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License.
6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at
7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//      http://www.apache.org/licenses/LICENSE-2.0
9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software
11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS,
12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and
14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License.
15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo//
1633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
17cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#ifndef UPDATE_ENGINE_METRICS_H_
18cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#define UPDATE_ENGINE_METRICS_H_
1933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include <base/time/time.h>
2133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2214c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo#include "update_engine/certificate_checker.h"
2339910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/constants.h"
2439910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/error_code.h"
2533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthennamespace chromeos_update_engine {
2733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenclass SystemState;
2933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
3033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthennamespace metrics {
3133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
3233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Daily.* metrics.
3333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricDailyOSAgeDays[];
3433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
3533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Check.* metrics.
3633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckDownloadErrorCode[];
3733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckReaction[];
3833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckResult[];
3933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckTimeSinceLastCheckMinutes[];
4033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricCheckTimeSinceLastCheckUptimeMinutes[];
4133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
4233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Attempt.* metrics.
4333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptNumber[];
4433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadType[];
4533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadSizeMiB[];
46b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthenextern const char kMetricAttemptConnectionType[];
4733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptDurationMinutes[];
4833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptDurationUptimeMinutes[];
4933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptTimeSinceLastAttemptSeconds[];
5033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptTimeSinceLastAttemptUptimeSeconds[];
5133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadBytesDownloaded[];
5233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptPayloadDownloadSpeedKBps[];
5333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptDownloadSource[];
5433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptResult[];
5533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptInternalErrorCode[];
5633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricAttemptDownloadErrorCode[];
5733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
5833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.SuccessfulUpdate.* metrics.
5933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateAttemptCount[];
6033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateBytesDownloadedMiB[];
6133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateDownloadOverheadPercentage[];
6233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateDownloadSourcesUsed[];
6333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdatePayloadType[];
6433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdatePayloadSizeMiB[];
6533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateTotalDurationMinutes[];
6633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateRebootCount[];
6733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateUpdatesAbandonedCount[];
6833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricSuccessfulUpdateUrlSwitchCount[];
6933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
7096197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen// UpdateEngine.Rollback.* metric.
7196197df73f6c804d96eb3a1390eb817f354089d2David Zeuthenextern const char kMetricRollbackResult[];
7296197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen
7333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.* metrics.
7433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricFailedUpdateCount[];
7533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricInstallDateProvisioningSource[];
7633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenextern const char kMetricTimeToRebootMinutes[];
7733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
7833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The possible outcomes when checking for updates.
7933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
8033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// This is used in the UpdateEngine.Check.Result histogram.
8133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenenum class CheckResult {
8233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUpdateAvailable,    // Response indicates an update is available.
8333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNoUpdateAvailable,  // Response indicates no updates are available.
8433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kDownloadError,      // Error downloading response from Omaha.
8533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kParsingError,       // Error parsing response.
8633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kRebootPending,      // No update check was performed a reboot is pending.
8733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
8833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNumConstants,
8933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUnset = -1
9033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen};
9133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
9233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Possible ways a device can react to a new update being available.
9333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
9433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// This is used in the UpdateEngine.Check.Reaction histogram.
9533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenenum class CheckReaction {
9633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUpdating,    // Device proceeds to download and apply update.
9733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kIgnored  ,   // Device-policy dictates ignoring the update.
9833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kDeferring,   // Device-policy dictates waiting.
9933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kBackingOff,  // Previous errors dictates waiting.
10033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
10133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNumConstants,
10233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUnset = -1
10333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen};
10433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
10533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The possible ways that downloading from a HTTP or HTTPS server can fail.
10633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
10733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// This is used in the UpdateEngine.Check.DownloadErrorCode and
10833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Attempt.DownloadErrorCode histograms.
10933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenenum class DownloadErrorCode {
11033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // Errors that can happen in the field. See http://crbug.com/355745
11133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // for how we plan to add more detail in the future.
11233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kDownloadError = 0,  // Error downloading data from server.
11333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
11433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // IMPORTANT: When adding a new error code, add at the bottom of the
11533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // above block and before the kInputMalformed field. This
11633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // is to ensure that error codes are not reordered.
11733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
11833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // This error code is used to convey that malformed input was given
11933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // to the utils::GetDownloadErrorCode() function. This should never
12033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // happen but if it does it's because of an internal update_engine
12133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // error and we're interested in knowing this.
12233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kInputMalformed = 100,
12333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
12433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // Bucket for capturing HTTP status codes not in the 200-599
12533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // range. This should never happen in practice but if it does we
12633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // want to know.
12733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kHttpStatusOther = 101,
12833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
12933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  // Above 200 and below 600, the value is the HTTP status code.
13033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kHttpStatus200 = 200,
13133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
13233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNumConstants = 600,
13333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
13433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUnset = -1
13533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen};
13633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
13733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Possible ways an update attempt can end.
13833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
13933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// This is used in the UpdateEngine.Attempt.Result histogram.
14033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenenum class AttemptResult {
14133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUpdateSucceeded,             // The update succeeded.
14233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kInternalError,               // An internal error occurred.
14333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kPayloadDownloadError,        // Failure while downloading payload.
14433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kMetadataMalformed,           // Metadata was malformed.
14533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kOperationMalformed,          // An operation was malformed.
14633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kOperationExecutionError,     // An operation failed to execute.
14733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kMetadataVerificationFailed,  // Metadata verification failed.
14833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kPayloadVerificationFailed,   // Payload verification failed.
14933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kVerificationFailed,          // Root or Kernel partition verification failed.
15033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kPostInstallFailed,           // The postinstall step failed.
15133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kAbnormalTermination,         // The attempt ended abnormally.
1521f19dccb115cf608104b1cb0d192a53ae32f238fAlex Deymo  kUpdateCanceled,              // Update canceled by the user.
15333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
15433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kNumConstants,
15533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
15633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  kUnset = -1
15733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen};
15833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
159b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen// Possible ways the device is connected to the Internet.
160b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen//
161b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen// This is used in the UpdateEngine.Attempt.ConnectionType histogram.
162b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthenenum class ConnectionType {
163b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kUnknown,           // Unknown.
164b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kEthernet,          // Ethernet.
165b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kWifi,              // Wireless.
166b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kWimax,             // WiMax.
167b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kBluetooth,         // Bluetooth.
168b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kCellular,          // Cellular.
169b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kTetheredEthernet,  // Tethered (Ethernet).
170b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kTetheredWifi,      // Tethered (Wifi).
171b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen
172b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kNumConstants,
173b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  kUnset = -1
174b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen};
175b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen
17696197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen// Possible ways a rollback can end.
17796197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen//
17896197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen// This is used in the UpdateEngine.Rollback histogram.
17996197df73f6c804d96eb3a1390eb817f354089d2David Zeuthenenum class RollbackResult {
18096197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  kFailed,
18196197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  kSuccess,
18296197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen
18396197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  kNumConstants
18496197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen};
18596197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen
18696197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen// Helper function to report metrics related to rollback. The
18796197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen// following metrics are reported:
18896197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen//
18996197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen//  |kMetricRollbackResult|
19096197df73f6c804d96eb3a1390eb817f354089d2David Zeuthenvoid ReportRollbackMetrics(SystemState *system_state,
19196197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen                           RollbackResult result);
19296197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen
19333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Helper function to report metrics reported once a day. The
19433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// following metrics are reported:
19533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
19633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricDailyOSAgeDays|
19733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportDailyMetrics(SystemState *system_state,
19833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        base::TimeDelta os_age);
19933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
20033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Helper function to report metrics after completing an update check
20133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// with the ChromeOS update server ("Omaha"). The following metrics
20233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// are reported:
20333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
20433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckResult|
20533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckReaction|
20633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckDownloadErrorCode|
20733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckTimeSinceLastCheckMinutes|
20833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricCheckTimeSinceLastCheckUptimeMinutes|
20933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
21033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricCheckResult| metric will only be reported if |result|
21133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// is not |kUnset|.
21233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
21333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricCheckReaction| metric will only be reported if
21433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |reaction| is not |kUnset|.
21533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
21633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricCheckDownloadErrorCode| will only be reported if
21733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |download_error_code| is not |kUnset|.
21833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
21933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The values for the |kMetricCheckTimeSinceLastCheckMinutes| and
22033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |kMetricCheckTimeSinceLastCheckUptimeMinutes| metrics are
22133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// automatically reported and calculated by maintaining persistent
22233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// and process-local state variables.
22333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportUpdateCheckMetrics(SystemState *system_state,
22433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              CheckResult result,
22533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              CheckReaction reaction,
22633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              DownloadErrorCode download_error_code);
22733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
22833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
22933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Helper function to report metrics after the completion of each
23033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// update attempt. The following metrics are reported:
23133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
23233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptNumber|
23333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptPayloadType|
23433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptPayloadSizeMiB|
23533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptDurationSeconds|
23633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptDurationUptimeSeconds|
23733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptTimeSinceLastAttemptMinutes|
23833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptTimeSinceLastAttemptUptimeMinutes|
23933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptPayloadBytesDownloadedMiB|
24033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptPayloadDownloadSpeedKBps|
24133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptDownloadSource|
24233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptResult|
24333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptInternalErrorCode|
24433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricAttemptDownloadErrorCode|
24533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
24633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricAttemptInternalErrorCode| metric will only be reported
24733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// if |internal_error_code| is not |kErrorSuccess|.
24833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
24933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The |kMetricAttemptDownloadErrorCode| metric will only be
25033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// reported if |payload_download_error_code| is not |kUnset|.
25133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
25233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The values for the |kMetricAttemptTimeSinceLastAttemptMinutes| and
25333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |kMetricAttemptTimeSinceLastAttemptUptimeMinutes| metrics are
25433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// automatically calculated and reported by maintaining persistent and
25533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// process-local state variables.
25633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportUpdateAttemptMetrics(
25733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    SystemState *system_state,
25833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int attempt_number,
25933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    PayloadType payload_type,
26033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    base::TimeDelta duration,
26133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    base::TimeDelta duration_uptime,
26233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t payload_size,
26333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t payload_bytes_downloaded,
26433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t payload_download_speed_bps,
26533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    DownloadSource download_source,
26633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    AttemptResult attempt_result,
26733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    ErrorCode internal_error_code,
268b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen    DownloadErrorCode payload_download_error_code,
269b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen    ConnectionType connection_type);
27033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2714e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen// Reports the |kAbnormalTermination| for the |kMetricAttemptResult|
2724e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen// metric. No other metrics in the UpdateEngine.Attempt.* namespace
2734e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen// will be reported.
2744e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthenvoid ReportAbnormallyTerminatedUpdateAttemptMetrics(SystemState *system_state);
2754e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen
27633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// Helper function to report the after the completion of a successful
27733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// update attempt. The following metrics are reported:
27833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
27933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateAttemptCount|
28033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateUpdatesAbandonedCount|
28133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdatePayloadType|
28233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdatePayloadSizeMiB|
28333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpsServer|
28433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpServer|
28533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateBytesDownloadedMiBHttpPeer|
28633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateBytesDownloadedMiB|
28733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateDownloadSourcesUsed|
28833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateDownloadOverheadPercentage|
28933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateTotalDurationMinutes|
29033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateRebootCount|
29133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//  |kMetricSuccessfulUpdateUrlSwitchCount|
29233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen//
29333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// The values for the |kMetricSuccessfulUpdateDownloadSourcesUsed| are
29433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// |kMetricSuccessfulUpdateBytesDownloadedMiB| metrics automatically
29533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// calculated from examining the |num_bytes_downloaded| array.
29633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportSuccessfulUpdateMetrics(
29733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    SystemState *system_state,
29833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int attempt_count,
29933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int updates_abandoned_count,
30033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    PayloadType payload_type,
30133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t payload_size,
30233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int64_t num_bytes_downloaded[kNumDownloadSources],
30333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int download_overhead_percentage,
30433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    base::TimeDelta total_duration,
30533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int reboot_count,
30633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    int url_switch_count);
30733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
308c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo// Helper function to report the after the completion of a SSL certificate
309c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo// check. One of the following metrics is reported:
310c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo//
311c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo//  |kMetricCertificateCheckUpdateCheck|
312c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo//  |kMetricCertificateCheckDownload|
313c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymovoid ReportCertificateCheckMetrics(SystemState* system_state,
314c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                   ServerToCheck server_to_check,
315c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                   CertificateCheckResult result);
316c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo
31733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}  // namespace metrics
31833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
31933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}  // namespace chromeos_update_engine
32033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
321cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold#endif  // UPDATE_ENGINE_METRICS_H_
322