Add Installer.UpdatesAbandonedEventCount metric.

This patch adds a new metric similar to
Installer.UpdatesAbandonedCount that reports the number of abandoned
payloads every time a payload is abandoned. A payload is considered
"abandoned" when it was already attempted but not finished for any
reason, and a newer payload is avaibled. In this situation,
update_engine drops the previous payload and starts again with the
new one.

Every time a payload is abandoned, the new metric
Installer.UpdatesAbandonedEventCount is sent with the number of
consecutive different abandoned payloads since the last successful
update. A high number of entries greater than 1 in this metric will
imply that we are releasing new payloads too often, or that the users
are taking too long to download an update.

Finally, when a payload is successfully applied, the total number of
abandoned payloads since the previous successful update is sent as
the the metric Installer.UpdatesAbandonedCount.

BUG=chromium:261370
TEST=unittests

Change-Id: I47054b541c4700a86183461a5cf92830883ea4f3
Reviewed-on: https://gerrit.chromium.org/gerrit/65328
Commit-Queue: Alex Deymo <deymo@chromium.org>
Reviewed-by: Alex Deymo <deymo@chromium.org>
Tested-by: Alex Deymo <deymo@chromium.org>
diff --git a/payload_state.cc b/payload_state.cc
index 6d6791f..1d7e0fe 100644
--- a/payload_state.cc
+++ b/payload_state.cc
@@ -92,6 +92,7 @@
     SetNumResponsesSeen(num_responses_seen_ + 1);
     SetResponseSignature(new_response_signature);
     ResetPersistedState();
+    ReportUpdatesAbandonedEventCountMetric();
     return;
   }
 
@@ -1045,6 +1046,24 @@
        kNumDefaultUmaBuckets);
 }
 
+void PayloadState::ReportUpdatesAbandonedEventCountMetric() {
+  string metric = "Installer.UpdatesAbandonedEventCount";
+  int value = num_responses_seen_ - 1;
+
+  // Do not send an "abandoned" event when 0 payloads were abandoned since the
+  // last successful update.
+  if (value == 0)
+    return;
+
+  LOG(INFO) << "Uploading " << value << " (count) for metric " <<  metric;
+  system_state_->metrics_lib()->SendToUMA(
+       metric,
+       value,
+       0,    // min value
+       100,  // max value
+       kNumDefaultUmaBuckets);
+}
+
 void PayloadState::ComputeCandidateUrls() {
   bool http_url_ok = false;