blob: cfc88b874cdd8c1092750e18403ac7cf4cd6c59b [file] [log] [blame]
Pavlin Radoslavov295b2962014-10-23 01:12:41 -07001package org.onlab.onos.metrics.intent;
2
3import static org.slf4j.LoggerFactory.getLogger;
4
5import java.util.LinkedList;
6import java.util.List;
7
Pavlin Radoslavov295b2962014-10-23 01:12:41 -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 Radoslavov295b2962014-10-23 01:12:41 -070016import org.onlab.metrics.MetricsService;
17import org.onlab.onos.net.intent.IntentEvent;
18import org.onlab.onos.net.intent.IntentListener;
19import org.onlab.onos.net.intent.IntentService;
20import org.slf4j.Logger;
21
22/**
23 * ONOS Intent Metrics Application that collects intent-related metrics.
24 */
25@Component(immediate = true)
26@Service
27public class IntentMetrics implements IntentMetricsService,
28 IntentListener {
29 private static final Logger log = getLogger(IntentMetrics.class);
30
31 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
32 protected IntentService intentService;
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070033 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
34 protected MetricsService metricsService;
35
Pavlin Radoslavov295b2962014-10-23 01:12:41 -070036 private LinkedList<IntentEvent> lastEvents = new LinkedList<>();
37 private static final int LAST_EVENTS_MAX_N = 100;
38
39 //
40 // Metrics
41 //
Pavlin Radoslavov295b2962014-10-23 01:12:41 -070042 private static final String COMPONENT_NAME = "Intent";
43 private static final String FEATURE_SUBMITTED_NAME = "Submitted";
44 private static final String FEATURE_INSTALLED_NAME = "Installed";
45 private static final String FEATURE_WITHDRAW_REQUESTED_NAME =
46 "WithdrawRequested";
47 private static final String FEATURE_WITHDRAWN_NAME = "Withdrawn";
Pavlin Radoslavov295b2962014-10-23 01:12:41 -070048 //
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070049 // Event metrics:
50 // - Intent Submitted API operation
51 // - Intent Installed operation completion
52 // - Intent Withdraw Requested API operation
53 // - Intent Withdrawn operation completion
Pavlin Radoslavov295b2962014-10-23 01:12:41 -070054 //
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070055 private EventMetric intentSubmittedEventMetric;
56 private EventMetric intentInstalledEventMetric;
57 private EventMetric intentWithdrawRequestedEventMetric;
58 private EventMetric intentWithdrawnEventMetric;
Pavlin Radoslavov295b2962014-10-23 01:12:41 -070059
60 @Activate
61 protected void activate() {
62 clear();
63 registerMetrics();
64 intentService.addListener(this);
65 log.info("ONOS Intent Metrics started.");
66 }
67
68 @Deactivate
69 public void deactivate() {
70 intentService.removeListener(this);
71 removeMetrics();
72 clear();
73 log.info("ONOS Intent Metrics stopped.");
74 }
75
76 @Override
77 public List<IntentEvent> getEvents() {
78 synchronized (lastEvents) {
79 return ImmutableList.<IntentEvent>copyOf(lastEvents);
80 }
81 }
82
83 @Override
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070084 public EventMetric intentSubmittedEventMetric() {
85 return intentSubmittedEventMetric;
Pavlin Radoslavov295b2962014-10-23 01:12:41 -070086 }
87
88 @Override
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070089 public EventMetric intentInstalledEventMetric() {
90 return intentInstalledEventMetric;
Pavlin Radoslavov295b2962014-10-23 01:12:41 -070091 }
92
93 @Override
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070094 public EventMetric intentWithdrawRequestedEventMetric() {
95 return intentWithdrawRequestedEventMetric;
Pavlin Radoslavov295b2962014-10-23 01:12:41 -070096 }
97
98 @Override
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -070099 public EventMetric intentWithdrawnEventMetric() {
100 return intentWithdrawnEventMetric;
Pavlin Radoslavov295b2962014-10-23 01:12:41 -0700101 }
102
103 @Override
104 public void event(IntentEvent event) {
105 synchronized (lastEvents) {
106 //
107 // TODO: The processing below is incomplete: we don't have
108 // an event equivalent of "Withdraw Requested"
109 //
110 switch (event.type()) {
111 case SUBMITTED:
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700112 intentSubmittedEventMetric.eventReceived();
Pavlin Radoslavov295b2962014-10-23 01:12:41 -0700113 break;
114 case INSTALLED:
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700115 intentInstalledEventMetric.eventReceived();
Pavlin Radoslavov295b2962014-10-23 01:12:41 -0700116 break;
117 case FAILED:
118 // TODO: Just ignore?
119 break;
120 /*
121 case WITHDRAW_REQUESTED:
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700122 intentWithdrawRequestedEventMetric.eventReceived();
Pavlin Radoslavov295b2962014-10-23 01:12:41 -0700123 break;
124 */
125 case WITHDRAWN:
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700126 intentWithdrawnEventMetric.eventReceived();
Pavlin Radoslavov295b2962014-10-23 01:12:41 -0700127 break;
128 default:
129 break;
130 }
131
132 //
133 // Keep only the last N events, where N = LAST_EVENTS_MAX_N
134 //
135 while (lastEvents.size() >= LAST_EVENTS_MAX_N) {
136 lastEvents.remove();
137 }
138 lastEvents.add(event);
139 }
140
141 log.debug("Intent Event: time = {} type = {} event = {}",
142 event.time(), event.type(), event);
143 }
144
145 /**
146 * Clears the internal state.
147 */
148 private void clear() {
149 synchronized (lastEvents) {
Pavlin Radoslavov295b2962014-10-23 01:12:41 -0700150 lastEvents.clear();
151 }
152 }
153
154 /**
155 * Registers the metrics.
156 */
157 private void registerMetrics() {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700158 intentSubmittedEventMetric =
159 new EventMetric(metricsService, COMPONENT_NAME,
160 FEATURE_SUBMITTED_NAME);
161 intentInstalledEventMetric =
162 new EventMetric(metricsService, COMPONENT_NAME,
163 FEATURE_INSTALLED_NAME);
164 intentWithdrawRequestedEventMetric =
165 new EventMetric(metricsService, COMPONENT_NAME,
166 FEATURE_WITHDRAW_REQUESTED_NAME);
167 intentWithdrawnEventMetric =
168 new EventMetric(metricsService, COMPONENT_NAME,
169 FEATURE_WITHDRAWN_NAME);
170
171 intentSubmittedEventMetric.registerMetrics();
172 intentInstalledEventMetric.registerMetrics();
173 intentWithdrawRequestedEventMetric.registerMetrics();
174 intentWithdrawnEventMetric.registerMetrics();
Pavlin Radoslavov295b2962014-10-23 01:12:41 -0700175 }
176
177 /**
178 * Removes the metrics.
179 */
180 private void removeMetrics() {
Pavlin Radoslavovccc2e332014-10-23 13:46:28 -0700181 intentSubmittedEventMetric.removeMetrics();
182 intentInstalledEventMetric.removeMetrics();
183 intentWithdrawRequestedEventMetric.removeMetrics();
184 intentWithdrawnEventMetric.removeMetrics();
Pavlin Radoslavov295b2962014-10-23 01:12:41 -0700185 }
186}