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;
18 public final class EventsTimeCounter {
20 private static final Map<String, Map<String, EventTimeCounter>> DEVICES_EVENTS = new HashMap<>();
22 private EventsTimeCounter() {
23 // Hiding implicit constructor
26 public static void markStart(final EventIdentifier eventIdentifier) {
27 Map<String, EventTimeCounter> deviceEvents = getOrCreateCountersForDevice(eventIdentifier.getDeviceId());
28 EventTimeCounter eventTimeCounter = getOrCreateEventOfType(eventIdentifier.getEventName(), deviceEvents);
29 eventTimeCounter.markStart();
32 public static void markEnd(final EventIdentifier eventIdentifier) {
33 Map<String, EventTimeCounter> deviceEvents = getOrCreateCountersForDevice(eventIdentifier.getDeviceId());
34 EventTimeCounter eventTimeCounter = getOrCreateEventOfType(eventIdentifier.getEventName(), deviceEvents);
35 eventTimeCounter.markEnd();
38 private static EventTimeCounter getOrCreateEventOfType(final String event,
39 final Map<String, EventTimeCounter> deviceEvents) {
40 return deviceEvents.computeIfAbsent(event, k -> new EventTimeCounter());
43 private static Map<String, EventTimeCounter> getOrCreateCountersForDevice(final String deviceId) {
44 return DEVICES_EVENTS.computeIfAbsent(deviceId, k -> new HashMap<>());
47 public static List<String> provideTimes() {
48 List<String> dump = new ArrayList<>();
49 for (Map.Entry<String, Map<String, EventTimeCounter>> deviceEntry : DEVICES_EVENTS.entrySet()) {
50 Map<String, EventTimeCounter> eventsMap = deviceEntry.getValue();
51 dump.add("================================================");
52 dump.add(String.format("DEVICE : %s", deviceEntry.getKey()));
53 for (Map.Entry<String, EventTimeCounter> eventEntry : eventsMap.entrySet()) {
54 final String eventName = eventEntry.getKey();
55 final EventTimeCounter eventTimeCounter = eventEntry.getValue();
56 dump.add(String.format("%s", eventName));
57 dump.add(String.format(" MIN TIME (ms): %d",
58 TimeUnit.MILLISECONDS.convert(eventTimeCounter.getMinimum(), TimeUnit.NANOSECONDS)));
59 dump.add(String.format(" MAX TIME (ms): %d",
60 TimeUnit.MILLISECONDS.convert(eventTimeCounter.getMaximum(), TimeUnit.NANOSECONDS)));
61 dump.add(String.format(" AVG TIME (ms): %d",
62 TimeUnit.MILLISECONDS.convert(eventTimeCounter.getAverage(), TimeUnit.NANOSECONDS)));
69 public static void resetAllCounters() {
70 DEVICES_EVENTS.clear();
74 private static final class EventTimeCounter {
76 private volatile long delta = 0;
77 private volatile long average = 0;
78 private volatile long minimum = 0;
79 private volatile long maximum = 0;
80 private volatile long summary = 0;
81 private volatile int counter = 0;
83 public synchronized void markStart() {
84 delta = System.nanoTime();
87 public synchronized void markEnd() {
92 delta = System.nanoTime() - delta;
94 if (delta < minimum || minimum == 0) {
97 if (delta > maximum) {
100 if (average > 0 && delta > (average * 1.8)) {
105 average = summary / counter;
108 public synchronized void resetCounters() {
118 public synchronized long getAverage() {
122 public synchronized long getMinimum() {
126 public synchronized long getMaximum() {