metrics command to dump all the Metric in the system.

- Add probe to measure the time spent querying for Mastership.

Change-Id: I48fe37568a3261ee5b6229a3884e42a3a741b407
diff --git a/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java b/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
index e97a553..66509b6 100644
--- a/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
+++ b/core/net/src/main/java/org/onlab/onos/cluster/impl/MastershipManager.java
@@ -27,6 +27,9 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.metrics.MetricsComponent;
+import org.onlab.metrics.MetricsFeature;
+import org.onlab.metrics.MetricsService;
 import org.onlab.onos.cluster.ClusterEvent;
 import org.onlab.onos.cluster.ClusterEventListener;
 import org.onlab.onos.cluster.ClusterService;
@@ -47,6 +50,9 @@
 import org.onlab.onos.net.MastershipRole;
 import org.slf4j.Logger;
 
+import com.codahale.metrics.Timer;
+import com.codahale.metrics.Timer.Context;
+
 @Component(immediate = true)
 @Service
 public class MastershipManager
@@ -72,10 +78,16 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ClusterService clusterService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected MetricsService metricsService;
+
     private ClusterEventListener clusterListener = new InternalClusterEventListener();
+    private Timer requestRoleTimer;
 
     @Activate
     public void activate() {
+        requestRoleTimer = createTimer("Mastership", "requestRole", "responseTime");
+
         eventDispatcher.addSink(MastershipEvent.class, listenerRegistry);
         clusterService.addListener(clusterListener);
         store.setDelegate(delegate);
@@ -137,7 +149,12 @@
     @Override
     public MastershipRole requestRoleFor(DeviceId deviceId) {
         checkNotNull(deviceId, DEVICE_ID_NULL);
-        return store.requestRole(deviceId);
+        final Context timer = startTimer(requestRoleTimer);
+        try {
+            return store.requestRole(deviceId);
+        } finally {
+            stopTimer(timer);
+        }
     }
 
     @Override
@@ -186,6 +203,28 @@
 
 
 
+    private Timer createTimer(String component, String feature, String name) {
+        if (metricsService != null) {
+            MetricsComponent c = metricsService.registerComponent(component);
+            MetricsFeature f = c.registerFeature(feature);
+            return metricsService.createTimer(c, f, name);
+        }
+        return null;
+    }
+
+    private static final Context startTimer(Timer timer) {
+        if (timer != null) {
+            return timer.time();
+        }
+        return null;
+    }
+
+    private static final void stopTimer(Context context) {
+        if (context != null) {
+            context.stop();
+        }
+    }
+
     //callback for reacting to cluster events
     private class InternalClusterEventListener implements ClusterEventListener {