2 * Copyright (c) 2013 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.openflow.md.queue;
11 import java.util.ArrayList;
12 import java.util.HashMap;
13 import java.util.List;
15 import java.util.Map.Entry;
16 import java.util.concurrent.ConcurrentHashMap;
17 import java.util.concurrent.atomic.AtomicLong;
19 import org.opendaylight.yangtools.yang.binding.DataContainer;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
24 * message counter (by type)
26 public class MessageSpyCounterImpl implements MessageObservatory<DataContainer> {
28 private static final Logger LOG = LoggerFactory
29 .getLogger(MessageSpyCounterImpl.class);
31 private Map<STATISTIC_GROUP, Map<Class<? extends DataContainer>, AtomicLong[]>> inputStats = new ConcurrentHashMap<>();
34 public void spyIn(DataContainer message) {
35 AtomicLong[] counters = getCounters(message, STATISTIC_GROUP.FROM_SWITCH_TRANSLATE_IN_SUCCESS);
36 counters[0].incrementAndGet();
41 * @param statGroup TODO
44 private AtomicLong[] getCounters(DataContainer message, STATISTIC_GROUP statGroup) {
45 Class<? extends DataContainer> msgType = message.getImplementedInterface();
46 Map<Class<? extends DataContainer>, AtomicLong[]> groupData = getOrCreateGroupData(statGroup);
47 AtomicLong[] counters = getOrCreateCountersPair(msgType, groupData);
51 private static AtomicLong[] getOrCreateCountersPair(Class<? extends DataContainer> msgType, Map<Class<? extends DataContainer>, AtomicLong[]> groupData) {
52 AtomicLong[] counters = groupData.get(msgType);
53 synchronized(groupData) {
54 if (counters == null) {
55 counters = new AtomicLong[] {new AtomicLong(), new AtomicLong()};
56 groupData.put(msgType, counters);
62 private Map<Class<? extends DataContainer>, AtomicLong[]> getOrCreateGroupData(STATISTIC_GROUP statGroup) {
63 Map<Class<? extends DataContainer>, AtomicLong[]> groupData = null;
64 synchronized(inputStats) {
65 groupData = inputStats.get(statGroup);
66 if (groupData == null) {
67 groupData = new HashMap<>();
68 inputStats.put(statGroup, groupData);
75 public void spyOut(DataContainer message) {
76 AtomicLong[] counters = getCounters(message, STATISTIC_GROUP.FROM_SWITCH_TRANSLATE_OUT_SUCCESS);
77 counters[0].incrementAndGet();
82 // log current counters and cleans it
83 if (LOG.isDebugEnabled()) {
84 for (String counterItem : dumpMessageCounts()) {
85 LOG.debug(counterItem);
91 public List<String> dumpMessageCounts() {
92 List<String> dump = new ArrayList<>();
93 for (STATISTIC_GROUP statGroup : STATISTIC_GROUP.values()) {
94 Map<Class<? extends DataContainer>, AtomicLong[]> groupData = inputStats.get(statGroup);
95 if (groupData != null) {
96 for (Entry<Class<? extends DataContainer>, AtomicLong[]> statEntry : groupData.entrySet()) {
97 long amountPerInterval = statEntry.getValue()[0].getAndSet(0);
98 long cumulativeAmount = statEntry.getValue()[1].addAndGet(amountPerInterval);
99 dump.add(String.format("%s: MSG[%s] -> +%d | %d",
101 statEntry.getKey().getSimpleName(), amountPerInterval, cumulativeAmount));
105 dump.add(String.format("%s: no activity detected", statGroup));
112 public void spyMessage(DataContainer message, STATISTIC_GROUP statGroup) {
113 AtomicLong[] counters = getCounters(message, statGroup);
114 counters[0].incrementAndGet();