/* * Copyright 2014 Open Networking Laboratory * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.onosproject.cli; 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.Snapshot; import com.codahale.metrics.Timer; import com.google.common.base.Strings; import com.google.common.collect.Ordering; import com.google.common.collect.TreeMultimap; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; import org.joda.time.LocalDateTime; import org.onlab.metrics.MetricsService; import java.util.Comparator; import java.util.Map; import java.util.Map.Entry; import static java.lang.String.format; /** * Prints metrics in the system. */ @Command(scope = "onos", name = "metrics", description = "Prints metrics in the system") public class MetricsListCommand extends AbstractShellCommand { @Argument(index = 0, name = "metricName", description = "Name of Metric", required = false, multiValued = false) String metricName = null; @Override protected void execute() { MetricsService metricsService = get(MetricsService.class); MetricFilter filter = metricName != null ? (name, metric) -> name.equals(metricName) : MetricFilter.ALL; TreeMultimap matched = listMetrics(metricsService, filter); matched.asMap().forEach((name, metrics) -> { for (Metric metric : metrics) { printMetric(name, metric); } }); } /** * Print metric object. * * @param name metric name * @param metric metric object */ private void printMetric(String name, Metric metric) { final String heading; if (metric instanceof Counter) { heading = format("-- %s : [%s] --", name, "Counter"); print(heading); Counter counter = (Counter) metric; print(" count = %d", counter.getCount()); } else if (metric instanceof Gauge) { heading = format("-- %s : [%s] --", name, "Gauge"); print(heading); @SuppressWarnings("rawtypes") Gauge gauge = (Gauge) metric; final Object value = gauge.getValue(); if (name.endsWith("EpochMs") && value instanceof Long) { print(" value = %s (%s)", value, new LocalDateTime(value)); } else { print(" value = %s", value); } } else if (metric instanceof Histogram) { heading = format("-- %s : [%s] --", name, "Histogram"); print(heading); final Histogram histogram = (Histogram) metric; final Snapshot snapshot = histogram.getSnapshot(); print(" count = %d", histogram.getCount()); print(" min = %d", snapshot.getMin()); print(" max = %d", snapshot.getMax()); print(" mean = %f", snapshot.getMean()); print(" stddev = %f", snapshot.getStdDev()); } else if (metric instanceof Meter) { heading = format("-- %s : [%s] --", name, "Meter"); print(heading); final Meter meter = (Meter) metric; print(" count = %d", meter.getCount()); print(" mean rate = %f", meter.getMeanRate()); print(" 1-minute rate = %f", meter.getOneMinuteRate()); print(" 5-minute rate = %f", meter.getFiveMinuteRate()); print(" 15-minute rate = %f", meter.getFifteenMinuteRate()); } else if (metric instanceof Timer) { heading = format("-- %s : [%s] --", name, "Timer"); print(heading); final Timer timer = (Timer) metric; final Snapshot snapshot = timer.getSnapshot(); print(" count = %d", timer.getCount()); print(" mean rate = %f per second", timer.getMeanRate()); print(" 1-minute rate = %f per second", timer.getOneMinuteRate()); print(" 5-minute rate = %f per second", timer.getFiveMinuteRate()); print(" 15-minute rate = %f per second", timer.getFifteenMinuteRate()); print(" min = %f ms", nanoToMs(snapshot.getMin())); print(" max = %f ms", nanoToMs(snapshot.getMax())); print(" mean = %f ms", nanoToMs(snapshot.getMean())); print(" stddev = %f ms", nanoToMs(snapshot.getStdDev())); } else { heading = format("-- %s : [%s] --", name, metric.getClass().getCanonicalName()); print(heading); print("Unknown Metric type:{}", metric.getClass().getCanonicalName()); } print(Strings.repeat("-", heading.length())); } @SuppressWarnings("rawtypes") private TreeMultimap listMetrics(MetricsService metricsService, MetricFilter filter) { TreeMultimap metrics = TreeMultimap.create(Comparator.naturalOrder(), Ordering.arbitrary()); Map counters = metricsService.getCounters(filter); for (Entry entry : counters.entrySet()) { metrics.put(entry.getKey(), entry.getValue()); } Map gauges = metricsService.getGauges(filter); for (Entry entry : gauges.entrySet()) { metrics.put(entry.getKey(), entry.getValue()); } Map histograms = metricsService.getHistograms(filter); for (Entry entry : histograms.entrySet()) { metrics.put(entry.getKey(), entry.getValue()); } Map meters = metricsService.getMeters(filter); for (Entry entry : meters.entrySet()) { metrics.put(entry.getKey(), entry.getValue()); } Map timers = metricsService.getTimers(filter); for (Entry entry : timers.entrySet()) { metrics.put(entry.getKey(), entry.getValue()); } return metrics; } private double nanoToMs(double nano) { return nano / 1_000_000D; } }