blob: 814e1789793cff9d5e4ef2d86a29a818ee795c94 [file] [log] [blame]
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -07001package org.onlab.onos.metrics.topology;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
5import java.util.LinkedList;
6import java.util.List;
7
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -07008import com.google.common.collect.ImmutableList;
9import org.apache.felix.scr.annotations.Activate;
10import org.apache.felix.scr.annotations.Component;
11import org.apache.felix.scr.annotations.Deactivate;
12import org.apache.felix.scr.annotations.Reference;
13import org.apache.felix.scr.annotations.ReferenceCardinality;
14import org.apache.felix.scr.annotations.Service;
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070015import org.onlab.metrics.EventMetric;
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070016import org.onlab.metrics.MetricsService;
17import org.onlab.onos.event.Event;
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -070018import org.onlab.onos.net.device.DeviceEvent;
19import org.onlab.onos.net.device.DeviceListener;
20import org.onlab.onos.net.device.DeviceService;
21import org.onlab.onos.net.host.HostEvent;
22import org.onlab.onos.net.host.HostListener;
23import org.onlab.onos.net.host.HostService;
24import org.onlab.onos.net.link.LinkEvent;
25import org.onlab.onos.net.link.LinkListener;
26import org.onlab.onos.net.link.LinkService;
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070027import org.onlab.onos.net.topology.TopologyEvent;
28import org.onlab.onos.net.topology.TopologyListener;
29import org.onlab.onos.net.topology.TopologyService;
30import org.slf4j.Logger;
31
32/**
33 * ONOS Topology Metrics Application that collects topology-related metrics.
34 */
35@Component(immediate = true)
36@Service
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -070037public class TopologyMetrics implements TopologyMetricsService {
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070038 private static final Logger log = getLogger(TopologyMetrics.class);
39
40 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -070041 protected DeviceService deviceService;
42 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
43 protected HostService hostService;
44 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
45 protected LinkService linkService;
46 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070047 protected TopologyService topologyService;
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070048 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
49 protected MetricsService metricsService;
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -070050
51 private LinkedList<Event> lastEvents = new LinkedList<>();
52 private static final int LAST_EVENTS_MAX_N = 100;
53
54 private final DeviceListener deviceListener = new InnerDeviceListener();
55 private final HostListener hostListener = new InnerHostListener();
56 private final LinkListener linkListener = new InnerLinkListener();
57 private final TopologyListener topologyListener =
58 new InnerTopologyListener();
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070059
60 //
61 // Metrics
62 //
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070063 private static final String COMPONENT_NAME = "Topology";
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070064 private static final String FEATURE_DEVICE_NAME = "DeviceEvent";
65 private static final String FEATURE_HOST_NAME = "HostEvent";
66 private static final String FEATURE_LINK_NAME = "LinkEvent";
67 private static final String FEATURE_GRAPH_NAME = "GraphEvent";
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070068 //
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070069 // Event metrics:
70 // - Device events
71 // - Host events
72 // - Link events
73 // - Topology Graph events
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070074 //
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070075 private EventMetric topologyDeviceEventMetric;
76 private EventMetric topologyHostEventMetric;
77 private EventMetric topologyLinkEventMetric;
78 private EventMetric topologyGraphEventMetric;
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070079
80 @Activate
81 protected void activate() {
82 clear();
83 registerMetrics();
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -070084
85 // Register for all topology-related events
86 deviceService.addListener(deviceListener);
87 hostService.addListener(hostListener);
88 linkService.addListener(linkListener);
89 topologyService.addListener(topologyListener);
90
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -070091 log.info("ONOS Topology Metrics started.");
92 }
93
94 @Deactivate
95 public void deactivate() {
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -070096 // De-register from all topology-related events
97 deviceService.removeListener(deviceListener);
98 hostService.removeListener(hostListener);
99 linkService.removeListener(linkListener);
100 topologyService.removeListener(topologyListener);
101
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700102 removeMetrics();
103 clear();
104 log.info("ONOS Topology Metrics stopped.");
105 }
106
107 @Override
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700108 public List<Event> getEvents() {
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700109 synchronized (lastEvents) {
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700110 return ImmutableList.<Event>copyOf(lastEvents);
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700111 }
112 }
113
114 @Override
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700115 public EventMetric topologyDeviceEventMetric() {
116 return topologyDeviceEventMetric;
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700117 }
118
119 @Override
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700120 public EventMetric topologyHostEventMetric() {
121 return topologyHostEventMetric;
122 }
123
124 @Override
125 public EventMetric topologyLinkEventMetric() {
126 return topologyLinkEventMetric;
127 }
128
129 @Override
130 public EventMetric topologyGraphEventMetric() {
131 return topologyGraphEventMetric;
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700132 }
133
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700134 /**
135 * Records an event.
136 *
137 * @param event the event to record
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700138 * @param eventMetric the Event Metric to use
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700139 */
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700140 private void recordEvent(Event event, EventMetric eventMetric) {
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700141 synchronized (lastEvents) {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700142 eventMetric.eventReceived();
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700143
144 //
145 // Keep only the last N events, where N = LAST_EVENTS_MAX_N
146 //
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700147 while (lastEvents.size() >= LAST_EVENTS_MAX_N) {
148 lastEvents.remove();
149 }
150 lastEvents.add(event);
151 }
152 }
153
154 /**
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700155 * Inner Device Event Listener class.
156 */
157 private class InnerDeviceListener implements DeviceListener {
158 @Override
159 public void event(DeviceEvent event) {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700160 recordEvent(event, topologyDeviceEventMetric);
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700161 log.debug("Device Event: time = {} type = {} event = {}",
162 event.time(), event.type(), event);
163 }
164 }
165
166 /**
167 * Inner Host Event Listener class.
168 */
169 private class InnerHostListener implements HostListener {
170 @Override
171 public void event(HostEvent event) {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700172 recordEvent(event, topologyHostEventMetric);
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700173 log.debug("Host Event: time = {} type = {} event = {}",
174 event.time(), event.type(), event);
175 }
176 }
177
178 /**
179 * Inner Link Event Listener class.
180 */
181 private class InnerLinkListener implements LinkListener {
182 @Override
183 public void event(LinkEvent event) {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700184 recordEvent(event, topologyLinkEventMetric);
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700185 log.debug("Link Event: time = {} type = {} event = {}",
186 event.time(), event.type(), event);
187 }
188 }
189
190 /**
191 * Inner Topology Event Listener class.
192 */
193 private class InnerTopologyListener implements TopologyListener {
194 @Override
195 public void event(TopologyEvent event) {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700196 recordEvent(event, topologyGraphEventMetric);
Pavlin Radoslavov5ba8b282014-10-23 01:03:10 -0700197 log.debug("Topology Event: time = {} type = {} event = {}",
198 event.time(), event.type(), event);
199 for (Event reason : event.reasons()) {
200 log.debug("Topology Event Reason: time = {} type = {} event = {}",
201 reason.time(), reason.type(), reason);
202 }
203 }
204 }
205
206 /**
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700207 * Clears the internal state.
208 */
209 private void clear() {
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700210 synchronized (lastEvents) {
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700211 lastEvents.clear();
212 }
213 }
214
215 /**
216 * Registers the metrics.
217 */
218 private void registerMetrics() {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700219 topologyDeviceEventMetric =
220 new EventMetric(metricsService, COMPONENT_NAME,
221 FEATURE_DEVICE_NAME);
222 topologyHostEventMetric =
223 new EventMetric(metricsService, COMPONENT_NAME,
224 FEATURE_HOST_NAME);
225 topologyLinkEventMetric =
226 new EventMetric(metricsService, COMPONENT_NAME,
227 FEATURE_LINK_NAME);
228 topologyGraphEventMetric =
229 new EventMetric(metricsService, COMPONENT_NAME,
230 FEATURE_GRAPH_NAME);
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700231
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700232 topologyDeviceEventMetric.registerMetrics();
233 topologyHostEventMetric.registerMetrics();
234 topologyLinkEventMetric.registerMetrics();
235 topologyGraphEventMetric.registerMetrics();
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700236 }
237
238 /**
239 * Removes the metrics.
240 */
241 private void removeMetrics() {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700242 topologyDeviceEventMetric.removeMetrics();
243 topologyHostEventMetric.removeMetrics();
244 topologyLinkEventMetric.removeMetrics();
245 topologyGraphEventMetric.removeMetrics();
Pavlin Radoslavov64d9e472014-10-21 22:01:08 -0700246 }
247}