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
1733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include "update_engine/metrics.h"
1833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
1933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include <string>
2033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include <base/logging.h>
22a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo#include <metrics/metrics_library.h>
2333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
2439910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/clock_interface.h"
2539910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/constants.h"
2639910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/prefs_interface.h"
2739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h"
28a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo#include "update_engine/metrics_utils.h"
2933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include "update_engine/system_state.h"
3033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
3133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenusing std::string;
3233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
3333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthennamespace chromeos_update_engine {
3433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
3533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthennamespace metrics {
3633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
3733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Daily.* metrics.
3833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricDailyOSAgeDays[] = "UpdateEngine.Daily.OSAgeDays";
3933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
4033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Check.* metrics.
4133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricCheckDownloadErrorCode[] =
4233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Check.DownloadErrorCode";
4333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricCheckReaction[] = "UpdateEngine.Check.Reaction";
4433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricCheckResult[] = "UpdateEngine.Check.Result";
4533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricCheckTimeSinceLastCheckMinutes[] =
4633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Check.TimeSinceLastCheckMinutes";
4733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricCheckTimeSinceLastCheckUptimeMinutes[] =
4833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Check.TimeSinceLastCheckUptimeMinutes";
4933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
5033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.Attempt.* metrics.
5133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptNumber[] = "UpdateEngine.Attempt.Number";
5233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptPayloadType[] =
5333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.PayloadType";
5433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptPayloadSizeMiB[] =
5533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.PayloadSizeMiB";
56b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthenconst char kMetricAttemptConnectionType[] =
57b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen    "UpdateEngine.Attempt.ConnectionType";
5833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptDurationMinutes[] =
5933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.DurationMinutes";
6033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptDurationUptimeMinutes[] =
6133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.DurationUptimeMinutes";
6233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptTimeSinceLastAttemptMinutes[] =
6333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.TimeSinceLastAttemptMinutes";
6433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptTimeSinceLastAttemptUptimeMinutes[] =
6533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.TimeSinceLastAttemptUptimeMinutes";
6633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptPayloadBytesDownloadedMiB[] =
6733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.PayloadBytesDownloadedMiB";
6833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptPayloadDownloadSpeedKBps[] =
6933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.PayloadDownloadSpeedKBps";
7033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptDownloadSource[] =
7133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.DownloadSource";
7233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptResult[] =
7333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.Result";
7433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptInternalErrorCode[] =
7533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.InternalErrorCode";
7633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricAttemptDownloadErrorCode[] =
7733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.Attempt.DownloadErrorCode";
7833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
7933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.SuccessfulUpdate.* metrics.
8033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdateAttemptCount[] =
8133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.AttemptCount";
8233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdateBytesDownloadedMiB[] =
8333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.BytesDownloadedMiB";
8433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdateDownloadOverheadPercentage[] =
8533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.DownloadOverheadPercentage";
8633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdateDownloadSourcesUsed[] =
8733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.DownloadSourcesUsed";
8833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdatePayloadType[] =
8933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.PayloadType";
9033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdatePayloadSizeMiB[] =
9133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.PayloadSizeMiB";
9233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdateRebootCount[] =
9333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.RebootCount";
9433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdateTotalDurationMinutes[] =
9533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.TotalDurationMinutes";
9633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdateUpdatesAbandonedCount[] =
9733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.UpdatesAbandonedCount";
9833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricSuccessfulUpdateUrlSwitchCount[] =
9933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.SuccessfulUpdate.UrlSwitchCount";
10033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
10196197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen// UpdateEngine.Rollback.* metric.
10296197df73f6c804d96eb3a1390eb817f354089d2David Zeuthenconst char kMetricRollbackResult[] = "UpdateEngine.Rollback.Result";
10396197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen
104c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo// UpdateEngine.CertificateCheck.* metrics.
105c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymoconst char kMetricCertificateCheckUpdateCheck[] =
106c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo    "UpdateEngine.CertificateCheck.UpdateCheck";
107c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymoconst char kMetricCertificateCheckDownload[] =
108c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo    "UpdateEngine.CertificateCheck.Download";
109c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo
11033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen// UpdateEngine.* metrics.
11133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricFailedUpdateCount[] = "UpdateEngine.FailedUpdateCount";
11233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricInstallDateProvisioningSource[] =
11333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.InstallDateProvisioningSource";
11433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenconst char kMetricTimeToRebootMinutes[] =
11533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    "UpdateEngine.TimeToRebootMinutes";
11633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
11733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportDailyMetrics(SystemState *system_state,
11833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                        base::TimeDelta os_age) {
11933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  string metric = metrics::kMetricDailyOSAgeDays;
12033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << utils::FormatTimeDelta(os_age)
12133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
12233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(
12333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metric,
12433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      static_cast<int>(os_age.InDays()),
12533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      0,     // min: 0 days
12633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      6*30,  // max: 6 months (approx)
12733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      50);   // num_buckets
12833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}
12933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
13033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportUpdateCheckMetrics(SystemState *system_state,
13133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              CheckResult result,
13233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              CheckReaction reaction,
13333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                              DownloadErrorCode download_error_code) {
13433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  string metric;
13533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  int value;
13633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  int max_value;
13733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
13833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  if (result != metrics::CheckResult::kUnset) {
13933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = metrics::kMetricCheckResult;
14033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    value = static_cast<int>(result);
14133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    max_value = static_cast<int>(metrics::CheckResult::kNumConstants) - 1;
14233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
14333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    system_state->metrics_lib()->SendEnumToUMA(metric, value, max_value);
14433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
14533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  if (reaction != metrics::CheckReaction::kUnset) {
14633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = metrics::kMetricCheckReaction;
14733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    value = static_cast<int>(reaction);
14833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    max_value = static_cast<int>(metrics::CheckReaction::kNumConstants) - 1;
14933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
15033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    system_state->metrics_lib()->SendEnumToUMA(metric, value, max_value);
15133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
15233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  if (download_error_code != metrics::DownloadErrorCode::kUnset) {
15333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = metrics::kMetricCheckDownloadErrorCode;
15433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    value = static_cast<int>(download_error_code);
155c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen    LOG(INFO) << "Sending " << value << " for metric " << metric << " (sparse)";
156c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen    system_state->metrics_lib()->SendSparseToUMA(metric, value);
15733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
15833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
15933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  base::TimeDelta time_since_last;
160a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo  if (metrics_utils::WallclockDurationHelper(
161a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo          system_state,
162a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo          kPrefsMetricsCheckLastReportingTime,
163a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo          &time_since_last)) {
16433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = kMetricCheckTimeSinceLastCheckMinutes;
16533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
16633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen              << " for metric " << metric;
16733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    system_state->metrics_lib()->SendToUMA(
16833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        metric,
16933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        time_since_last.InMinutes(),
17033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        0,         // min: 0 min
17133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        30*24*60,  // max: 30 days
17233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        50);       // num_buckets
17333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
17433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
17533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  base::TimeDelta uptime_since_last;
17633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  static int64_t uptime_since_last_storage = 0;
177a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo  if (metrics_utils::MonotonicDurationHelper(system_state,
178a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo                                             &uptime_since_last_storage,
179a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo                                             &uptime_since_last)) {
18033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = kMetricCheckTimeSinceLastCheckUptimeMinutes;
18133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
18233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen              << " for metric " << metric;
18333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    system_state->metrics_lib()->SendToUMA(
18433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        metric,
18533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        uptime_since_last.InMinutes(),
18633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        0,         // min: 0 min
18733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        30*24*60,  // max: 30 days
18833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        50);       // num_buckets
18933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
19033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}
19133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
1924e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthenvoid ReportAbnormallyTerminatedUpdateAttemptMetrics(
1934e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen    SystemState *system_state) {
1944e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen
1954e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen  string metric = metrics::kMetricAttemptResult;
1964e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen  AttemptResult attempt_result = AttemptResult::kAbnormalTermination;
1974e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen
1984e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen  LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
1994e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen            << " for metric " <<  metric;
2004e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen  system_state->metrics_lib()->SendEnumToUMA(
2014e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen      metric,
2024e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen      static_cast<int>(attempt_result),
2034e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen      static_cast<int>(AttemptResult::kNumConstants));
2044e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen}
2054e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen
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,
218b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen    DownloadErrorCode payload_download_error_code,
219b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen    ConnectionType connection_type) {
22033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  string metric;
22133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
22233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptNumber;
22333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << attempt_number << " for metric " <<  metric;
22433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
22533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         attempt_number,
22633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,    // min: 0 attempts
22733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         49,   // max: 49 attempts
22833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);  // num_buckets
22933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
23033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptPayloadType;
23133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << utils::ToString(payload_type)
23233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
23333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendEnumToUMA(metric,
23433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             payload_type,
23533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             kNumPayloadTypes);
23633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
23733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptDurationMinutes;
23833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration)
23933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
24033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
24133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         duration.InMinutes(),
24233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,         // min: 0 min
24333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         10*24*60,  // max: 10 days
24433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);       // num_buckets
24533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
24633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptDurationUptimeMinutes;
24733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << utils::FormatTimeDelta(duration_uptime)
24833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
24933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
25033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         duration_uptime.InMinutes(),
25133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,         // min: 0 min
25233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         10*24*60,  // max: 10 days
25333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);       // num_buckets
25433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
25533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptPayloadSizeMiB;
25633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
25733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << payload_size_mib << " for metric " <<  metric;
25833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
25933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         payload_size_mib,
26033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,     // min: 0 MiB
26133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         1024,  // max: 1024 MiB = 1 GiB
26233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);   // num_buckets
26333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
26433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptPayloadBytesDownloadedMiB;
26533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  int64_t payload_bytes_downloaded_mib =
26633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen       payload_bytes_downloaded / kNumBytesInOneMiB;
26733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << payload_bytes_downloaded_mib
26833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
26933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
27033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         payload_bytes_downloaded_mib,
27133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,     // min: 0 MiB
27233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         1024,  // max: 1024 MiB = 1 GiB
27333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);   // num_buckets
27433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
27533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptPayloadDownloadSpeedKBps;
27633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  int64_t payload_download_speed_kbps = payload_download_speed_bps / 1000;
27733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << payload_download_speed_kbps
27833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
27933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
28033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         payload_download_speed_kbps,
28133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,        // min: 0 kB/s
28233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         10*1000,  // max: 10000 kB/s = 10 MB/s
28333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);      // num_buckets
28433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
28533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptDownloadSource;
28633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << download_source
28733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
28833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendEnumToUMA(metric,
28933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             download_source,
29033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             kNumDownloadSources);
29133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
29233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricAttemptResult;
29333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << static_cast<int>(attempt_result)
29433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
29533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendEnumToUMA(
29633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metric,
29733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      static_cast<int>(attempt_result),
29833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      static_cast<int>(AttemptResult::kNumConstants));
29933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
300d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold  if (internal_error_code != ErrorCode::kSuccess) {
30133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = metrics::kMetricAttemptInternalErrorCode;
30233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    LOG(INFO) << "Uploading " << internal_error_code
30333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen              << " for metric " <<  metric;
30433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    system_state->metrics_lib()->SendEnumToUMA(
30533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        metric,
306d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold        static_cast<int>(internal_error_code),
307d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold        static_cast<int>(ErrorCode::kUmaReportedMax));
30833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
30933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
31033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  if (payload_download_error_code != DownloadErrorCode::kUnset) {
31133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = metrics::kMetricAttemptDownloadErrorCode;
31233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    LOG(INFO) << "Uploading " << static_cast<int>(payload_download_error_code)
313c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen              << " for metric " <<  metric << " (sparse)";
314c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen    system_state->metrics_lib()->SendSparseToUMA(
31533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        metric,
316c0dd0210d01406df4b88086ea1349a75b8fe0584David Zeuthen        static_cast<int>(payload_download_error_code));
31733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
31833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
31933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  base::TimeDelta time_since_last;
320a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo  if (metrics_utils::WallclockDurationHelper(
321a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo          system_state,
322a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo          kPrefsMetricsAttemptLastReportingTime,
323a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo          &time_since_last)) {
32433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = kMetricAttemptTimeSinceLastAttemptMinutes;
32533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    LOG(INFO) << "Sending " << utils::FormatTimeDelta(time_since_last)
32633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen              << " for metric " << metric;
32733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    system_state->metrics_lib()->SendToUMA(
32833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        metric,
32933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        time_since_last.InMinutes(),
33033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        0,         // min: 0 min
33133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        30*24*60,  // max: 30 days
33233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        50);       // num_buckets
33333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
33433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
33533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  static int64_t uptime_since_last_storage = 0;
33633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  base::TimeDelta uptime_since_last;
337a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo  if (metrics_utils::MonotonicDurationHelper(system_state,
338a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo                                             &uptime_since_last_storage,
339a2591795edb1a4f4c751347daab16c70daad1274Alex Deymo                                             &uptime_since_last)) {
34033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = kMetricAttemptTimeSinceLastAttemptUptimeMinutes;
34133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    LOG(INFO) << "Sending " << utils::FormatTimeDelta(uptime_since_last)
34233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen              << " for metric " << metric;
34333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    system_state->metrics_lib()->SendToUMA(
34433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        metric,
34533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        uptime_since_last.InMinutes(),
34633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        0,         // min: 0 min
34733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        30*24*60,  // max: 30 days
34833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        50);       // num_buckets
34933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
350b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen
351b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  metric = metrics::kMetricAttemptConnectionType;
352b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  LOG(INFO) << "Uploading " << static_cast<int>(connection_type)
353b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen            << " for metric " <<  metric;
354b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen  system_state->metrics_lib()->SendEnumToUMA(
355b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen      metric,
356b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen      static_cast<int>(connection_type),
357b281f0768f4d95afcf7378229a1a9f9ec9bd69abDavid Zeuthen      static_cast<int>(ConnectionType::kNumConstants));
35833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}
35933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
36033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
36133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthenvoid ReportSuccessfulUpdateMetrics(
36233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         SystemState *system_state,
36333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         int attempt_count,
36433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         int updates_abandoned_count,
36533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         PayloadType payload_type,
36633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         int64_t payload_size,
36733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         int64_t num_bytes_downloaded[kNumDownloadSources],
36833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         int download_overhead_percentage,
36933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         base::TimeDelta total_duration,
37033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         int reboot_count,
37133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen         int url_switch_count) {
37233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  string metric;
37333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  int64_t mbs;
37433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
37533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = kMetricSuccessfulUpdatePayloadSizeMiB;
37633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  mbs = payload_size / kNumBytesInOneMiB;
37733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
37833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
37933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         mbs,
38033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,     // min: 0 MiB
38133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         1024,  // max: 1024 MiB = 1 GiB
38233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);   // num_buckets
38333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
38433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  int64_t total_bytes = 0;
38533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  int download_sources_used = 0;
38633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  for (int i = 0; i < kNumDownloadSources + 1; i++) {
38733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    DownloadSource source = static_cast<DownloadSource>(i);
38833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
38933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    // Only consider this download source (and send byte counts) as
39033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    // having been used if we downloaded a non-trivial amount of bytes
391072359ca138504065e1e0c1189eb38c09576d324Alex Vakulenko    // (e.g. at least 1 MiB) that contributed to the
39233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    // update. Otherwise we're going to end up with a lot of zero-byte
39333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    // events in the histogram.
39433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
39533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    metric = metrics::kMetricSuccessfulUpdateBytesDownloadedMiB;
39633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    if (i < kNumDownloadSources) {
39733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metric += utils::ToString(source);
39833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      mbs = num_bytes_downloaded[i] / kNumBytesInOneMiB;
39933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      total_bytes += num_bytes_downloaded[i];
40033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      if (mbs > 0)
40133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen        download_sources_used |= (1 << i);
40233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    } else {
40333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      mbs = total_bytes / kNumBytesInOneMiB;
40433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    }
40533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
40633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    if (mbs > 0) {
40733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      LOG(INFO) << "Uploading " << mbs << " (MiBs) for metric " << metric;
40833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      system_state->metrics_lib()->SendToUMA(metric,
40933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             mbs,
41033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             0,     // min: 0 MiB
41133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             1024,  // max: 1024 MiB = 1 GiB
41233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             50);   // num_buckets
41333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen    }
41433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  }
41533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
41633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricSuccessfulUpdateDownloadSourcesUsed;
41733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading 0x" << std::hex << download_sources_used
41833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " (bit flags) for metric " << metric;
41933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(
42033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      metric,
42133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      download_sources_used,
42233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      0,                               // min
42333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      (1 << kNumDownloadSources) - 1,  // max
42433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen      1 << kNumDownloadSources);       // num_buckets
42533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
42633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage;
42733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << download_overhead_percentage
42833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << "% for metric " << metric;
42933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
43033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         download_overhead_percentage,
43133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,     // min: 0% overhead
43233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         1000,  // max: 1000% overhead
43333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);   // num_buckets
43433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
43533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricSuccessfulUpdateUrlSwitchCount;
43633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << url_switch_count
43733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " (count) for metric " <<  metric;
43833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
43933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         url_switch_count,
44033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,    // min: 0 URL switches
44133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         49,   // max: 49 URL switches
44233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);  // num_buckets
44333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
44433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricSuccessfulUpdateTotalDurationMinutes;
44533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << utils::FormatTimeDelta(total_duration)
44633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
44733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(
44833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen       metric,
44933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen       static_cast<int>(total_duration.InMinutes()),
45033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen       0,          // min: 0 min
45133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen       365*24*60,  // max: 365 days ~= 1 year
45233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen       50);        // num_buckets
45333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
45433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricSuccessfulUpdateRebootCount;
45533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading reboot count of " << reboot_count << " for metric "
45633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            <<  metric;
45733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
45833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         reboot_count,
45933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,    // min: 0 reboots
46033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         49,   // max: 49 reboots
46133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);  // num_buckets
46233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
46333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricSuccessfulUpdatePayloadType;
46433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendEnumToUMA(metric,
46533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             payload_type,
46633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                             kNumPayloadTypes);
46733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << utils::ToString(payload_type)
46833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
46933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
47033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricSuccessfulUpdateAttemptCount;
47133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
47233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         attempt_count,
47333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         1,    // min: 1 attempt
47433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50,   // max: 50 attempts
47533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);  // num_buckets
47633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << attempt_count
47733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " for metric " <<  metric;
47833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
47933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  metric = metrics::kMetricSuccessfulUpdateUpdatesAbandonedCount;
48033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  LOG(INFO) << "Uploading " << updates_abandoned_count
48133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen            << " (count) for metric " <<  metric;
48233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen  system_state->metrics_lib()->SendToUMA(metric,
48333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         updates_abandoned_count,
48433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         0,    // min: 0 counts
48533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         49,   // max: 49 counts
48633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen                                         50);  // num_buckets
48733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}
48833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
48996197df73f6c804d96eb3a1390eb817f354089d2David Zeuthenvoid ReportRollbackMetrics(SystemState *system_state,
49096197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen                           RollbackResult result) {
49196197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  string metric;
49296197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  int value;
49396197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen
49496197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  metric = metrics::kMetricRollbackResult;
49596197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  value = static_cast<int>(result);
49696197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  LOG(INFO) << "Sending " << value << " for metric " << metric << " (enum)";
49796197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen  system_state->metrics_lib()->SendEnumToUMA(
49896197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen      metric,
49996197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen      value,
50096197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen      static_cast<int>(metrics::RollbackResult::kNumConstants));
50196197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen}
50296197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen
503c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymovoid ReportCertificateCheckMetrics(SystemState* system_state,
504c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                   ServerToCheck server_to_check,
505c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo                                   CertificateCheckResult result) {
506c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo  string metric;
507c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo  switch (server_to_check) {
508c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo    case ServerToCheck::kUpdate:
509c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo      metric = kMetricCertificateCheckUpdateCheck;
510c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo      break;
511c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo    case ServerToCheck::kDownload:
512c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo      metric = kMetricCertificateCheckDownload;
513c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo      break;
51433e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo    case ServerToCheck::kNone:
51533e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo      return;
516c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo  }
517c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo  LOG(INFO) << "Uploading " << static_cast<int>(result) << " for metric "
518c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo            << metric;
519c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo  system_state->metrics_lib()->SendEnumToUMA(
520c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo      metric, static_cast<int>(result),
521c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo      static_cast<int>(CertificateCheckResult::kNumConstants));
522c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo}
523c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo
52433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}  // namespace metrics
52533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen
52633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen}  // namespace chromeos_update_engine
527