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))