Jian Li
Committed by Gerrit Code Review

[ONOS-401] Support JSON output parameter for MetricsListCommand

Change-Id: Id327a4d406dc924ec53dc54bb9939654759d947a
...@@ -24,6 +24,8 @@ import com.codahale.metrics.Metric; ...@@ -24,6 +24,8 @@ import com.codahale.metrics.Metric;
24 import com.codahale.metrics.MetricFilter; 24 import com.codahale.metrics.MetricFilter;
25 import com.codahale.metrics.Snapshot; 25 import com.codahale.metrics.Snapshot;
26 import com.codahale.metrics.Timer; 26 import com.codahale.metrics.Timer;
27 +import com.fasterxml.jackson.databind.ObjectMapper;
28 +import com.fasterxml.jackson.databind.node.ObjectNode;
27 import com.google.common.base.Strings; 29 import com.google.common.base.Strings;
28 import com.google.common.collect.Ordering; 30 import com.google.common.collect.Ordering;
29 import com.google.common.collect.TreeMultimap; 31 import com.google.common.collect.TreeMultimap;
...@@ -45,6 +47,25 @@ import static java.lang.String.format; ...@@ -45,6 +47,25 @@ import static java.lang.String.format;
45 description = "Prints metrics in the system") 47 description = "Prints metrics in the system")
46 public class MetricsListCommand extends AbstractShellCommand { 48 public class MetricsListCommand extends AbstractShellCommand {
47 49
50 + private static final String COUNTER = "counter";
51 +
52 + private static final String GAUGE = "gauge";
53 + private static final String VALUE = "value";
54 +
55 + private static final String METER = "meter";
56 + private static final String MEAN_RATE = "mean_rate";
57 + private static final String ONE_MIN_RATE = "1_min_rate";
58 + private static final String FIVE_MIN_RATE = "5_min_rate";
59 + private static final String FIFT_MIN_RATE = "15_min_rate";
60 +
61 + private static final String HISTOGRAM = "histogram";
62 + private static final String MIN = "min";
63 + private static final String MAX = "max";
64 + private static final String MEAN = "mean";
65 + private static final String STDDEV = "stddev";
66 +
67 + private static final String TIMER = "timer";
68 +
48 @Argument(index = 0, name = "metricName", description = "Name of Metric", 69 @Argument(index = 0, name = "metricName", description = "Name of Metric",
49 required = false, multiValued = false) 70 required = false, multiValued = false)
50 String metricName = null; 71 String metricName = null;
...@@ -57,8 +78,10 @@ public class MetricsListCommand extends AbstractShellCommand { ...@@ -57,8 +78,10 @@ public class MetricsListCommand extends AbstractShellCommand {
57 78
58 TreeMultimap<String, Metric> matched = listMetrics(metricsService, filter); 79 TreeMultimap<String, Metric> matched = listMetrics(metricsService, filter);
59 matched.asMap().forEach((name, metrics) -> { 80 matched.asMap().forEach((name, metrics) -> {
60 - for (Metric metric : metrics) { 81 + if (outputJson()) {
61 - printMetric(name, metric); 82 + metrics.forEach(metric -> print("%s", json(metric)));
83 + } else {
84 + metrics.forEach(metric -> printMetric(name, metric));
62 } 85 }
63 }); 86 });
64 } 87 }
...@@ -161,6 +184,52 @@ public class MetricsListCommand extends AbstractShellCommand { ...@@ -161,6 +184,52 @@ public class MetricsListCommand extends AbstractShellCommand {
161 return metrics; 184 return metrics;
162 } 185 }
163 186
187 + /**
188 + * Creates a json object for a certain metric.
189 + *
190 + * @param metric metric object
191 + * @return json object
192 + */
193 + private ObjectNode json(Metric metric) {
194 + ObjectMapper mapper = new ObjectMapper();
195 + ObjectNode objectNode = mapper.createObjectNode();
196 + ObjectNode dataNode = mapper.createObjectNode();
197 +
198 + if (metric instanceof Counter) {
199 + dataNode.put(COUNTER, ((Counter) metric).getCount());
200 + objectNode.set(COUNTER, dataNode);
201 + } else if (metric instanceof Gauge) {
202 + objectNode.put(VALUE, ((Gauge) metric).getValue().toString());
203 + objectNode.set(GAUGE, dataNode);
204 + } else if (metric instanceof Meter) {
205 + dataNode.put(COUNTER, ((Meter) metric).getCount());
206 + dataNode.put(MEAN_RATE, ((Meter) metric).getMeanRate());
207 + dataNode.put(ONE_MIN_RATE, ((Meter) metric).getOneMinuteRate());
208 + dataNode.put(FIVE_MIN_RATE, ((Meter) metric).getFiveMinuteRate());
209 + dataNode.put(FIFT_MIN_RATE, ((Meter) metric).getFifteenMinuteRate());
210 + objectNode.set(METER, dataNode);
211 + } else if (metric instanceof Histogram) {
212 + dataNode.put(COUNTER, ((Histogram) metric).getCount());
213 + dataNode.put(MEAN, ((Histogram) metric).getSnapshot().getMean());
214 + dataNode.put(MIN, ((Histogram) metric).getSnapshot().getMin());
215 + dataNode.put(MAX, ((Histogram) metric).getSnapshot().getMax());
216 + dataNode.put(STDDEV, ((Histogram) metric).getSnapshot().getStdDev());
217 + objectNode.set(HISTOGRAM, dataNode);
218 + } else if (metric instanceof Timer) {
219 + dataNode.put(COUNTER, ((Timer) metric).getCount());
220 + dataNode.put(MEAN_RATE, ((Timer) metric).getMeanRate());
221 + dataNode.put(ONE_MIN_RATE, ((Timer) metric).getOneMinuteRate());
222 + dataNode.put(FIVE_MIN_RATE, ((Timer) metric).getFiveMinuteRate());
223 + dataNode.put(FIFT_MIN_RATE, ((Timer) metric).getFifteenMinuteRate());
224 + dataNode.put(MEAN, nanoToMs(((Timer) metric).getSnapshot().getMean()));
225 + dataNode.put(MIN, nanoToMs(((Timer) metric).getSnapshot().getMin()));
226 + dataNode.put(MAX, nanoToMs(((Timer) metric).getSnapshot().getMax()));
227 + dataNode.put(STDDEV, nanoToMs(((Timer) metric).getSnapshot().getStdDev()));
228 + objectNode.set(TIMER, dataNode);
229 + }
230 + return objectNode;
231 + }
232 +
164 private double nanoToMs(double nano) { 233 private double nanoToMs(double nano) {
165 return nano / 1_000_000D; 234 return nano / 1_000_000D;
166 } 235 }
......