2 * Copyright (c) 2014 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.bgpcep.pcep.topology.provider.session.stats;
11 import static java.util.Objects.requireNonNull;
13 import com.google.common.base.Stopwatch;
14 import java.util.concurrent.TimeUnit;
15 import java.util.concurrent.atomic.LongAdder;
16 import org.opendaylight.protocol.pcep.PCEPSessionState;
17 import org.opendaylight.protocol.util.StatisticsUtil;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.Tlvs3;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.pcep.sync.optimizations.rev181109.speaker.entity.id.tlv.SpeakerEntityId;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev181109.Pcinitiate;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev181109.Pcupd;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAug;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.PcepEntityIdStatsAugBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAug;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulCapabilitiesStatsAugBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAug;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stateful.stats.rev181109.StatefulMessagesStatsAugBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.PcepSessionState;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPref;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.LocalPrefBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.Messages;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.MessagesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilities;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerCapabilitiesBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.pcep.session.state.PeerPref;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTime;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.stats.rev171113.reply.time.grouping.ReplyTimeBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.Message;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev181109.open.object.Open;
40 import org.opendaylight.yangtools.yang.common.Uint16;
41 import org.opendaylight.yangtools.yang.common.Uint32;
43 public final class SessionStateImpl implements PcepSessionState {
44 private final LongAdder lastReceivedRptMsgTimestamp = new LongAdder();
45 private final LongAdder receivedRptMsgCount = new LongAdder();
46 private final LongAdder sentUpdMsgCount = new LongAdder();
47 private final LongAdder sentInitMsgCount = new LongAdder();
48 private final Stopwatch sessionUpDuration;
50 private final LongAdder minReplyTime = new LongAdder();
51 private final LongAdder maxReplyTime = new LongAdder();
52 private final LongAdder totalTime = new LongAdder();
53 private final LongAdder reqCount = new LongAdder();
54 private final TopologySessionStats topologySessionStats;
55 private LocalPref localPref;
56 private PeerPref peerPref;
57 private PCEPSessionState pcepSessionState;
59 public SessionStateImpl(final TopologySessionStats topologySessionStats) {
60 this.sessionUpDuration = Stopwatch.createUnstarted();
61 this.topologySessionStats = requireNonNull(topologySessionStats);
64 public synchronized void init(final PCEPSessionState session) {
65 requireNonNull(session);
66 this.pcepSessionState = session;
67 final Open localOpen = session.getLocalOpen();
69 if (localOpen.getTlvs() != null && localOpen.getTlvs().augmentation(Tlvs3.class) != null) {
70 final SpeakerEntityId entityId = localOpen.getTlvs().augmentation(Tlvs3.class).getSpeakerEntityId();
71 if (entityId != null) {
72 this.localPref = new LocalPrefBuilder(session.getLocalPref())
73 .addAugmentation(PcepEntityIdStatsAug.class,
74 new PcepEntityIdStatsAugBuilder(entityId).build()).build();
77 this.localPref = session.getLocalPref();
80 this.peerPref = session.getPeerPref();
81 this.sessionUpDuration.start();
84 public synchronized void processRequestStats(final long duration) {
85 if (this.minReplyTime.longValue() == 0) {
86 this.minReplyTime.reset();
87 this.minReplyTime.add(duration);
88 } else if (duration < this.minReplyTime.longValue()) {
89 this.minReplyTime.reset();
90 this.minReplyTime.add(duration);
92 if (duration > this.maxReplyTime.longValue()) {
93 this.maxReplyTime.reset();
94 this.maxReplyTime.add(duration);
96 this.totalTime.add(duration);
97 this.reqCount.increment();
100 public synchronized void updateLastReceivedRptMsg() {
101 this.lastReceivedRptMsgTimestamp.reset();
102 this.lastReceivedRptMsgTimestamp.add(StatisticsUtil.getCurrentTimestampInSeconds());
103 this.receivedRptMsgCount.increment();
106 public synchronized void updateStatefulSentMsg(final Message msg) {
107 if (msg instanceof Pcinitiate) {
108 this.sentInitMsgCount.increment();
109 } else if (msg instanceof Pcupd) {
110 this.sentUpdMsgCount.increment();
115 public synchronized String getSessionDuration() {
116 return StatisticsUtil.formatElapsedTime(this.sessionUpDuration.elapsed(TimeUnit.SECONDS));
120 public synchronized Boolean isSynchronized() {
121 return this.topologySessionStats.isSessionSynchronized();
125 public synchronized PeerCapabilities getPeerCapabilities() {
126 return new PeerCapabilitiesBuilder()
127 .addAugmentation(StatefulCapabilitiesStatsAug.class, createStatefulCapabilities())
131 private StatefulCapabilitiesStatsAug createStatefulCapabilities() {
132 return new StatefulCapabilitiesStatsAugBuilder()
133 .setActive(this.topologySessionStats.isLspUpdateCapability())
134 .setInstantiation(this.topologySessionStats.isInitiationCapability())
135 .setStateful(this.topologySessionStats.isStatefulCapability())
140 public Messages getMessages() {
141 return new MessagesBuilder(this.pcepSessionState.getMessages())
142 .setReplyTime(setReplyTime())
143 .addAugmentation(StatefulMessagesStatsAug.class, createStatefulMessages())
147 private StatefulMessagesStatsAug createStatefulMessages() {
148 return new StatefulMessagesStatsAugBuilder()
149 .setLastReceivedRptMsgTimestamp(Uint32.valueOf(this.lastReceivedRptMsgTimestamp.longValue()))
150 .setReceivedRptMsgCount(Uint32.valueOf(this.receivedRptMsgCount.longValue()))
151 .setSentInitMsgCount(Uint32.valueOf(this.sentInitMsgCount.longValue()))
152 .setSentUpdMsgCount(Uint32.valueOf(this.sentUpdMsgCount.longValue()))
156 private synchronized ReplyTime setReplyTime() {
158 if (this.reqCount.longValue() != 0) {
159 avg = Math.round((double) this.totalTime.longValue() / this.reqCount.longValue());
161 return new ReplyTimeBuilder()
162 .setAverageTime(Uint32.valueOf(avg))
163 .setMaxTime(Uint32.valueOf(this.maxReplyTime.longValue()))
164 .setMinTime(Uint32.valueOf(this.minReplyTime.longValue()))
169 public LocalPref getLocalPref() {
170 return this.localPref;
174 public PeerPref getPeerPref() {
175 return this.peerPref;
179 public Uint16 getDelegatedLspsCount() {
180 return Uint16.valueOf(this.topologySessionStats.getDelegatedLspsCount());
184 public Class<PcepSessionState> implementedInterface() {
185 return PcepSessionState.class;