Performance Metrics service and manager added
diff --git a/utils/misc/src/main/java/org/onlab/metrics/MetricsService.java b/utils/misc/src/main/java/org/onlab/metrics/MetricsService.java
new file mode 100644
index 0000000..a2fdc5e
--- /dev/null
+++ b/utils/misc/src/main/java/org/onlab/metrics/MetricsService.java
@@ -0,0 +1,131 @@
+package org.onlab.metrics;
+
+import java.util.Map;
+
+import com.codahale.metrics.Counter;
+import com.codahale.metrics.Gauge;
+import com.codahale.metrics.Histogram;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.Metric;
+import com.codahale.metrics.MetricFilter;
+import com.codahale.metrics.Timer;
+
+/**
+ * Metrics Service to collect metrics.
+ */
+interface MetricsService {
+
+ /**
+ * Registers a component.
+ *
+ * @param name name of the Component to register
+ * @return MetricsComponent object that can be used to create Metrics.
+ */
+ MetricsComponent registerComponent(String name);
+
+ /**
+ * Creates a Counter metric.
+ *
+ * @param component component the Counter is defined in
+ * @param feature feature the Counter is defined in
+ * @param metricName local name of the metric
+ * @return the created Counter Meteric
+ */
+ Counter createCounter(MetricsComponent component,
+ MetricsFeature feature,
+ String metricName);
+
+ /**
+ * Creates a Histogram metric.
+ *
+ * @param component component the Histogram is defined in
+ * @param feature feature the Histogram is defined in
+ * @param metricName local name of the metric
+ * @return the created Histogram Metric
+ */
+ Histogram createHistogram(MetricsComponent component,
+ MetricsFeature feature,
+ String metricName);
+
+ /**
+ * Creates a Timer metric.
+ *
+ * @param component component the Timer is defined in
+ * @param feature feature the Timer is defined in
+ * @param metricName local name of the metric
+ * @return the created Timer Metric
+ */
+ Timer createTimer(MetricsComponent component,
+ MetricsFeature feature,
+ String metricName);
+
+ /**
+ * Registers an already created Metric. This is used for situation where a
+ * caller needs to allocate its own Metric, but still register it with the
+ * system.
+ *
+ * @param <T> Metric type
+ * @param component component the Metric is defined in
+ * @param feature feature the Metric is defined in
+ * @param metricName local name of the metric
+ * @param metric Metric to register
+ * @return the registered Metric
+ */
+ <T extends Metric> T registerMetric(
+ MetricsComponent component,
+ MetricsFeature feature,
+ String metricName,
+ T metric);
+
+ /**
+ * Fetches the existing Timers.
+ *
+ * @param filter filter to use to select Timers
+ * @return a map of the Timers that match the filter, with the key as the
+ * name String to the Timer.
+ */
+ Map<String, Timer> getTimers(MetricFilter filter);
+
+ /**
+ * Fetches the existing Gauges.
+ *
+ * @param filter filter to use to select Gauges
+ * @return a map of the Gauges that match the filter, with the key as the
+ * name String to the Gauge.
+ */
+ Map<String, Gauge> getGauges(MetricFilter filter);
+
+ /**
+ * Fetches the existing Counters.
+ *
+ * @param filter filter to use to select Counters
+ * @return a map of the Counters that match the filter, with the key as the
+ * name String to the Counter.
+ */
+ Map<String, Counter> getCounters(MetricFilter filter);
+
+ /**
+ * Fetches the existing Meters.
+ *
+ * @param filter filter to use to select Meters
+ * @return a map of the Meters that match the filter, with the key as the
+ * name String to the Meter.
+ */
+ Map<String, Meter> getMeters(MetricFilter filter);
+
+ /**
+ * Fetches the existing Histograms.
+ *
+ * @param filter filter to use to select Histograms
+ * @return a map of the Histograms that match the filter, with the key as the
+ * name String to the Histogram.
+ */
+ Map<String, Histogram> getHistograms(MetricFilter filter);
+ /**
+ * Removes all Metrics that match a given filter.
+ *
+ * @param filter filter to use to select the Metrics to remove.
+ */
+ void removeMatching(MetricFilter filter);
+
+}