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