/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowplugin.impl.statistics.ofpspecific; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLongFieldUpdater; /** * Created by Martin Bobak <mbobak@cisco.com> on 5.6.2015. */ public class SessionStatistics { private static final Map<String, Map<ConnectionStatus, EventCounter>> SESSION_EVENTS = new HashMap<>(); public static void countEvent(final String sessionId, final ConnectionStatus connectionStatus) { Map<ConnectionStatus, EventCounter> sessionsConnectionEvents = getConnectionEvents(sessionId); EventCounter connectionEvent = getConnectionEvent(sessionsConnectionEvents, connectionStatus); connectionEvent.increment(); } private static EventCounter getConnectionEvent(final Map<ConnectionStatus, EventCounter> sessionsConnectionEvents, final ConnectionStatus connectionStatus) { EventCounter eventCounter = sessionsConnectionEvents.get(connectionStatus); if (null == eventCounter) { eventCounter = new EventCounter(); sessionsConnectionEvents.put(connectionStatus, eventCounter); } return eventCounter; } private static Map<ConnectionStatus, EventCounter> getConnectionEvents(final String sessionId) { Map<ConnectionStatus, EventCounter> sessionConnectionEvents = SESSION_EVENTS.get(sessionId); if (null == sessionConnectionEvents) { sessionConnectionEvents = new HashMap<>(); SESSION_EVENTS.put(sessionId, sessionConnectionEvents); } return sessionConnectionEvents; } public static List<String> provideStatistics() { List<String> dump = new ArrayList<>(); for (Map.Entry<String, Map<ConnectionStatus, EventCounter>> sessionEntries : SESSION_EVENTS.entrySet()) { Map<ConnectionStatus, EventCounter> sessionEvents = sessionEntries.getValue(); dump.add(String.format("SESSION : %s", sessionEntries.getKey())); for (Map.Entry<ConnectionStatus, EventCounter> sessionEvent : sessionEvents.entrySet()) { dump.add(String.format(" %s : %d", sessionEvent.getKey().toString(), sessionEvent.getValue().getCount())); } } return dump; } public enum ConnectionStatus { CONNECTION_CREATED, CONNECTION_DISCONNECTED_BY_DEVICE, CONNECTION_DISCONNECTED_BY_OFP; } private static final class EventCounter { private final AtomicLongFieldUpdater<EventCounter> updater = AtomicLongFieldUpdater.newUpdater(EventCounter.class, "count"); private volatile long count; public long getCount() { return count; } public void increment() { count = updater.incrementAndGet(this); } } public static void resetAllCounters() { SESSION_EVENTS.clear(); } }