Report more android update metrics in update engine
Report more metrics with android::metricslogger.
Metrics include:
ota_update_engine_attempt_number
ota_update_engine_attempt_result
ota_update_engine_attempt_duration_in_minutes
ota_update_engine_attempt_duration_uptime_in_minutes
ota_update_engine_attempt_payload_size_mib
ota_update_engine_attempt_payload_type
ota_update_engine_successful_update_attempt_count
ota_update_engine_successful_update_total_duration_in_minutes
ota_update_engine_successful_update_payload_size_mib
ota_update_engine_successful_update_payload_type
ota_update_engine_successful_update_reboot_count
And the google3 CL in cr/review/172829231
Bug: 30989466
Test: compile update_engine for marlin
Change-Id: Ic0ead07d1bd4a575244eb5e05588b47ba7b0bafe
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
}