Report more android update metrics in update engine
am: 52c678cddc
Change-Id: I5408eefc01242233b5947fb028807ef5963ac76c
diff --git a/metrics_reporter_android.cc b/metrics_reporter_android.cc
index 4a57918..bdc245e 100644
--- a/metrics_reporter_android.cc
+++ b/metrics_reporter_android.cc
@@ -17,31 +17,120 @@
#include "update_engine/metrics_reporter_android.h"
#ifndef _UE_SIDELOAD
+#include <string>
+
#include <metricslogger/metrics_logger.h>
+
+#include "update_engine/common/constants.h"
#endif // _UE_SIDELOAD
+namespace {
+#ifndef _UE_SIDELOAD
+void LogHistogram(const std::string& metrics, int value) {
+ android::metricslogger::LogHistogram(metrics, value);
+ LOG(INFO) << "uploading " << value << "to histogram for metric " << metrics;
+}
+#endif
+} // namespace
+
namespace chromeos_update_engine {
namespace metrics {
#ifndef _UE_SIDELOAD
-const char kMetricsUpdateEngineErrorCode[] = "ota_update_engine_error_code";
+// The histograms are defined in:
+// depot/google3/analysis/uma/configs/clearcut/TRON/histograms.xml
+constexpr char kMetricsUpdateEngineAttemptNumber[] =
+ "ota_update_engine_attempt_count";
+constexpr char kMetricsUpdateEngineAttemptResult[] =
+ "ota_update_engine_attempt_result";
+constexpr char kMetricsUpdateEngineAttemptDurationInMinutes[] =
+ "ota_update_engine_attempt_duration_in_minutes";
+constexpr char kMetricsUpdateEngineAttemptDurationUptimeInMinutes[] =
+ "ota_update_engine_attempt_duration_uptime_in_minutes";
+constexpr char kMetricsUpdateEngineAttemptErrorCode[] =
+ "ota_update_engine_attempt_error_code";
+constexpr char kMetricsUpdateEngineAttemptPayloadSizeMiB[] =
+ "ota_update_engine_attempt_payload_size_mib";
+constexpr char kMetricsUpdateEngineAttemptPayloadType[] =
+ "ota_update_engine_attempt_payload_type";
+
+constexpr char kMetricsUpdateEngineSuccessfulUpdateAttemptCount[] =
+ "ota_update_engine_successful_update_attempt_count";
+constexpr char kMetricsUpdateEngineSuccessfulUpdateTotalDurationInMinutes[] =
+ "ota_update_engine_successful_update_total_duration_in_minutes";
+constexpr char kMetricsUpdateEngineSuccessfulUpdatePayloadSizeMiB[] =
+ "ota_update_engine_successful_update_payload_size_mib";
+constexpr char kMetricsUpdateEngineSuccessfulUpdatePayloadType[] =
+ "ota_update_engine_successful_update_payload_type";
+constexpr char kMetricsUpdateEngineSuccessfulUpdateRebootCount[] =
+ "ota_update_engine_successful_update_reboot_count";
#endif
} // namespace metrics
void MetricsReporterAndroid::ReportUpdateAttemptMetrics(
SystemState* /* system_state */,
- int /* attempt_number */,
- PayloadType /* payload_type */,
- base::TimeDelta /* duration */,
- base::TimeDelta /* duration_uptime */,
- int64_t /* payload_size */,
- metrics::AttemptResult /* attempt_result */,
+ int attempt_number,
+ PayloadType payload_type,
+ base::TimeDelta duration,
+ base::TimeDelta duration_uptime,
+ int64_t payload_size,
+ metrics::AttemptResult attempt_result,
ErrorCode error_code) {
// No need to log histogram under sideload mode.
#ifndef _UE_SIDELOAD
- android::metricslogger::LogHistogram(metrics::kMetricsUpdateEngineErrorCode,
- static_cast<int>(error_code));
+ LogHistogram(metrics::kMetricsUpdateEngineAttemptNumber, attempt_number);
+ LogHistogram(metrics::kMetricsUpdateEngineAttemptPayloadType,
+ static_cast<int>(payload_type));
+ LogHistogram(metrics::kMetricsUpdateEngineAttemptDurationInMinutes,
+ duration.InMinutes());
+ LogHistogram(metrics::kMetricsUpdateEngineAttemptDurationUptimeInMinutes,
+ duration_uptime.InMinutes());
+
+ int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
+ LogHistogram(metrics::kMetricsUpdateEngineAttemptPayloadSizeMiB,
+ payload_size_mib);
+
+ LogHistogram(metrics::kMetricsUpdateEngineAttemptResult,
+ static_cast<int>(attempt_result));
+ LogHistogram(metrics::kMetricsUpdateEngineAttemptErrorCode,
+ static_cast<int>(error_code));
+#endif
+}
+
+void MetricsReporterAndroid::ReportSuccessfulUpdateMetrics(
+ int attempt_count,
+ int /* updates_abandoned_count */,
+ PayloadType payload_type,
+ int64_t payload_size,
+ int64_t* /* num_bytes_downloaded */,
+ int /* download_overhead_percentage */,
+ base::TimeDelta total_duration,
+ int reboot_count,
+ int /* url_switch_count */) {
+#ifndef _UE_SIDELOAD
+ LogHistogram(metrics::kMetricsUpdateEngineSuccessfulUpdateAttemptCount,
+ attempt_count);
+ LogHistogram(metrics::kMetricsUpdateEngineSuccessfulUpdatePayloadType,
+ static_cast<int>(payload_type));
+
+ int64_t payload_size_mib = payload_size / kNumBytesInOneMiB;
+ LogHistogram(metrics::kMetricsUpdateEngineSuccessfulUpdatePayloadSizeMiB,
+ payload_size_mib);
+
+ LogHistogram(
+ metrics::kMetricsUpdateEngineSuccessfulUpdateTotalDurationInMinutes,
+ total_duration.InMinutes());
+ LogHistogram(metrics::kMetricsUpdateEngineSuccessfulUpdateRebootCount,
+ reboot_count);
+#endif
+}
+
+void MetricsReporterAndroid::ReportAbnormallyTerminatedUpdateAttemptMetrics() {
+#ifndef _UE_SIDELOAD
+ int attempt_result =
+ static_cast<int>(metrics::AttemptResult::kAbnormalTermination);
+ LogHistogram(metrics::kMetricsUpdateEngineAttemptResult, attempt_result);
#endif
}
diff --git a/metrics_reporter_android.h b/metrics_reporter_android.h
index b83e651..373730b 100644
--- a/metrics_reporter_android.h
+++ b/metrics_reporter_android.h
@@ -57,7 +57,7 @@
metrics::DownloadErrorCode payload_download_error_code,
metrics::ConnectionType connection_type) override {}
- void ReportAbnormallyTerminatedUpdateAttemptMetrics() override {}
+ void ReportAbnormallyTerminatedUpdateAttemptMetrics() override;
void ReportSuccessfulUpdateMetrics(
int attempt_count,
@@ -68,7 +68,7 @@
int download_overhead_percentage,
base::TimeDelta total_duration,
int reboot_count,
- int url_switch_count) override {}
+ int url_switch_count) override;
void ReportCertificateCheckMetrics(ServerToCheck server_to_check,
CertificateCheckResult result) override {}
diff --git a/update_attempter_android.cc b/update_attempter_android.cc
index 22bb4c2..dbddfe3 100644
--- a/update_attempter_android.cc
+++ b/update_attempter_android.cc
@@ -557,13 +557,14 @@
metrics_utils::GetAttemptResult(error_code);
Time attempt_start_time = Time::FromInternalValue(
metrics_utils::GetPersistedValue(kPrefsUpdateTimestampStart, prefs_));
+ TimeDelta duration = clock_->GetBootTime() - attempt_start_time;
TimeDelta duration_uptime = clock_->GetMonotonicTime() - attempt_start_time;
metrics_reporter_->ReportUpdateAttemptMetrics(
nullptr, // system_state
static_cast<int>(attempt_number),
payload_type,
- TimeDelta(),
+ duration,
duration_uptime,
payload_size,
attempt_result,
@@ -581,7 +582,7 @@
payload_size,
nullptr, // num bytes downloaded
0, // download overhead percentage
- duration_uptime,
+ duration,
static_cast<int>(reboot_count),
0); // url_switch_count
}
diff --git a/update_attempter_android_unittest.cc b/update_attempter_android_unittest.cc
index 6c0718a..ac6cec2 100644
--- a/update_attempter_android_unittest.cc
+++ b/update_attempter_android_unittest.cc
@@ -120,16 +120,19 @@
prefs_.SetString(kPrefsPreviousVersion, "56789");
prefs_.SetInt64(kPrefsUpdateTimestampStart, 12345);
- Time now = Time::FromInternalValue(22345);
- clock_->SetMonotonicTime(now);
- TimeDelta duration = now - Time::FromInternalValue(12345);
+ Time boot_time = Time::FromInternalValue(22345);
+ Time up_time = Time::FromInternalValue(21345);
+ clock_->SetBootTime(boot_time);
+ clock_->SetMonotonicTime(up_time);
+ TimeDelta duration = boot_time - Time::FromInternalValue(12345);
+ TimeDelta duration_uptime = up_time - Time::FromInternalValue(12345);
EXPECT_CALL(
*metrics_reporter_,
ReportUpdateAttemptMetrics(_,
2,
_,
- _,
duration,
+ duration_uptime,
_,
metrics::AttemptResult::kUpdateSucceeded,
ErrorCode::kSuccess))