Jian Li
Committed by Gerrit Code Review

[ONOS-3535] Implement control metrics aggregation logic

Change-Id: I9953146851d5f3fdf7bcee9561fa86ddb7c7b3fe
......@@ -33,7 +33,48 @@
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-api</artifactId>
<version>1.5.0-SNAPSHOT</version>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onlab-junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-api</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onlab-misc</artifactId>
<version>${project.version}</version>
<classifier>tests</classifier>
<scope>test</scope>
</dependency>
</dependencies>
</project>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-scr-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.onosproject</groupId>
<artifactId>onos-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
......
......@@ -22,10 +22,10 @@ import java.util.concurrent.TimeUnit;
/**
* Data repository for control plane load information.
*/
public interface ControlPlaneLoad extends Load {
public interface ControlLoad extends Load {
/**
* Obtain the average of the specified time duration.
* Obtains the average of the specified time duration.
*
* @param duration time duration
* @param unit time unit
......@@ -34,7 +34,7 @@ public interface ControlPlaneLoad extends Load {
long average(int duration, TimeUnit unit);
/**
* Obtain the average of all time duration.
* Obtains the average of all time duration.
*
* @return average control plane metric value
*/
......
......@@ -18,24 +18,21 @@ package org.onosproject.cpman;
/**
* Include various control plane metrics.
*/
public class ControlPlaneMetric {
public class ControlMetric {
private ControlMetricType metricType;
private long metricValue;
private final ControlMetricType metricType;
private final MetricValue metricValue;
ControlMetricType metricType() {
return metricType;
}
void setMetricType(ControlMetricType metricType) {
ControlMetric(ControlMetricType metricType, MetricValue metricValue) {
this.metricType = metricType;
this.metricValue = metricValue;
}
long metricValue() {
return metricValue;
ControlMetricType metricType() {
return metricType;
}
void setMetricValue(long metricValue) {
this.metricValue = metricValue;
MetricValue metricValue() {
return metricValue;
}
}
......
......@@ -20,15 +20,27 @@ package org.onosproject.cpman;
*/
public enum ControlMetricType {
/** Racket Rate of Control Message. */
PacketRate,
/** Mapped to PACKET-IN message of OpenFlow. */
INBOUND_PACKET,
/** Byte Rate of Control Message. */
ByteRate,
/** Mapped to PACKET-OUT message of OpenFlow. */
OUTBOUND_PACKET,
/** Mapped to FLOW-MOD message of OpenFlow. */
FLOW_MOD_PACKET,
/** Mapped to FLOW-REMOVED message of OpenFlow. */
FLOW_REMOVED_PACKET,
/** Mapped to STATS-REQUEST message of OpenFlow. */
REQUEST_PACKET,
/** Mapped to STATS-REPLY message of OpenFlow. */
REPLY_PACKET,
/** Cpu Utilization. */
CpuInfo,
CPU_INFO,
/** Memory Utilization. */
MemoryInfo
MEMORY_INFO
}
......
/*
* Copyright 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.cpman;
import org.onlab.metrics.MetricsService;
import org.onosproject.net.DeviceId;
import org.onosproject.net.device.DeviceService;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Singleton class to provide various control plane metrics to other components.
*/
public final class ControlMetricsFactory {
private static volatile ControlMetricsFactory uniqueInstance;
private MetricsService metricsService;
private boolean enableMonitor = false;
// define a set of MetricsAggregators
private MetricsAggregator cpuInfoMetric;
private MetricsAggregator memoryInfoMetric;
private Map<DeviceId, MetricsAggregator> inboundPacketMetrics;
private Map<DeviceId, MetricsAggregator> outboundPacketMetrics;
private Map<DeviceId, MetricsAggregator> flowmodPacketMetrics;
private Map<DeviceId, MetricsAggregator> flowrmvPacketMetrics;
private Map<DeviceId, MetricsAggregator> requestPacketMetrics;
private Map<DeviceId, MetricsAggregator> replyPacketMetrics;
private Set<DeviceId> deviceIds = new HashSet<>();
private ControlMetricsFactory(MetricsService metricsService, DeviceService deviceService) {
this.metricsService = metricsService;
registerMetrics();
deviceService.getDevices().forEach(d->deviceIds.add(d.id()));
addAllDeviceMetrics(deviceIds);
}
public static ControlMetricsFactory getInstance(MetricsService metricsService,
DeviceService deviceService) {
if (uniqueInstance == null) {
synchronized (ControlMetricsFactory.class) {
if (uniqueInstance == null) {
uniqueInstance = new ControlMetricsFactory(metricsService, deviceService);
}
}
}
return uniqueInstance;
}
/**
* Adds control metrics of a new device.
*
* @param deviceId {@link org.onosproject.net.DeviceId}
*/
public void addMetricsByDeviceId(DeviceId deviceId) {
MetricsAggregator inbound = new MetricsAggregator(metricsService,
ControlMetricType.INBOUND_PACKET, Optional.of(deviceId));
MetricsAggregator outbound = new MetricsAggregator(metricsService,
ControlMetricType.OUTBOUND_PACKET, Optional.of(deviceId));
MetricsAggregator flowmod = new MetricsAggregator(metricsService,
ControlMetricType.FLOW_MOD_PACKET, Optional.of(deviceId));
MetricsAggregator flowrmv = new MetricsAggregator(metricsService,
ControlMetricType.FLOW_REMOVED_PACKET, Optional.of(deviceId));
MetricsAggregator request = new MetricsAggregator(metricsService,
ControlMetricType.REQUEST_PACKET, Optional.of(deviceId));
MetricsAggregator reply = new MetricsAggregator(metricsService,
ControlMetricType.REPLY_PACKET, Optional.of(deviceId));
inboundPacketMetrics.putIfAbsent(deviceId, inbound);
outboundPacketMetrics.putIfAbsent(deviceId, outbound);
flowmodPacketMetrics.putIfAbsent(deviceId, flowmod);
flowrmvPacketMetrics.putIfAbsent(deviceId, flowrmv);
requestPacketMetrics.putIfAbsent(deviceId, request);
replyPacketMetrics.putIfAbsent(deviceId, reply);
deviceIds.add(deviceId);
}
/**
* Removes control metrics of an existing device.
*
* @param deviceId {@link org.onosproject.net.DeviceId}
*/
public void removeMetricsByDeviceId(DeviceId deviceId) {
inboundPacketMetrics.remove(deviceId);
outboundPacketMetrics.remove(deviceId);
flowmodPacketMetrics.remove(deviceId);
flowrmvPacketMetrics.remove(deviceId);
requestPacketMetrics.remove(deviceId);
replyPacketMetrics.remove(deviceId);
deviceIds.remove(deviceId);
}
public Set<DeviceId> getDeviceIds() {
return this.deviceIds;
}
/**
* Adds control metrics for all devices.
*
* @param deviceIds a set of deviceIds
*/
public void addAllDeviceMetrics(Set<DeviceId> deviceIds) {
deviceIds.forEach(v -> addMetricsByDeviceId(v));
}
/**
* Returns monitoring status.
*
* @return monitoring status
*/
public boolean isMonitor() {
return this.enableMonitor;
}
/**
* Enable control plane monitoring.
*/
protected void startMonitor() {
this.enableMonitor = true;
}
/**
* Disable control plane monitoring.
*/
protected void stopMonitor() {
this.enableMonitor = false;
}
/**
* Registers new control metrics.
*/
protected void registerMetrics() {
cpuInfoMetric = new MetricsAggregator(metricsService,
ControlMetricType.CPU_INFO, Optional.ofNullable(null));
memoryInfoMetric = new MetricsAggregator(metricsService,
ControlMetricType.MEMORY_INFO, Optional.ofNullable(null));
inboundPacketMetrics = new ConcurrentHashMap<>();
outboundPacketMetrics = new ConcurrentHashMap<>();
flowmodPacketMetrics = new ConcurrentHashMap<>();
flowrmvPacketMetrics = new ConcurrentHashMap<>();
requestPacketMetrics = new ConcurrentHashMap<>();
replyPacketMetrics = new ConcurrentHashMap<>();
}
/**
* Unregisters all control metrics.
*/
protected void unregisterMetrics() {
cpuInfoMetric.removeMetrics();
memoryInfoMetric.removeMetrics();
inboundPacketMetrics.clear();
outboundPacketMetrics.clear();
flowmodPacketMetrics.clear();
flowrmvPacketMetrics.clear();
requestPacketMetrics.clear();
replyPacketMetrics.clear();
}
public MetricsAggregator cpuInfoMetric() {
return cpuInfoMetric;
}
public MetricsAggregator memoryInfoMetric() {
return memoryInfoMetric;
}
public Map<DeviceId, MetricsAggregator> inboundPacketMetrics() {
return inboundPacketMetrics;
}
public Map<DeviceId, MetricsAggregator> outboundPacketMetrics() {
return outboundPacketMetrics;
}
public Map<DeviceId, MetricsAggregator> flowmodPacketMetrics() {
return flowmodPacketMetrics;
}
public Map<DeviceId, MetricsAggregator> flowrmvPacketMetrics() {
return flowrmvPacketMetrics;
}
public Map<DeviceId, MetricsAggregator> requestPacketMetrics() {
return requestPacketMetrics;
}
public Map<DeviceId, MetricsAggregator> replyPacketMetrics() {
return replyPacketMetrics;
}
public MetricsAggregator inboundPacketMetrics(DeviceId deviceId) {
return inboundPacketMetrics.get(deviceId);
}
public MetricsAggregator outboundPacketMetrics(DeviceId deviceId) {
return outboundPacketMetrics.get(deviceId);
}
public MetricsAggregator flowmodPacketMetrics(DeviceId deviceId) {
return flowmodPacketMetrics.get(deviceId);
}
public MetricsAggregator flowrmvPacketMetrics(DeviceId deviceId) {
return flowrmvPacketMetrics.get(deviceId);
}
public MetricsAggregator requestPacketMetrics(DeviceId deviceId) {
return requestPacketMetrics.get(deviceId);
}
public MetricsAggregator replyPacketMetrics(DeviceId deviceId) {
return replyPacketMetrics.get(deviceId);
}
}
\ No newline at end of file
......@@ -15,29 +15,20 @@
*/
package org.onosproject.cpman;
/**
* Abstracted Control Message Type.
*/
public enum ControlMessageType {
/** Mapped to PACKET-IN message of OpenFlow. */
INBOUND_PACKET,
/** Mapped to PACKET-OUT message of OpenFlow. */
OUTBOUND_PACKET,
/** Mapped to FLOW-MOD message of OpenFlow. */
FLOW_MOD_PACKET,
import org.onosproject.net.DeviceId;
/** Mapped to FLOW-REMOVED message of OpenFlow. */
FLOW_REMOVED_PACKET,
import java.util.Optional;
/** Mapped to STATS-REQUEST message of OpenFlow. */
REQUEST_PACKET,
/** Mapped to STATS-REPLY message of OpenFlow. */
REPLY_PACKET,
/** All message types. */
ALL
/**
* Control metrics observer interface.
*/
public interface ControlMetricsObserver {
/**
* Feeds the extracted value from MetricAggregator to back-end storage.
*
* @param metricsAggregator metric aggregator
* @param deviceId device id {@link org.onosproject.net.DeviceId}
*/
void feedMetrics(MetricsAggregator metricsAggregator, Optional<DeviceId> deviceId);
}
......
......@@ -15,33 +15,118 @@
*/
package org.onosproject.cpman;
import com.sun.jndi.toolkit.ctx.ComponentContext;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Modified;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onlab.metrics.MetricsService;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.device.DeviceService;
import org.slf4j.Logger;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import static org.slf4j.LoggerFactory.getLogger;
/**
* Control plane management application.
*/
@Component(immediate = true)
public class ControlPlaneManager {
private final Logger log = getLogger(getClass());
private Set<ControlMetricsObserver> controlMetricsObservers = new HashSet<>();
private ControlMetricsObserver cpObserver;
private ApplicationId appId;
private ControlMetricsFactory cmf;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DeviceService deviceService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected CoreService coreService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected MetricsService metricsService;
@Activate
public void activate(ComponentContext context) {
public void activate() {
appId = coreService.registerApplication("org.onosproject.cpman");
cmf = ControlMetricsFactory.getInstance(metricsService, deviceService);
// currently disable monitoring by default
// cmf.startMonitor();
registerObserver();
log.info("Started");
}
@Deactivate
public void deactivate() {
unregisterObserver();
cmf.stopMonitor();
log.info("Stopped");
}
@Modified
public void modified(ComponentContext context) {
public void modified() {
}
private void registerObserver() {
cpObserver = new DefaultControlMetricsObserver();
this.addControlMetricsObserver(cpObserver);
}
private void unregisterObserver() {
this.removeControlMetricsObserver(cpObserver);
}
private void executeMonitorTask() {
// TODO: execute monitoring task with 1 minute period
if (cmf.isMonitor()) {
controlMetricsObservers.forEach(observer -> {
// try to feed the CPU and memory stats
observer.feedMetrics(cmf.cpuInfoMetric(), Optional.ofNullable(null));
observer.feedMetrics(cmf.memoryInfoMetric(), Optional.ofNullable(null));
// try to feed the control message stats
cmf.getDeviceIds().forEach(v -> {
observer.feedMetrics(cmf.inboundPacketMetrics(v), Optional.of(v));
observer.feedMetrics(cmf.outboundPacketMetrics(v), Optional.of(v));
observer.feedMetrics(cmf.flowmodPacketMetrics(v), Optional.of(v));
observer.feedMetrics(cmf.flowrmvPacketMetrics(v), Optional.of(v));
observer.feedMetrics(cmf.requestPacketMetrics(v), Optional.of(v));
observer.feedMetrics(cmf.replyPacketMetrics(v), Optional.of(v));
});
});
}
}
/**
* Adds a new control metrics observer.
*
* @param cmObserver control metric observer instance
*/
public void addControlMetricsObserver(ControlMetricsObserver cmObserver) {
controlMetricsObservers.add(cmObserver);
}
/**
* Removes an existing control metrics observer.
*
* @param cmObserver control metric observer instance
*/
public void removeControlMetricsObserver(ControlMetricsObserver cmObserver) {
controlMetricsObservers.remove(cmObserver);
}
}
\ No newline at end of file
}
......
/*
* Copyright 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.cpman;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Modified;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.cluster.NodeId;
import org.onosproject.net.DeviceId;
import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import static org.slf4j.LoggerFactory.getLogger;
/**
* Control plane monitoring service class.
*/
@Component(immediate = true)
@Service
public class ControlPlaneMonitor implements ControlPlaneMonitorService {
private final Logger log = getLogger(getClass());
@Activate
public void activate() {
}
@Deactivate
public void deactivate() {
}
@Modified
public void modified(ComponentContext context) {
}
@Override
public void updateMetric(ControlMetric cpm, int updateInterval,
Optional<DeviceId> deviceId) {
}
@Override
public ControlLoad getLoad(NodeId nodeId, ControlMetricType type,
Optional<DeviceId> deviceId) {
return null;
}
@Override
public ControlLoad getLoad(NodeId nodeId, ControlMetricType type,
Optional<DeviceId> deviceId, int duration, TimeUnit unit) {
return null;
}
}
\ No newline at end of file
......@@ -24,28 +24,28 @@ import java.util.concurrent.TimeUnit;
/**
* Control Plane Statistics Service Interface.
*/
public interface ControlPlaneStatsService {
public interface ControlPlaneMonitorService {
/**
* Add a new control plane metric value with a certain update interval.
* Adds a new control metric value with a certain update interval.
*
* @param cpm control plane metric (e.g., control message rate, cpu, memory, etc.)
* @param controlMetric control plane metric (e.g., control message rate, cpu, memory, etc.)
* @param updateInterval value update interval (time unit will be in minute)
*/
void updateMetric(ControlPlaneMetric cpm, int updateInterval);
void updateMetric(ControlMetric controlMetric, int updateInterval, Optional<DeviceId> deviceId);
/**
* Obtain the control plane load of a specific device.
* Obtains the control plane load of a specific device.
*
* @param nodeId node id {@link org.onosproject.cluster.NodeId}
* @param type control metric type
* @param deviceId device id {@link org.onosproject.net.DeviceId}
* @return control plane load
*/
ControlPlaneLoad getLoad(NodeId nodeId, ControlMetricType type, Optional<DeviceId> deviceId);
ControlLoad getLoad(NodeId nodeId, ControlMetricType type, Optional<DeviceId> deviceId);
/**
* Obtain the control plane load of a specific device with a specific time duration.
* Obtains the control plane load of a specific device with a specific time duration.
*
* @param nodeId node id {@link org.onosproject.cluster.NodeId}
* @param type control metric type
......@@ -54,6 +54,6 @@ public interface ControlPlaneStatsService {
* @param deviceId device id {@link org.onosproject.net.Device}
* @return control plane load
*/
ControlPlaneLoad getLoad(NodeId nodeId, ControlMetricType type, Optional<DeviceId> deviceId,
int duration, TimeUnit unit);
ControlLoad getLoad(NodeId nodeId, ControlMetricType type, Optional<DeviceId> deviceId,
int duration, TimeUnit unit);
}
\ No newline at end of file
......
/*
* Copyright 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.cpman;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.onosproject.net.DeviceId;
import java.util.Optional;
/**
* Default ControlMetricsObserver.
*/
public class DefaultControlMetricsObserver implements ControlMetricsObserver {
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected ControlPlaneMonitorService controlPlaneMonitorService;
@Override
public void feedMetrics(MetricsAggregator ma, Optional<DeviceId> deviceId) {
MetricValue mv = new MetricValue((long) ma.getRate(), (long) ma.getLoad(), (long) ma.getCount());
ControlMetric cpm = new ControlMetric(ma.getMetricsType(), mv);
controlPlaneMonitorService.updateMetric(cpm, 1, deviceId);
}
}
\ No newline at end of file
/*
* Copyright 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.cpman;
import static com.google.common.base.MoreObjects.toStringHelper;
/**
* Primitive Metric Value.
*/
public class MetricValue {
private final long rate;
private final long load;
private final long count;
/**
* Constructor.
*
* @param rate rate
* @param load load
* @param count count
*/
MetricValue(long rate, long load, long count) {
this.rate = rate;
this.load = load;
this.count = count;
}
public long getRate() {
return rate;
}
public long getLoad() {
return load;
}
public long getCount() {
return count;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof MetricValue) {
MetricValue other = (MetricValue) obj;
if (this.rate == other.rate &&
this.load == other.load &&
this.count == other.count) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
final int prime = 1004;
int result = super.hashCode();
result = prime * result + (int) this.rate;
result = prime * result + (int) this.load;
result = prime * result + (int) this.count;
return result;
}
@Override
public String toString() {
return toStringHelper(getClass())
.add("rate", Long.toHexString(rate))
.add("load", Long.toHexString(load))
.add("count", Long.toHexString(count)).toString();
}
}
/*
* Copyright 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.cpman;
import com.codahale.metrics.Meter;
import org.onlab.metrics.MetricsComponent;
import org.onlab.metrics.MetricsFeature;
import org.onlab.metrics.MetricsService;
import org.onosproject.net.DeviceId;
import java.util.Optional;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* An aggregator that aggregates a specific network or performance metrics via the metrics service.
*/
public class MetricsAggregator {
private Meter rateMeter;
private Meter countMeter;
private MetricsService metricsService;
private MetricsComponent metricsComponent;
private MetricsFeature metricsFeature;
private ControlMetricType metricsType;
private static final int EXECUTE_PERIOD_IN_SECOND = 60;
private static final String RATE_NAME = "rate";
private static final String COUNT_NAME = "count";
/**
* Constructs a new MetricsAggregator for aggregating a metric.
* Instantiates the metrics service
* Initializes all the general metrics for that object
*
* @param type Control metric type
* @param deviceId DeviceId
*/
MetricsAggregator(MetricsService metricsService, ControlMetricType type, Optional<DeviceId> deviceId) {
String primitiveName = type.toString();
String objName = "all";
if (deviceId.isPresent()) {
objName = deviceId.toString();
}
checkNotNull(primitiveName, "Component name cannot be null");
checkNotNull(objName, "Feature name cannot be null");
this.metricsType = type;
this.metricsService = metricsService;
this.metricsComponent = metricsService.registerComponent(primitiveName);
this.metricsFeature = metricsComponent.registerFeature(objName);
this.rateMeter = metricsService.createMeter(metricsComponent, metricsFeature, RATE_NAME);
this.countMeter = metricsService.createMeter(metricsComponent, metricsFeature, COUNT_NAME);
}
public ControlMetricType getMetricsType() {
return metricsType;
}
/**
* Removes both rate and count metrics.
*/
protected void removeMetrics() {
metricsService.removeMetric(metricsComponent, metricsFeature, RATE_NAME);
metricsService.removeMetric(metricsComponent, metricsFeature, COUNT_NAME);
}
/**
* Increments the meter rate by {@code n}, and the meter counter by 1.
*
* @param n Increment the meter rate by {@code n}.
*/
public void increment(long n) {
rateMeter.mark(n);
countMeter.mark(1);
}
/**
* Obtains the average load value.
*
* @return load value
*/
public double getLoad() {
return rateMeter.getOneMinuteRate() / countMeter.getOneMinuteRate();
}
/**
* Obtains the average meter rate within recent 1 minute.
*
* @return rate value
*/
public double getRate() {
return rateMeter.getOneMinuteRate();
}
/**
* Obtains the average meter count within recent 1 minute.
*
* @return count value
*/
public double getCount() {
return countMeter.getOneMinuteRate() * EXECUTE_PERIOD_IN_SECOND;
}
}
\ No newline at end of file
/*
* Copyright 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.cpman;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.metrics.MetricsServiceAdapter;
import org.onosproject.core.CoreServiceAdapter;
import org.onosproject.net.device.DeviceServiceAdapter;
/**
* Set of tests of the ONOS application component.
*/
public class ControlPlaneManagerTest {
private ControlPlaneManager cpMan;
/**
* Sets up the services required by the CPMan application.
*/
@Before
public void setUp() {
cpMan = new ControlPlaneManager();
cpMan.coreService = new CoreServiceAdapter();
cpMan.deviceService = new DeviceServiceAdapter();
cpMan.metricsService = new MetricsServiceAdapter();
cpMan.activate();
}
/**
* Tears down the CPMan application.
*/
@After
public void tearDown() {
cpMan.deactivate();
}
/**
* Tests the control metric aggregating function.
*
* @throws Exception if metric collection fails.
*/
@Test
public void testMetricsAggregation() throws Exception {
}
/**
* Tests the control metric collecting function.
*
* @throws Exception
*/
@Test
public void testMetricsCollection() throws Exception {
}
}
......@@ -107,4 +107,4 @@ public class MetricsServiceAdapter implements MetricsService {
@Override
public void removeMatching(MetricFilter filter) {
}
}
}
\ No newline at end of file
......