/* * Copyright (c) 2014 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.bgpcep.pcep.topology.provider.session.stats; import static java.util.Objects.requireNonNull; import com.google.common.base.Stopwatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.LongAdder; import org.opendaylight.protocol.pcep.PCEPSessionState; import org.opendaylight.protocol.util.StatisticsUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.Tlvs3; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev200720.speaker.entity.id.tlv.SpeakerEntityId; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.initiated.rev200720.Pcinitiate; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev200720.Pcupd; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAugBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAug; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAugBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAug; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAugBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.PcepSessionState; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPref; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPrefBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.Messages; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.MessagesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilities; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilitiesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerPref; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTime; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTimeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Message; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.Open; import org.opendaylight.yangtools.yang.common.Uint16; import org.opendaylight.yangtools.yang.common.Uint32; public final class SessionStateImpl implements PcepSessionState { private final LongAdder lastReceivedRptMsgTimestamp = new LongAdder(); private final LongAdder receivedRptMsgCount = new LongAdder(); private final LongAdder sentUpdMsgCount = new LongAdder(); private final LongAdder sentInitMsgCount = new LongAdder(); private final Stopwatch sessionUpDuration; private final LongAdder minReplyTime = new LongAdder(); private final LongAdder maxReplyTime = new LongAdder(); private final LongAdder totalTime = new LongAdder(); private final LongAdder reqCount = new LongAdder(); private final TopologySessionStats topologySessionStats; private LocalPref localPref; private PeerPref peerPref; private PCEPSessionState pcepSessionState; public SessionStateImpl(final TopologySessionStats topologySessionStats) { this.sessionUpDuration = Stopwatch.createUnstarted(); this.topologySessionStats = requireNonNull(topologySessionStats); } public synchronized void init(final PCEPSessionState session) { requireNonNull(session); this.pcepSessionState = session; final Open localOpen = session.getLocalOpen(); if (localOpen.getTlvs() != null && localOpen.getTlvs().augmentation(Tlvs3.class) != null) { final SpeakerEntityId entityId = localOpen.getTlvs().augmentation(Tlvs3.class).getSpeakerEntityId(); if (entityId != null) { this.localPref = new LocalPrefBuilder(session.getLocalPref()) .addAugmentation(new PcepEntityIdStatsAugBuilder(entityId).build()).build(); } } else { this.localPref = session.getLocalPref(); } this.peerPref = session.getPeerPref(); this.sessionUpDuration.start(); } public synchronized void processRequestStats(final long duration) { if (this.minReplyTime.longValue() == 0) { this.minReplyTime.reset(); this.minReplyTime.add(duration); } else if (duration < this.minReplyTime.longValue()) { this.minReplyTime.reset(); this.minReplyTime.add(duration); } if (duration > this.maxReplyTime.longValue()) { this.maxReplyTime.reset(); this.maxReplyTime.add(duration); } this.totalTime.add(duration); this.reqCount.increment(); } public synchronized void updateLastReceivedRptMsg() { this.lastReceivedRptMsgTimestamp.reset(); this.lastReceivedRptMsgTimestamp.add(StatisticsUtil.getCurrentTimestampInSeconds()); this.receivedRptMsgCount.increment(); } public synchronized void updateStatefulSentMsg(final Message msg) { if (msg instanceof Pcinitiate) { this.sentInitMsgCount.increment(); } else if (msg instanceof Pcupd) { this.sentUpdMsgCount.increment(); } } @Override public synchronized String getSessionDuration() { return StatisticsUtil.formatElapsedTime(this.sessionUpDuration.elapsed(TimeUnit.SECONDS)); } @Override public synchronized Boolean getSynchronized() { return this.topologySessionStats.isSessionSynchronized(); } @Override public synchronized PeerCapabilities getPeerCapabilities() { return new PeerCapabilitiesBuilder() .addAugmentation(createStatefulCapabilities()) .build(); } private StatefulCapabilitiesStatsAug createStatefulCapabilities() { return new StatefulCapabilitiesStatsAugBuilder() .setActive(this.topologySessionStats.isLspUpdateCapability()) .setInstantiation(this.topologySessionStats.isInitiationCapability()) .setStateful(this.topologySessionStats.isStatefulCapability()) .build(); } @Override public Messages getMessages() { return new MessagesBuilder(this.pcepSessionState.getMessages()) .setReplyTime(setReplyTime()) .addAugmentation(createStatefulMessages()) .build(); } private StatefulMessagesStatsAug createStatefulMessages() { return new StatefulMessagesStatsAugBuilder() .setLastReceivedRptMsgTimestamp(Uint32.valueOf(this.lastReceivedRptMsgTimestamp.longValue())) .setReceivedRptMsgCount(Uint32.valueOf(this.receivedRptMsgCount.longValue())) .setSentInitMsgCount(Uint32.valueOf(this.sentInitMsgCount.longValue())) .setSentUpdMsgCount(Uint32.valueOf(this.sentUpdMsgCount.longValue())) .build(); } private synchronized ReplyTime setReplyTime() { long avg = 0; if (this.reqCount.longValue() != 0) { avg = Math.round((double) this.totalTime.longValue() / this.reqCount.longValue()); } return new ReplyTimeBuilder() .setAverageTime(Uint32.valueOf(avg)) .setMaxTime(Uint32.valueOf(this.maxReplyTime.longValue())) .setMinTime(Uint32.valueOf(this.minReplyTime.longValue())) .build(); } @Override public LocalPref getLocalPref() { return this.localPref; } @Override public PeerPref getPeerPref() { return this.peerPref; } @Override public Uint16 getDelegatedLspsCount() { return Uint16.valueOf(this.topologySessionStats.getDelegatedLspsCount()); } @Override public Class implementedInterface() { return PcepSessionState.class; } }