Jian Li
Committed by Gerrit Code Review

Augment metrics model to monitor more # of control metrics

Existing implementation only monitors OpenFlow messages.
This commit augments the metrics model in a way to monitor more
number of control metrics including
- CPU Load, total CPU time, sys CPU time, user CPU time, etc.
- Used memory percentage, free memory percentage
- Disk read/write bytes
- Network incoming/outgoing bytes/packets

Change-Id: I9e8eee163c3033132eb202f3c75bad246c87f133
...@@ -34,8 +34,7 @@ ...@@ -34,8 +34,7 @@
34 <onos.app.name>org.onosproject.cpman</onos.app.name> 34 <onos.app.name>org.onosproject.cpman</onos.app.name>
35 <onos.app.category>default</onos.app.category> 35 <onos.app.category>default</onos.app.category>
36 <onos.app.url>http://onosproject.org</onos.app.url> 36 <onos.app.url>http://onosproject.org</onos.app.url>
37 - <onos.app.readme>Control plane management application. 37 + <onos.app.readme>Control plane management application.</onos.app.readme>
38 - </onos.app.readme>
39 </properties> 38 </properties>
40 39
41 <dependencies> 40 <dependencies>
......
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -20,27 +20,78 @@ package org.onosproject.cpman; ...@@ -20,27 +20,78 @@ package org.onosproject.cpman;
20 */ 20 */
21 public enum ControlMetricType { 21 public enum ControlMetricType {
22 22
23 - /** Mapped to PACKET-IN message of OpenFlow. */ 23 + /* Mapped to PACKET-IN message of OpenFlow. */
24 INBOUND_PACKET, 24 INBOUND_PACKET,
25 25
26 - /** Mapped to PACKET-OUT message of OpenFlow. */ 26 + /* Mapped to PACKET-OUT message of OpenFlow. */
27 OUTBOUND_PACKET, 27 OUTBOUND_PACKET,
28 28
29 - /** Mapped to FLOW-MOD message of OpenFlow. */ 29 + /* Mapped to FLOW-MOD message of OpenFlow. */
30 FLOW_MOD_PACKET, 30 FLOW_MOD_PACKET,
31 31
32 - /** Mapped to FLOW-REMOVED message of OpenFlow. */ 32 + /* Mapped to FLOW-REMOVED message of OpenFlow. */
33 FLOW_REMOVED_PACKET, 33 FLOW_REMOVED_PACKET,
34 34
35 - /** Mapped to STATS-REQUEST message of OpenFlow. */ 35 + /* Mapped to STATS-REQUEST message of OpenFlow. */
36 REQUEST_PACKET, 36 REQUEST_PACKET,
37 37
38 - /** Mapped to STATS-REPLY message of OpenFlow. */ 38 + /* Mapped to STATS-REPLY message of OpenFlow. */
39 REPLY_PACKET, 39 REPLY_PACKET,
40 40
41 - /** Cpu Utilization. */ 41 + /* Number of CPU cores. */
42 - CPU_INFO, 42 + NUM_OF_CORES,
43 43
44 - /** Memory Utilization. */ 44 + /* Number of CPUs. **/
45 - MEMORY_INFO 45 + NUM_OF_CPUS,
46 +
47 + /* CPU Speed. **/
48 + CPU_SPEED,
49 +
50 + /* CPU Load. **/
51 + CPU_LOAD,
52 +
53 + /* Total Amount of CPU Up Time. **/
54 + TOTAL_CPU_TIME,
55 +
56 + /* System CPU Up Time. **/
57 + SYS_CPU_TIME,
58 +
59 + /* User CPU Up Time. **/
60 + USER_CPU_TIME,
61 +
62 + /* CPU Idle Time. **/
63 + CPU_IDLE_TIME,
64 +
65 + /* Percentage of Used Memory Amount. */
66 + MEMORY_USED_PERCENTAGE,
67 +
68 + /* Percentage of Free Memory Amount. **/
69 + MEMORY_FREE_PERCENTAGE,
70 +
71 + /* Used Memory Amount. **/
72 + MEMORY_USED,
73 +
74 + /* Free Memory Amount. **/
75 + MEMORY_FREE,
76 +
77 + /* Total Amount of Memory. **/
78 + MEMORY_TOTAL,
79 +
80 + /* Disk Read Bytes. **/
81 + DISK_READ_BYTES,
82 +
83 + /* Disk Write Bytes. **/
84 + DISK_WRITE_BYTES,
85 +
86 + /* Network Incoming Bytes. **/
87 + NW_INCOMING_BYTES,
88 +
89 + /* Network Outgoing Bytes. **/
90 + NW_OUTGOING_BYTES,
91 +
92 + /* Network Incoming Packets. **/
93 + NW_INCOMING_PACKETS,
94 +
95 + /* Network Outgoing Packets. **/
96 + NW_OUTGOING_PACKETS
46 } 97 }
......
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -31,4 +31,12 @@ public interface ControlMetricsObserver { ...@@ -31,4 +31,12 @@ public interface ControlMetricsObserver {
31 * @param deviceId device id {@link org.onosproject.net.DeviceId} 31 * @param deviceId device id {@link org.onosproject.net.DeviceId}
32 */ 32 */
33 void feedMetrics(MetricsAggregator metricsAggregator, Optional<DeviceId> deviceId); 33 void feedMetrics(MetricsAggregator metricsAggregator, Optional<DeviceId> deviceId);
34 +
35 + /**
36 + * Feeds the extracted value from MetricAggregator to back-end storage.
37 + *
38 + * @param metricsAggregator metric aggregator
39 + * @param resourceName resource name
40 + */
41 + void feedMetrics(MetricsAggregator metricsAggregator, String resourceName);
34 } 42 }
......
1 +/*
2 + * Copyright 2016 Open Networking Laboratory
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + */
16 +package org.onosproject.cpman;
17 +
18 +/**
19 + * Control metrics class for storing system specification.
20 + */
21 +public final class ControlMetricsSystemSpec {
22 + private int numOfCores;
23 + private int numOfCpus;
24 + private int cpuSpeed; // in MHz
25 + private long totalMemory; // in bytes
26 +
27 + private ControlMetricsSystemSpec(int numOfCores, int numOfCpus,
28 + int cpuSpeed, long totalMemory) {
29 + this.numOfCores = numOfCores;
30 + this.numOfCpus = numOfCpus;
31 + this.cpuSpeed = cpuSpeed;
32 + this.totalMemory = totalMemory;
33 + }
34 +
35 + /**
36 + * Returns number of CPU cores.
37 + *
38 + * @return number of CPU cores
39 + */
40 + public int numOfCores() {
41 + return this.numOfCores;
42 + }
43 +
44 + /**
45 + * Returns number of CPUs.
46 + *
47 + * @return number of CPUs
48 + */
49 + public int numOfCpus() {
50 + return this.numOfCpus;
51 + }
52 +
53 + /**
54 + * Returns CPU speed in MHz.
55 + *
56 + * @return CPU speed
57 + */
58 + public int cpuSpeed() {
59 + return this.cpuSpeed;
60 + }
61 +
62 + /**
63 + * Returns the total amount of memory.
64 + *
65 + * @return memory size
66 + */
67 + public long totalMemory() {
68 + return this.totalMemory;
69 + }
70 +
71 + /**
72 + * ControlMetricsSystemSpec builder class.
73 + */
74 + public static final class Builder {
75 + private int numOfCores;
76 + private int numOfCpus;
77 + private int cpuSpeed; // in MHz
78 + private long totalMemory; // in bytes
79 +
80 + /**
81 + * Sets number of CPU cores.
82 + *
83 + * @param numOfCores number of CPU cores
84 + * @return Builder object
85 + */
86 + public Builder numOfCores(int numOfCores) {
87 + this.numOfCores = numOfCores;
88 + return this;
89 + }
90 +
91 + /**
92 + * Sets number of CPUs.
93 + * @param numOfCpus number of CPUs
94 + * @return Builder object
95 + */
96 + public Builder numOfCpus(int numOfCpus) {
97 + this.numOfCpus = numOfCpus;
98 + return this;
99 + }
100 +
101 + /**
102 + * Sets CPU speed.
103 + *
104 + * @param cpuSpeed CPU speed
105 + * @return Builder object
106 + */
107 + public Builder cpuSpeed(int cpuSpeed) {
108 + this.cpuSpeed = cpuSpeed;
109 + return this;
110 + }
111 +
112 + /**
113 + * Sets total amount of memory.
114 + *
115 + * @param totalMemory memory size
116 + * @return Builder object
117 + */
118 + public Builder totalMemory(long totalMemory) {
119 + this.totalMemory = totalMemory;
120 + return this;
121 + }
122 +
123 + /**
124 + * Builds a ControlMetricsSystemSpec object.
125 + *
126 + * @return ControlMetricsSystemSpec object
127 + */
128 + public ControlMetricsSystemSpec build() {
129 + return new ControlMetricsSystemSpec(numOfCores, numOfCpus, cpuSpeed, totalMemory);
130 + }
131 + }
132 +}
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -95,18 +95,18 @@ public class ControlPlaneManager { ...@@ -95,18 +95,18 @@ public class ControlPlaneManager {
95 if (cmf.isMonitor()) { 95 if (cmf.isMonitor()) {
96 controlMetricsObservers.forEach(observer -> { 96 controlMetricsObservers.forEach(observer -> {
97 97
98 - // try to feed the CPU and memory stats 98 + // only OpenFlow messages are spontaneously monitored with
99 - observer.feedMetrics(cmf.cpuInfoMetric(), Optional.ofNullable(null)); 99 + // 1 minute period. Other system metrics will be pushed from
100 - observer.feedMetrics(cmf.memoryInfoMetric(), Optional.ofNullable(null)); 100 + // external monitoring agent through REST API
101 101
102 - // try to feed the control message stats 102 + // feed the control message stats
103 cmf.getDeviceIds().forEach(v -> { 103 cmf.getDeviceIds().forEach(v -> {
104 - observer.feedMetrics(cmf.inboundPacketMetrics(v), Optional.of(v)); 104 + observer.feedMetrics(cmf.inboundPacket(v), Optional.of(v));
105 - observer.feedMetrics(cmf.outboundPacketMetrics(v), Optional.of(v)); 105 + observer.feedMetrics(cmf.outboundPacket(v), Optional.of(v));
106 - observer.feedMetrics(cmf.flowmodPacketMetrics(v), Optional.of(v)); 106 + observer.feedMetrics(cmf.flowmodPacket(v), Optional.of(v));
107 - observer.feedMetrics(cmf.flowrmvPacketMetrics(v), Optional.of(v)); 107 + observer.feedMetrics(cmf.flowrmvPacket(v), Optional.of(v));
108 - observer.feedMetrics(cmf.requestPacketMetrics(v), Optional.of(v)); 108 + observer.feedMetrics(cmf.requestPacket(v), Optional.of(v));
109 - observer.feedMetrics(cmf.replyPacketMetrics(v), Optional.of(v)); 109 + observer.feedMetrics(cmf.replyPacket(v), Optional.of(v));
110 }); 110 });
111 }); 111 });
112 } 112 }
......
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -57,6 +57,12 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService { ...@@ -57,6 +57,12 @@ public class ControlPlaneMonitor implements ControlPlaneMonitorService {
57 } 57 }
58 58
59 @Override 59 @Override
60 + public void updateMetric(ControlMetric controlMetric, int updateInterval,
61 + String resourceName) {
62 +
63 + }
64 +
65 + @Override
60 public ControlLoad getLoad(NodeId nodeId, ControlMetricType type, 66 public ControlLoad getLoad(NodeId nodeId, ControlMetricType type,
61 Optional<DeviceId> deviceId) { 67 Optional<DeviceId> deviceId) {
62 return null; 68 return null;
......
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -36,6 +36,15 @@ public interface ControlPlaneMonitorService { ...@@ -36,6 +36,15 @@ public interface ControlPlaneMonitorService {
36 void updateMetric(ControlMetric controlMetric, int updateInterval, Optional<DeviceId> deviceId); 36 void updateMetric(ControlMetric controlMetric, int updateInterval, Optional<DeviceId> deviceId);
37 37
38 /** 38 /**
39 + * Adds a new control metric value with a certain update interval.
40 + *
41 + * @param controlMetric control plane metric (e.g., disk and network metrics)
42 + * @param updateInterval value update interval (time unit will be in minute)
43 + * @param resourceName resource name
44 + */
45 + void updateMetric(ControlMetric controlMetric, int updateInterval, String resourceName);
46 +
47 + /**
39 * Obtains the control plane load of a specific device. 48 * Obtains the control plane load of a specific device.
40 * 49 *
41 * @param nodeId node id {@link org.onosproject.cluster.NodeId} 50 * @param nodeId node id {@link org.onosproject.cluster.NodeId}
......
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -32,7 +32,14 @@ public class DefaultControlMetricsObserver implements ControlMetricsObserver { ...@@ -32,7 +32,14 @@ public class DefaultControlMetricsObserver implements ControlMetricsObserver {
32 @Override 32 @Override
33 public void feedMetrics(MetricsAggregator ma, Optional<DeviceId> deviceId) { 33 public void feedMetrics(MetricsAggregator ma, Optional<DeviceId> deviceId) {
34 MetricValue mv = new MetricValue((long) ma.getRate(), (long) ma.getLoad(), (long) ma.getCount()); 34 MetricValue mv = new MetricValue((long) ma.getRate(), (long) ma.getLoad(), (long) ma.getCount());
35 - ControlMetric cpm = new ControlMetric(ma.getMetricsType(), mv); 35 + ControlMetric cm = new ControlMetric(ma.getMetricsType(), mv);
36 - controlPlaneMonitorService.updateMetric(cpm, 1, deviceId); 36 + controlPlaneMonitorService.updateMetric(cm, 1, deviceId);
37 + }
38 +
39 + @Override
40 + public void feedMetrics(MetricsAggregator ma, String resourceName) {
41 + MetricValue mv = new MetricValue((long) ma.getRate(), (long) ma.getLoad(), (long) ma.getCount());
42 + ControlMetric cm = new ControlMetric(ma.getMetricsType(), mv);
43 + controlPlaneMonitorService.updateMetric(cm, 1, resourceName);
37 } 44 }
38 } 45 }
...\ No newline at end of file ...\ No newline at end of file
......
1 /* 1 /*
2 - * Copyright 2015 Open Networking Laboratory 2 + * Copyright 2015-2016 Open Networking Laboratory
3 * 3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License. 5 * you may not use this file except in compliance with the License.
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onosproject.cpman; 16 package org.onosproject.cpman;
17 17
18 import com.codahale.metrics.Meter; 18 import com.codahale.metrics.Meter;
19 +import org.apache.commons.lang3.StringUtils;
19 import org.onlab.metrics.MetricsComponent; 20 import org.onlab.metrics.MetricsComponent;
20 import org.onlab.metrics.MetricsFeature; 21 import org.onlab.metrics.MetricsFeature;
21 import org.onlab.metrics.MetricsService; 22 import org.onlab.metrics.MetricsService;
...@@ -49,13 +50,58 @@ public class MetricsAggregator { ...@@ -49,13 +50,58 @@ public class MetricsAggregator {
49 * @param type Control metric type 50 * @param type Control metric type
50 * @param deviceId DeviceId 51 * @param deviceId DeviceId
51 */ 52 */
52 - MetricsAggregator(MetricsService metricsService, ControlMetricType type, Optional<DeviceId> deviceId) { 53 + MetricsAggregator(MetricsService metricsService, ControlMetricType type,
54 + Optional<DeviceId> deviceId) {
55 + init(metricsService, type, deviceId, null);
56 + }
57 +
58 + /**
59 + * Constructs a new MetricAggregator for aggregating a metric.
60 + * Instantiates the metrics service
61 + * Initializes all the general metrics for that object
62 + *
63 + * @param metricsService MetricsService reference
64 + * @param type Control metric type
65 + * @param resourceName resource name (e.g., ethernet interface name)
66 + */
67 + MetricsAggregator(MetricsService metricsService, ControlMetricType type,
68 + String resourceName) {
69 + init(metricsService, type, Optional.ofNullable(null), resourceName);
70 +
71 + }
72 +
73 + /**
74 + * Constructs a new MetricAggregator for aggregating a metric.
75 + * Instantiates the metrics service
76 + * Initializes all the general metrics for that object
77 + *
78 + * @param metricsService MetricsService reference
79 + * @param type Control metric type
80 + */
81 + MetricsAggregator(MetricsService metricsService, ControlMetricType type) {
82 + init(metricsService, type, Optional.ofNullable(null), null);
83 + }
84 +
85 + /**
86 + * Base method of the constructor of this class.
87 + *
88 + * @param metricsService MetricsService reference
89 + * @param type Control metric type
90 + * @param deviceId DeviceId
91 + * @param resourceName resource name
92 + */
93 + private void init(MetricsService metricsService, ControlMetricType type,
94 + Optional<DeviceId> deviceId, String resourceName) {
53 String primitiveName = type.toString(); 95 String primitiveName = type.toString();
54 String objName = "all"; 96 String objName = "all";
55 if (deviceId.isPresent()) { 97 if (deviceId.isPresent()) {
56 objName = deviceId.toString(); 98 objName = deviceId.toString();
57 } 99 }
58 100
101 + if (StringUtils.isNotEmpty(resourceName)) {
102 + objName = resourceName;
103 + }
104 +
59 checkNotNull(primitiveName, "Component name cannot be null"); 105 checkNotNull(primitiveName, "Component name cannot be null");
60 checkNotNull(objName, "Feature name cannot be null"); 106 checkNotNull(objName, "Feature name cannot be null");
61 107
...@@ -74,14 +120,6 @@ public class MetricsAggregator { ...@@ -74,14 +120,6 @@ public class MetricsAggregator {
74 } 120 }
75 121
76 /** 122 /**
77 - * Removes both rate and count metrics.
78 - */
79 - protected void removeMetrics() {
80 - metricsService.removeMetric(metricsComponent, metricsFeature, RATE_NAME);
81 - metricsService.removeMetric(metricsComponent, metricsFeature, COUNT_NAME);
82 - }
83 -
84 - /**
85 * Increments the meter rate by {@code n}, and the meter counter by 1. 123 * Increments the meter rate by {@code n}, and the meter counter by 1.
86 * 124 *
87 * @param n Increment the meter rate by {@code n}. 125 * @param n Increment the meter rate by {@code n}.
......