shill: Add metrics for recording termination/suspend time

Added the following metrics:

 - Network.Shill.TerminationActionResult.OnSuspend,
 - Network.Shill.TerminationActionResult.OnTerminate,

which log success/failure;

 - Network.Shill.TerminationActionTime.OnSuspend,
 - Network.Shill.TerminationActionTime.OnTerminate,

which measure the time it takes to complete the termination actions.

BUG=chromium-os:35029
TEST=Manually suspended machine and terminated shill on separate
occasions and observed the output on chrome://histograms

Change-Id: I5183d7c3dd5d4633f661598b7a0cacab6d205d8b
Reviewed-on: https://gerrit.chromium.org/gerrit/34975
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Ready: Arman Uguray <armansito@chromium.org>
Tested-by: Arman Uguray <armansito@chromium.org>
diff --git a/metrics.h b/metrics.h
index d0d070c..a6c8cf8 100644
--- a/metrics.h
+++ b/metrics.h
@@ -140,11 +140,16 @@
   };
 
   enum TerminationActionResult {
-    kTerminationActionSuccess,
-    kTerminationActionFailure,
+    kTerminationActionResultSuccess,
+    kTerminationActionResultFailure,
     kTerminationActionResultMax
   };
 
+  enum TerminationActionReason {
+    kTerminationActionReasonSuspend,
+    kTerminationActionReasonTerminate
+  };
+
   static const char kMetricDisconnect[];
   static const int kMetricDisconnectMax;
   static const int kMetricDisconnectMin;
@@ -220,7 +225,12 @@
   static const char kMetricLinkApDisconnectType[];
 
   // Shill termination action statistics.
-  static const char kMetricTerminationActionResult[];
+  static const char kMetricTerminationActionTimeOnTerminate[];
+  static const char kMetricTerminationActionResultOnTerminate[];
+  static const char kMetricTerminationActionTimeOnSuspend[];
+  static const char kMetricTerminationActionResultOnSuspend[];
+  static const int kMetricTerminationActionTimeMillisecondsMax;
+  static const int kMetricTerminationActionTimeMillisecondsMin;
 
   Metrics();
   virtual ~Metrics();
@@ -268,6 +278,14 @@
   // Notifies this object of a power management state change.
   void NotifyPowerStateChange(PowerManager::SuspendState new_state);
 
+  // Notifies this object that termination actions started executing.
+  void NotifyTerminationActionsStarted(TerminationActionReason reason);
+
+  // Notifies this object that termination actions have been completed.
+  // |success| is true, if the termination actions completed successfully.
+  void NotifyTerminationActionsCompleted(
+      TerminationActionReason reason, bool success);
+
   // Notifies this object of a failure in LinkMonitor.
   void NotifyLinkMonitorFailure(
       Technology::Identifier technology,
@@ -354,6 +372,10 @@
   void set_time_resume_to_ready_timer(chromeos_metrics::Timer *timer) {
     time_resume_to_ready_timer_.reset(timer);  // Passes ownership
   }
+  void set_time_termination_actions_timer(
+    chromeos_metrics::Timer *timer) {
+    time_termination_actions_timer.reset(timer);  // Passes ownership
+  }
 
   // |library_| points to |metrics_library_| when shill runs normally.
   // However, in order to allow for unit testing, we point |library_| to a
@@ -366,6 +388,7 @@
   scoped_ptr<chromeos_metrics::Timer> time_online_timer_;
   scoped_ptr<chromeos_metrics::Timer> time_to_drop_timer_;
   scoped_ptr<chromeos_metrics::Timer> time_resume_to_ready_timer_;
+  scoped_ptr<chromeos_metrics::Timer> time_termination_actions_timer;
   bool collect_bootstats_;
 
   DISALLOW_COPY_AND_ASSIGN(Metrics);