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.atomic.AtomicLongFieldUpdater;
17 public class SessionStatistics {
19 private static final Map<String, Map<ConnectionStatus, EventCounter>> SESSION_EVENTS = new HashMap<>();
21 public static void countEvent(final String sessionId, final ConnectionStatus connectionStatus) {
22 Map<ConnectionStatus, EventCounter> sessionsConnectionEvents = getConnectionEvents(sessionId);
23 EventCounter connectionEvent = getConnectionEvent(sessionsConnectionEvents, connectionStatus);
24 connectionEvent.increment();
27 private static EventCounter getConnectionEvent(final Map<ConnectionStatus, EventCounter> sessionsConnectionEvents,
28 final ConnectionStatus connectionStatus) {
29 EventCounter eventCounter = sessionsConnectionEvents.get(connectionStatus);
30 if (null == eventCounter) {
31 eventCounter = new EventCounter();
32 sessionsConnectionEvents.put(connectionStatus, eventCounter);
37 private static Map<ConnectionStatus, EventCounter> getConnectionEvents(final String sessionId) {
38 Map<ConnectionStatus, EventCounter> sessionConnectionEvents = SESSION_EVENTS.get(sessionId);
39 if (null == sessionConnectionEvents) {
40 sessionConnectionEvents = new HashMap<>();
41 SESSION_EVENTS.put(sessionId, sessionConnectionEvents);
43 return sessionConnectionEvents;
47 public static List<String> provideStatistics() {
48 List<String> dump = new ArrayList<>();
49 for (Map.Entry<String, Map<ConnectionStatus, EventCounter>> sessionEntries : SESSION_EVENTS.entrySet()) {
50 Map<ConnectionStatus, EventCounter> sessionEvents = sessionEntries.getValue();
51 dump.add(String.format("SESSION : %s", sessionEntries.getKey()));
52 for (Map.Entry<ConnectionStatus, EventCounter> sessionEvent : sessionEvents.entrySet()) {
53 dump.add(String.format(" %s : %d", sessionEvent.getKey().toString(),
54 sessionEvent.getValue().getCount()));
61 public enum ConnectionStatus {
62 CONNECTION_CREATED, CONNECTION_DISCONNECTED_BY_DEVICE, CONNECTION_DISCONNECTED_BY_OFP
65 private static final class EventCounter {
66 private final AtomicLongFieldUpdater<EventCounter> updater =
67 AtomicLongFieldUpdater.newUpdater(EventCounter.class, "count");
68 private volatile long count;
70 public long getCount() {
74 public void increment() {
75 count = updater.incrementAndGet(this);
79 public static void resetAllCounters() {
80 SESSION_EVENTS.clear();