shill: LinkMonitor: Add more metrics

LinkMonitorSecondsToFailure, LinkMonitorUnicastErrorsAtFailure,
and LinkMonitorBroadcastErrorsAtFailure.

BUG=chromium-os:32600
TEST=Unit tests.

Change-Id: I0a90deee5675ebfb665a76f8e7707eaaecc23ce9
Reviewed-on: https://gerrit.chromium.org/gerrit/29792
Reviewed-by: mukesh agrawal <quiche@chromium.org>
Commit-Ready: Paul Stewart <pstew@chromium.org>
Tested-by: Paul Stewart <pstew@chromium.org>
diff --git a/metrics.cc b/metrics.cc
index 725ef21..dc83a50 100644
--- a/metrics.cc
+++ b/metrics.cc
@@ -105,11 +105,24 @@
     "Network.Shill.%s.LinkMonitorFailure";
 const char Metrics::kMetricLinkMonitorResponseTimeSample[] =
     "Network.Shill.%s.LinkMonitorResponseTimeSample";
-const int Metrics::kMetricLinkMonitorResponseTimeSampleMin = 0;
-const int Metrics::kMetricLinkMonitorResponseTimeSampleMax =
+const unsigned int Metrics::kMetricLinkMonitorResponseTimeSampleMin = 0;
+const unsigned int Metrics::kMetricLinkMonitorResponseTimeSampleMax =
     LinkMonitor::kTestPeriodMilliseconds;
 const int Metrics::kMetricLinkMonitorResponseTimeSampleNumBuckets = 50;
-
+const char Metrics::kMetricLinkMonitorSecondsToFailure[] =
+    "Network.Shill.%s.LinkMonitorSecondsToFailure";
+const unsigned int Metrics::kMetricLinkMonitorSecondsToFailureMin = 0;
+const unsigned int Metrics::kMetricLinkMonitorSecondsToFailureMax = 7200;
+const int Metrics::kMetricLinkMonitorSecondsToFailureNumBuckets = 50;
+const char Metrics::kMetricLinkMonitorBroadcastErrorsAtFailure[] =
+    "Network.Shill.%s.LinkMonitorBroadcastErrorsAtFailure";
+const char Metrics::kMetricLinkMonitorUnicastErrorsAtFailure[] =
+    "Network.Shill.%s.LinkMonitorUnicastErrorsAtFailure";
+const unsigned int Metrics::kMetricLinkMonitorErrorCountMin = 0;
+const unsigned int Metrics::kMetricLinkMonitorErrorCountMax =
+    LinkMonitor::kFailureThreshold;
+const int Metrics::kMetricLinkMonitorErrorCountNumBuckets =
+    LinkMonitor::kFailureThreshold + 1;
 
 Metrics::Metrics()
     : library_(&metrics_library_),
@@ -389,10 +402,41 @@
 }
 
 void Metrics::NotifyLinkMonitorFailure(
-    Technology::Identifier technology, LinkMonitorFailure failure) {
+    Technology::Identifier technology,
+    LinkMonitorFailure failure,
+    unsigned int seconds_to_failure,
+    unsigned int broadcast_error_count,
+    unsigned int unicast_error_count) {
   string histogram = GetFullMetricName(kMetricLinkMonitorFailure,
                                        technology);
   SendEnumToUMA(histogram, failure, kLinkMonitorFailureMax);
+
+  if (failure == kLinkMonitorFailureThresholdReached) {
+    if (seconds_to_failure > kMetricLinkMonitorSecondsToFailureMax) {
+      seconds_to_failure = kMetricLinkMonitorSecondsToFailureMax;
+    }
+    histogram = GetFullMetricName(kMetricLinkMonitorSecondsToFailure,
+                                  technology);
+    SendToUMA(histogram,
+              seconds_to_failure,
+              kMetricLinkMonitorSecondsToFailureMin,
+              kMetricLinkMonitorSecondsToFailureMax,
+              kMetricLinkMonitorSecondsToFailureNumBuckets);
+    histogram = GetFullMetricName(kMetricLinkMonitorBroadcastErrorsAtFailure,
+                                  technology);
+    SendToUMA(histogram,
+              broadcast_error_count,
+              kMetricLinkMonitorErrorCountMin,
+              kMetricLinkMonitorErrorCountMax,
+              kMetricLinkMonitorErrorCountNumBuckets);
+    histogram = GetFullMetricName(kMetricLinkMonitorUnicastErrorsAtFailure,
+                                  technology);
+    SendToUMA(histogram,
+              unicast_error_count,
+              kMetricLinkMonitorErrorCountMin,
+              kMetricLinkMonitorErrorCountMax,
+              kMetricLinkMonitorErrorCountNumBuckets);
+  }
 }
 
 void Metrics::NotifyLinkMonitorResponseTimeSampleAdded(