diff options
Diffstat (limited to 'framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java')
-rw-r--r-- | framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java b/framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java new file mode 100644 index 00000000..78a540c9 --- /dev/null +++ b/framework/src/onos/apps/metrics/src/main/java/org/onosproject/metrics/intent/IntentMetrics.java @@ -0,0 +1,234 @@ +/* + * Copyright 2014-2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onosproject.metrics.intent; + +import static org.slf4j.LoggerFactory.getLogger; + +import java.util.LinkedList; +import java.util.List; + +import com.google.common.collect.ImmutableList; +import org.apache.felix.scr.annotations.Activate; +import org.apache.felix.scr.annotations.Component; +import org.apache.felix.scr.annotations.Deactivate; +import org.apache.felix.scr.annotations.Reference; +import org.apache.felix.scr.annotations.ReferenceCardinality; +import org.apache.felix.scr.annotations.Service; +import org.onlab.metrics.EventMetric; +import org.onlab.metrics.MetricsService; +import org.onosproject.core.ApplicationId; +import org.onosproject.core.CoreService; +import org.onosproject.net.intent.IntentEvent; +import org.onosproject.net.intent.IntentListener; +import org.onosproject.net.intent.IntentService; +import org.slf4j.Logger; + +/** + * ONOS Intent Metrics Application that collects intent-related metrics. + */ +@Component(immediate = true) +@Service +public class IntentMetrics implements IntentMetricsService, + IntentListener { + private static final Logger log = getLogger(IntentMetrics.class); + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected CoreService coreService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected IntentService intentService; + + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) + protected MetricsService metricsService; + + private ApplicationId appId; + + private LinkedList<IntentEvent> lastEvents = new LinkedList<>(); + private static final int LAST_EVENTS_MAX_N = 100; + + // + // Metrics + // + private static final String COMPONENT_NAME = "Intent"; + private static final String FEATURE_SUBMITTED_NAME = "Submitted"; + private static final String FEATURE_INSTALLED_NAME = "Installed"; + private static final String FEATURE_FAILED_NAME = "Failed"; + private static final String FEATURE_WITHDRAW_REQUESTED_NAME = + "WithdrawRequested"; + private static final String FEATURE_WITHDRAWN_NAME = "Withdrawn"; + private static final String FEATURE_PURGED_NAME = "Purged"; + // + // Event metrics: + // - Intent Submitted API operation + // - Intent Installed operation completion + // - Intent Failed compilation or installation + // - Intent Withdraw Requested API operation + // - Intent Withdrawn operation completion + // - Intent Purged operation completion + // + private EventMetric intentSubmittedEventMetric; + private EventMetric intentInstalledEventMetric; + private EventMetric intentFailedEventMetric; + private EventMetric intentWithdrawRequestedEventMetric; + private EventMetric intentWithdrawnEventMetric; + private EventMetric intentPurgedEventMetric; + + @Activate + protected void activate() { + appId = coreService.registerApplication("org.onosproject.metrics"); + + clear(); + registerMetrics(); + intentService.addListener(this); + log.info("Started with Application ID {}", appId.id()); + } + + @Deactivate + public void deactivate() { + intentService.removeListener(this); + removeMetrics(); + clear(); + log.info("Stopped"); + } + + @Override + public List<IntentEvent> getEvents() { + synchronized (lastEvents) { + return ImmutableList.<IntentEvent>copyOf(lastEvents); + } + } + + @Override + public EventMetric intentSubmittedEventMetric() { + return intentSubmittedEventMetric; + } + + @Override + public EventMetric intentInstalledEventMetric() { + return intentInstalledEventMetric; + } + + @Override + public EventMetric intentFailedEventMetric() { + return intentFailedEventMetric; + } + + @Override + public EventMetric intentWithdrawRequestedEventMetric() { + return intentWithdrawRequestedEventMetric; + } + + @Override + public EventMetric intentWithdrawnEventMetric() { + return intentWithdrawnEventMetric; + } + + @Override + public EventMetric intentPurgedEventMetric() { + return intentPurgedEventMetric; + } + + @Override + public void event(IntentEvent event) { + synchronized (lastEvents) { + switch (event.type()) { + case INSTALL_REQ: + intentSubmittedEventMetric.eventReceived(); + break; + case INSTALLED: + intentInstalledEventMetric.eventReceived(); + break; + case FAILED: + intentFailedEventMetric.eventReceived(); + break; + case WITHDRAW_REQ: + intentWithdrawRequestedEventMetric.eventReceived(); + break; + case WITHDRAWN: + intentWithdrawnEventMetric.eventReceived(); + break; + case PURGED: + intentPurgedEventMetric.eventReceived(); + break; + default: + break; + } + + // + // Keep only the last N events, where N = LAST_EVENTS_MAX_N + // + while (lastEvents.size() >= LAST_EVENTS_MAX_N) { + lastEvents.remove(); + } + lastEvents.add(event); + } + + log.debug("Intent Event: time = {} type = {} event = {}", + event.time(), event.type(), event); + } + + /** + * Clears the internal state. + */ + private void clear() { + synchronized (lastEvents) { + lastEvents.clear(); + } + } + + /** + * Registers the metrics. + */ + private void registerMetrics() { + intentSubmittedEventMetric = + new EventMetric(metricsService, COMPONENT_NAME, + FEATURE_SUBMITTED_NAME); + intentInstalledEventMetric = + new EventMetric(metricsService, COMPONENT_NAME, + FEATURE_INSTALLED_NAME); + intentFailedEventMetric = + new EventMetric(metricsService, COMPONENT_NAME, + FEATURE_FAILED_NAME); + intentWithdrawRequestedEventMetric = + new EventMetric(metricsService, COMPONENT_NAME, + FEATURE_WITHDRAW_REQUESTED_NAME); + intentWithdrawnEventMetric = + new EventMetric(metricsService, COMPONENT_NAME, + FEATURE_WITHDRAWN_NAME); + intentPurgedEventMetric = + new EventMetric(metricsService, COMPONENT_NAME, + FEATURE_PURGED_NAME); + + intentSubmittedEventMetric.registerMetrics(); + intentInstalledEventMetric.registerMetrics(); + intentFailedEventMetric.registerMetrics(); + intentWithdrawRequestedEventMetric.registerMetrics(); + intentWithdrawnEventMetric.registerMetrics(); + intentPurgedEventMetric.registerMetrics(); + } + + /** + * Removes the metrics. + */ + private void removeMetrics() { + intentSubmittedEventMetric.removeMetrics(); + intentInstalledEventMetric.removeMetrics(); + intentFailedEventMetric.removeMetrics(); + intentWithdrawRequestedEventMetric.removeMetrics(); + intentWithdrawnEventMetric.removeMetrics(); + intentPurgedEventMetric.removeMetrics(); + } +} |