aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java')
-rw-r--r--framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java144
1 files changed, 144 insertions, 0 deletions
diff --git a/framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java b/framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java
new file mode 100644
index 00000000..0fbbc053
--- /dev/null
+++ b/framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/topology/cli/TopologyEventsMetricsCommand.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2014-2015 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.metrics.topology.cli;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import com.codahale.metrics.Gauge;
+import com.codahale.metrics.Meter;
+import com.codahale.metrics.json.MetricsModule;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.karaf.shell.commands.Command;
+import org.onlab.metrics.EventMetric;
+import org.onosproject.cli.AbstractShellCommand;
+import org.onosproject.metrics.topology.TopologyMetricsService;
+
+/**
+ * Command to show the topology events metrics.
+ */
+@Command(scope = "onos", name = "topology-events-metrics",
+ description = "Lists topology events metrics")
+public class TopologyEventsMetricsCommand extends AbstractShellCommand {
+
+ private static final String FORMAT_GAUGE =
+ "Topology %s Event Timestamp (ms from epoch)=%d";
+ private static final String FORMAT_METER =
+ "Topology %s Events count=%d rate(events/sec) mean=%f m1=%f m5=%f m15=%f";
+
+ @Override
+ protected void execute() {
+ TopologyMetricsService service = get(TopologyMetricsService.class);
+
+ if (outputJson()) {
+ ObjectMapper mapper = new ObjectMapper()
+ .registerModule(new MetricsModule(TimeUnit.SECONDS,
+ TimeUnit.MILLISECONDS,
+ false));
+ ObjectNode result = mapper.createObjectNode();
+ result = json(mapper, result, "topologyDeviceEvent",
+ service.topologyDeviceEventMetric());
+ result = json(mapper, result, "topologyHostEvent",
+ service.topologyHostEventMetric());
+ result = json(mapper, result, "topologyLinkEvent",
+ service.topologyLinkEventMetric());
+ result = json(mapper, result, "topologyGraphEvent",
+ service.topologyGraphEventMetric());
+ result = json(mapper, result, "topologyGraphReasonsEvent",
+ service.topologyGraphReasonsEventMetric());
+ print("%s", result);
+ } else {
+ printEventMetric("Device", service.topologyDeviceEventMetric());
+ printEventMetric("Host", service.topologyHostEventMetric());
+ printEventMetric("Link", service.topologyLinkEventMetric());
+ printEventMetric("Graph", service.topologyGraphEventMetric());
+ printEventMetric("Graph Reasons",
+ service.topologyGraphReasonsEventMetric());
+ }
+ }
+
+ /**
+ * Produces JSON node for an Event Metric.
+ *
+ * @param mapper the JSON object mapper to use
+ * @param objectNode the JSON object node to use
+ * @param propertyPrefix the property prefix to use
+ * @param eventMetric the Event Metric with the data
+ * @return JSON object node for the Event Metric
+ */
+ private ObjectNode json(ObjectMapper mapper, ObjectNode objectNode,
+ String propertyPrefix, EventMetric eventMetric) {
+ String gaugeName = propertyPrefix + "Timestamp";
+ String meterName = propertyPrefix + "Rate";
+ Gauge<Long> gauge = eventMetric.lastEventTimestampGauge();
+ Meter meter = eventMetric.eventRateMeter();
+
+ objectNode.set(gaugeName, json(mapper, gauge));
+ objectNode.set(meterName, json(mapper, meter));
+ return objectNode;
+ }
+
+ /**
+ * Produces JSON node for an Object.
+ *
+ * @param mapper the JSON object mapper to use
+ * @param object the Object with the data
+ * @return JSON node for the Object
+ */
+ private JsonNode json(ObjectMapper mapper, Object object) {
+ //
+ // NOTE: The API for custom serializers is incomplete,
+ // hence we have to parse the JSON string to create JsonNode.
+ //
+ try {
+ final String objectJson = mapper.writeValueAsString(object);
+ JsonNode jsonNode = mapper.readTree(objectJson);
+ return jsonNode;
+ } catch (JsonProcessingException e) {
+ log.error("Error writing value as JSON string", e);
+ } catch (IOException e) {
+ log.error("Error writing value as JSON string", e);
+ }
+ return null;
+ }
+
+ /**
+ * Prints an Event Metric.
+ *
+ * @param operationStr the string with the intent operation to print
+ * @param eventMetric the Event Metric to print
+ */
+ private void printEventMetric(String operationStr,
+ EventMetric eventMetric) {
+ Gauge<Long> gauge = eventMetric.lastEventTimestampGauge();
+ Meter meter = eventMetric.eventRateMeter();
+ TimeUnit rateUnit = TimeUnit.SECONDS;
+ double rateFactor = rateUnit.toSeconds(1);
+
+ // Print the Gauge
+ print(FORMAT_GAUGE, operationStr, gauge.getValue());
+
+ // Print the Meter
+ print(FORMAT_METER, operationStr, meter.getCount(),
+ meter.getMeanRate() * rateFactor,
+ meter.getOneMinuteRate() * rateFactor,
+ meter.getFiveMinuteRate() * rateFactor,
+ meter.getFifteenMinuteRate() * rateFactor);
+ }
+}