<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-binding-broker-impl</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.infrautils</groupId>
+ <artifactId>metrics-api</artifactId>
+ <version>${genius.infrautils.version}</version>
+ </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-binding-api</artifactId>
import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
import org.opendaylight.genius.fcapsapp.alarm.AlarmAgent;
+import org.opendaylight.genius.fcapsapp.performancecounter.FlowNodeConnectorInventoryTranslatorImpl;
import org.opendaylight.genius.fcapsapp.performancecounter.NodeUpdateCounter;
import org.opendaylight.genius.fcapsapp.performancecounter.PacketInCounterHandler;
import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
public final PacketInCounterHandler packetInCounterHandler;
private final EntityOwnershipUtils entityOwnershipUtils;
private final EntityOwnershipService entityOwnershipService;
+ private final FlowNodeConnectorInventoryTranslatorImpl nodeConnectorInventoryTranslator;
@Inject
public NodeEventListener(final AlarmAgent alarmAgent, final NodeUpdateCounter nodeUpdateCounter,
final PacketInCounterHandler packetInCounterHandler,
final EntityOwnershipUtils entityOwnershipUtils,
- final EntityOwnershipService entityOwnershipService) {
+ final EntityOwnershipService entityOwnershipService,
+ final FlowNodeConnectorInventoryTranslatorImpl nodeConnectorInventoryTranslator) {
this.alarmAgent = alarmAgent;
this.nodeUpdateCounter = nodeUpdateCounter;
this.packetInCounterHandler = packetInCounterHandler;
this.entityOwnershipUtils = entityOwnershipUtils;
this.entityOwnershipService = entityOwnershipService;
+ this.nodeConnectorInventoryTranslator = nodeConnectorInventoryTranslator;
}
@PostConstruct
if (nodeUpdateCounter.isDpnConnectedLocal(nodeId)) {
alarmAgent.raiseControlPathAlarm(nodeId, hostName);
nodeUpdateCounter.nodeRemovedNotification(nodeId, hostName);
+ nodeConnectorInventoryTranslator.nodeRemovedNotification(nodeId);
}
packetInCounterHandler.nodeRemovedNotification(nodeId);
break;
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
-import java.util.Collection;
-import java.util.HashMap;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.opendaylight.genius.fcapsapp.FcapsConstants;
import org.opendaylight.genius.fcapsapp.portinfo.PortNameMapping;
import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
+import org.opendaylight.infrautils.metrics.Counter;
+import org.opendaylight.infrautils.metrics.Labeled;
+import org.opendaylight.infrautils.metrics.MetricDescriptor;
+import org.opendaylight.infrautils.metrics.MetricProvider;
import org.opendaylight.openflowplugin.common.wait.SimpleTaskRetryLooper;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
private ListenerRegistration<FlowNodeConnectorInventoryTranslatorImpl> dataTreeChangeListenerRegistration;
private static final String SEPARATOR = ":";
- private final PMAgent agent;
-
+ private final MetricProvider metricProvider;
+ private final Labeled<Labeled<Labeled<Counter>>> packetInCounter;
private static final InstanceIdentifier<FlowCapableNodeConnector>
II_TO_FLOW_CAPABLE_NODE_CONNECTOR = InstanceIdentifier
.builder(Nodes.class).child(Node.class).child(NodeConnector.class)
private static Multimap<Long, String> dpnToPortMultiMap = Multimaps
.synchronizedListMultimap(ArrayListMultimap.<Long, String>create());
- private static HashMap<String, String> nodeConnectorCountermap = new HashMap<>();
@Inject
@SuppressWarnings("checkstyle:IllegalCatch")
- public FlowNodeConnectorInventoryTranslatorImpl(final DataBroker dataBroker, final PMAgent agent,
- final EntityOwnershipUtils entityOwnershipUtils) {
+ public FlowNodeConnectorInventoryTranslatorImpl(final DataBroker dataBroker,
+ final EntityOwnershipUtils entityOwnershipUtils,
+ MetricProvider metricProvider) {
this.dataBroker = Preconditions.checkNotNull(dataBroker, "DataBroker can not be null!");
this.entityOwnershipUtils = entityOwnershipUtils;
- this.agent = agent;
+ this.metricProvider = metricProvider;
+ packetInCounter = metricProvider.newCounter(MetricDescriptor.builder().anchor(this)
+ .project("genius").module("fcapsapplication")
+ .id("entitycounter").build(), "entitytype", "switchid","name");
final DataTreeIdentifier<FlowCapableNodeConnector> treeId = new DataTreeIdentifier<>(
LogicalDatastoreType.OPERATIONAL, getWildCardPath());
try {
@Override
public void remove(InstanceIdentifier<FlowCapableNodeConnector> identifier, FlowCapableNodeConnector del,
- InstanceIdentifier<FlowCapableNodeConnector> nodeConnIdent) {
+ InstanceIdentifier<FlowCapableNodeConnector> nodeConnIdent) {
+ Counter counter;
if (compareInstanceIdentifierTail(identifier, II_TO_FLOW_CAPABLE_NODE_CONNECTOR)) {
String nodeConnectorIdentifier = getNodeConnectorId(
String.valueOf(nodeConnIdent.firstKeyOf(NodeConnector.class).getId()));
if (dpnToPortMultiMap.containsKey(dataPathId)) {
LOG.debug("Node Connector {} removed", nodeConnectorIdentifier);
dpnToPortMultiMap.remove(dataPathId, nodeConnectorIdentifier);
- sendNodeConnectorUpdation(dataPathId);
+ counter = packetInCounter.label("OFSwitch").label(String.valueOf(dataPathId)).label("portsperswitch");
+ counter.decrement();
PortNameMapping.updatePortMap("openflow:" + dataPathId + ":" + del.getName(), nodeConnectorIdentifier,
"DELETE");
}
@Override
public void add(InstanceIdentifier<FlowCapableNodeConnector> identifier, FlowCapableNodeConnector add,
InstanceIdentifier<FlowCapableNodeConnector> nodeConnIdent) {
+ Counter counter;
if (compareInstanceIdentifierTail(identifier, II_TO_FLOW_CAPABLE_NODE_CONNECTOR)) {
String nodeConnectorIdentifier = getNodeConnectorId(
if (!dpnToPortMultiMap.containsEntry(dataPathId, nodeConnectorIdentifier)) {
LOG.debug("Node Connector {} added", nodeConnectorIdentifier);
dpnToPortMultiMap.put(dataPathId, nodeConnectorIdentifier);
- sendNodeConnectorUpdation(dataPathId);
+ counter = packetInCounter.label("OFSwitch")
+ .label(String.valueOf(dataPathId)).label("portsperswitch");
+ counter.increment();
PortNameMapping.updatePortMap("openflow:" + dataPathId + ":" + add.getName(),
nodeConnectorIdentifier, "ADD");
} else {
return Long.parseLong(dpId);
}
- private void sendNodeConnectorUpdation(Long dpnId) {
- Collection<String> portname = dpnToPortMultiMap.get(dpnId);
- String nodeListPortsCountStr = "dpnId_" + dpnId + "_NumberOfOFPorts";
- String counterkey = "NumberOfOFPorts:" + nodeListPortsCountStr;
-
- if (!portname.isEmpty()) {
- nodeConnectorCountermap.put(counterkey, "" + portname.size());
- } else {
- nodeConnectorCountermap.remove(counterkey);
- }
- LOG.debug("NumberOfOFPorts: {} portlistsize {}", nodeListPortsCountStr, portname.size());
- agent.connectToPMAgentForNOOfPorts(nodeConnectorCountermap);
+ public void nodeRemovedNotification(String node) {
+ Counter counter;
+ String[] switchId = node.split(":");
+ counter = packetInCounter.label("OFSwitch").label(String.valueOf(switchId[1])).label("portsperswitch");
+ counter.close();
}
}
*/
package org.opendaylight.genius.fcapsapp.performancecounter;
-import java.util.HashMap;
import java.util.HashSet;
-import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
+import org.opendaylight.infrautils.metrics.Counter;
+import org.opendaylight.infrautils.metrics.Labeled;
+import org.opendaylight.infrautils.metrics.MetricDescriptor;
+import org.opendaylight.infrautils.metrics.MetricProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private String nodeListEFSCountStr;
private static HashSet<String> dpnList = new HashSet<>();
public final PMAgent agent;
- private final Map<String, String> countersMap = new HashMap<>();
+ private final MetricProvider metricProvider;
+ private final Labeled<Labeled<Labeled<Counter>>> packetInCounter;
@Inject
- public NodeUpdateCounter(final PMAgent agent) {
+ public NodeUpdateCounter(final PMAgent agent, final MetricProvider metricProvider) {
this.agent = agent;
+ this.metricProvider = metricProvider;
+ packetInCounter = metricProvider.newCounter(MetricDescriptor.builder().anchor(this)
+ .project("genius").module("fcapsapplication")
+ .id("entitycounter").build(), "entitytype", "hostid","name");
}
public void nodeAddedNotification(String node, String hostName) {
+ Counter counter;
dpnList.add(node);
- sendNodeUpdation(dpnList.size(), hostName);
+ counter = packetInCounter.label("OFSwitch").label(hostName).label("switchespernode");
+ counter.increment();
}
public void nodeRemovedNotification(String node, String hostName) {
+ Counter counter;
dpnList.remove(node);
- sendNodeUpdation(dpnList.size(), hostName);
- }
-
- private void sendNodeUpdation(Integer count, String hostName) {
-
- if (hostName != null) {
- nodeListEFSCountStr = "Node_" + hostName + "_NumberOfEFS";
- LOG.debug("NumberOfEFS: {} dpnList.size {}", nodeListEFSCountStr, count);
-
- countersMap.put("NumberOfEFS:" + nodeListEFSCountStr, "" + count);
- agent.connectToPMAgent(countersMap);
- } else {
- LOG.error("Hostname is null upon NumberOfEFS counter");
- }
+ counter = packetInCounter.label("OFSwitch").label(hostName).label("switchespernode");
+ counter.close();
}
public boolean isDpnConnectedLocal(String node) {
*/
package org.opendaylight.genius.fcapsapp.performancecounter;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import javax.inject.Singleton;
+import org.opendaylight.infrautils.metrics.Counter;
+import org.opendaylight.infrautils.metrics.Labeled;
+import org.opendaylight.infrautils.metrics.MetricDescriptor;
+import org.opendaylight.infrautils.metrics.MetricProvider;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
import org.slf4j.Logger;
@Singleton
public class PacketInCounterHandler implements PacketProcessingListener {
private static final Logger LOG = LoggerFactory.getLogger(PacketInCounterHandler.class);
- private static final Long FIRST_VALUE = 0L;
private final PMAgent agent;
- private final ConcurrentMap<String, AtomicLong> ingressPacketMap = new ConcurrentHashMap<>();
+ private final MetricProvider metricProvider;
+ private final Labeled<Labeled<Labeled<Counter>>> packetInCounter;
@Inject
- public PacketInCounterHandler(final PMAgent agent) {
+ public PacketInCounterHandler(final PMAgent agent, MetricProvider metricProvider) {
this.agent = agent;
+ this.metricProvider = metricProvider;
+ packetInCounter = metricProvider.newCounter(MetricDescriptor.builder().anchor(this)
+ .project("genius").module("fcapsapplication").id("entitycounter")
+ .build(), "entitytype", "switchid","name");
}
@Override
public void onPacketReceived(PacketReceived notification) {
+ Counter counter;
LOG.debug("Ingress packet notification received");
if (notification.getIngress() == null) {
if (LOG.isWarnEnabled()) {
return;
}
String dpnId = getDpnId(notification.getIngress().getValue().toString());
- ingressPacketMap.computeIfAbsent(dpnId, (counter -> new AtomicLong(FIRST_VALUE))).incrementAndGet();
- connectToPMAgent();
- }
-
- private void connectToPMAgent() {
- Map<String, String> packetInMap = new HashMap<>();
- ingressPacketMap.forEach((dpnId, count) -> packetInMap
- .put("InjectedOFMessagesSent:" + "dpnId_" + dpnId + "_InjectedOFMessagesSent", String.valueOf(count)));
- agent.sendPacketInCounterUpdate(packetInMap);
+ counter = packetInCounter.label("OFSwitch").label(dpnId).label("packetin");
+ counter.increment();
}
/*
* Method to extract DpnId
*/
+
@Nonnull
private String getDpnId(@Nonnull String id) {
String[] nodeNo = id.split(":");
}
public void nodeRemovedNotification(String dpnId) {
+ Counter counter;
if (dpnId != null) {
dpnId = dpnId.split(":")[1];
LOG.debug("Dpnvalue Id {}", dpnId);
- if (ingressPacketMap.containsKey(dpnId)) {
- ingressPacketMap.remove(dpnId);
- connectToPMAgent();
- LOG.debug("Node {} Removed for PacketIn counter", dpnId);
- }
+ counter = packetInCounter.label("OFSwitch").label(dpnId).label("packetin");
+ counter.close();
} else {
LOG.error("DpnId is null upon nodeRemovedNotification");
}
<reference id="notificationService"
interface="org.opendaylight.controller.md.sal.binding.api.NotificationService"/>
+ <reference id="metricProvider"
+ interface="org.opendaylight.infrautils.metrics.MetricProvider"/>
+
<bean id="entityOwnershipUtils" class="org.opendaylight.genius.utils.clustering.EntityOwnershipUtils">
<argument ref="entityOwnershipService"/>
</bean>
<type>xml</type>
<classifier>features</classifier>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.infrautils</groupId>
+ <artifactId>odl-infrautils-metrics</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </dependency>
<!-- External libraries to wrap -->
<dependency>