2 * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowplugin.impl.statistics.ofpspecific;
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.List;
15 import java.util.concurrent.TimeUnit;
16 import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.EventIdentifier;
19 * Created by Martin Bobak <mbobak@cisco.com> on 28.5.2015.
21 public final class EventsTimeCounter {
23 private static Map<String, Map<String, EventTimeCounter>> devicesEvents = new HashMap<>();
25 public static void markStart(final EventIdentifier eventIdentifier) {
26 Map<String, EventTimeCounter> deviceEvents = getOrCreateCountersForDevice(eventIdentifier.getDeviceId());
27 EventTimeCounter eventTimeCounter = getOrCreateEventOfType(eventIdentifier.getEventName(), deviceEvents);
28 eventTimeCounter.markStart();
31 public static void markEnd(final EventIdentifier eventIdentifier) {
32 Map<String, EventTimeCounter> deviceEvents = getOrCreateCountersForDevice(eventIdentifier.getDeviceId());
33 EventTimeCounter eventTimeCounter = getOrCreateEventOfType(eventIdentifier.getEventName(), deviceEvents);
34 eventTimeCounter.markEnd();
37 private static EventTimeCounter getOrCreateEventOfType(final String event, final Map<String, EventTimeCounter> deviceEvents) {
38 EventTimeCounter lookup = deviceEvents.get(event);
40 lookup = new EventTimeCounter();
41 deviceEvents.put(event, lookup);
46 private static Map<String, EventTimeCounter> getOrCreateCountersForDevice(final String deviceId) {
47 Map<String, EventTimeCounter> lookup = devicesEvents.get(deviceId);
49 lookup = new HashMap<String, EventTimeCounter>();
50 devicesEvents.put(deviceId, lookup);
56 public static List<String> provideTimes() {
57 List<String> dump = new ArrayList<>();
58 for (Map.Entry<String, Map<String, EventTimeCounter>> deviceEntry : devicesEvents.entrySet()) {
59 Map<String, EventTimeCounter> eventsMap = deviceEntry.getValue();
60 dump.add("================================================");
61 dump.add(String.format("DEVICE : %s", deviceEntry.getKey()));
62 for (Map.Entry<String, EventTimeCounter> eventEntry : eventsMap.entrySet()) {
63 final String eventName = eventEntry.getKey();
64 final EventTimeCounter eventTimeCounter = eventEntry.getValue();
65 dump.add(String.format("%s", eventName));
66 dump.add(String.format(" MIN TIME (ms): %d",
67 TimeUnit.MILLISECONDS.convert(eventTimeCounter.getMinimum(), TimeUnit.NANOSECONDS)));
68 dump.add(String.format(" MAX TIME (ms): %d",
69 TimeUnit.MILLISECONDS.convert(eventTimeCounter.getMaximum(), TimeUnit.NANOSECONDS)));
70 dump.add(String.format(" AVG TIME (ms): %d",
71 TimeUnit.MILLISECONDS.convert(eventTimeCounter.getAverage(), TimeUnit.NANOSECONDS)));
78 public static void resetAllCounters() {
79 devicesEvents = new HashMap<>();
83 private static final class EventTimeCounter {
85 private volatile long delta = 0;
86 private volatile long average = 0;
87 private volatile long minimum = 0;
88 private volatile long maximum = 0;
89 private volatile long summary = 0;
90 private volatile int counter = 0;
92 public synchronized void markStart() {
93 delta = System.nanoTime();
96 public synchronized void markEnd() {
101 delta = System.nanoTime() - delta;
103 if (delta < minimum || minimum == 0) {
106 if (delta > maximum) {
109 if (average > 0 && delta > (average * 1.8)) {
114 average = summary / counter;
117 public synchronized void resetCounters() {
127 public synchronized long getAverage() {
131 public synchronized long getMinimum() {
135 public synchronized long getMaximum() {