Notify all metric reporters when new types of system metric added
Change-Id: I307be0cb68bdc7fc3c75212c3fac4390fb9391a9
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/SystemMetricsAggregator.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/SystemMetricsAggregator.java
index f3c7761..19887a1 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/SystemMetricsAggregator.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/SystemMetricsAggregator.java
@@ -34,7 +34,7 @@
/**
* Aggregate system metrics.
*/
-public class SystemMetricsAggregator {
+public final class SystemMetricsAggregator {
private final Logger log = getLogger(getClass());
@@ -42,40 +42,108 @@
private static final String DEFAULT_METER_SUFFIX = "rate";
private static final String DISK_RESOURCE_TYPE = "disk";
private static final String NETWORK_RESOURCE_TYPE = "network";
- private final Map<ControlMetricType, Meter> meterMap = Maps.newHashMap();
- private final Set<ControlMetricType> metricTypeSet = Sets.newHashSet();
+ private final Map<ControlMetricType, Meter> systemMap = Maps.newHashMap();
+ private final Map<String, Map<ControlMetricType, Meter>> diskMap = Maps.newHashMap();
+ private final Map<String, Map<ControlMetricType, Meter>> networkMap = Maps.newHashMap();
- public SystemMetricsAggregator(MetricsService metricsService, Optional<String> resName, String resType) {
- String resourceName = resName.isPresent() ? resName.get() : DEFAULT_RESOURCE_NAME;
- MetricsComponent mc = metricsService.registerComponent(resourceName);
+ private MetricsService metricsService;
- if (resName.isPresent()) {
- if (DISK_RESOURCE_TYPE.equals(resType)) {
- metricTypeSet.addAll(ControlResource.DISK_METRICS);
- } else if (NETWORK_RESOURCE_TYPE.equals(resType)) {
- metricTypeSet.addAll(ControlResource.NETWORK_METRICS);
- } else {
- log.warn("Not valid resource type {}", resType);
- }
- } else {
- metricTypeSet.addAll(ControlResource.MEMORY_METRICS);
- metricTypeSet.addAll(ControlResource.CPU_METRICS);
- }
-
- metricTypeSet.forEach(type -> {
- MetricsFeature metricsFeature = mc.registerFeature(type.toString());
- Meter meter = metricsService.createMeter(mc, metricsFeature, DEFAULT_METER_SUFFIX);
- meterMap.putIfAbsent(type, meter);
- });
+ public static SystemMetricsAggregator getInstance() {
+ return SingletonHelper.INSTANCE;
}
/**
- * Increments metric value.
+ * Configures metric services.
*
- * @param type metric type
+ * @param service metrics service
+ */
+ public void setMetricsService(MetricsService service) {
+
+ metricsService = service;
+ }
+
+ /**
+ * Increments system metric value.
+ *
+ * @param type metric type
* @param value metric value
*/
public void increment(ControlMetricType type, long value) {
- meterMap.get(type).mark(value);
+ systemMap.get(type).mark(value);
+ }
+
+ /**
+ * Increments disk or network metric value.
+ *
+ * @param resourceName resource name
+ * @param resourceType resource type
+ * @param type control metric type
+ * @param value metric value
+ */
+ public void increment(String resourceName, String resourceType, ControlMetricType type, long value) {
+ if (DISK_RESOURCE_TYPE.equals(resourceType) && diskMap.containsKey(resourceName)) {
+ diskMap.get(resourceName).get(type).mark(value);
+ }
+
+ if (NETWORK_RESOURCE_TYPE.equals(resourceType) && networkMap.containsKey(resourceName)) {
+ networkMap.get(resourceName).get(type).mark(value);
+ }
+ }
+
+ /**
+ * Adds a set of new monitoring metric types.
+ *
+ * @param optResourceName optional resource name, null denotes system metric
+ * @param resType resource type
+ */
+ public void addMetrics(Optional<String> optResourceName, String resType) {
+ Set<ControlMetricType> metricTypeSet = Sets.newHashSet();
+ String resourceName = optResourceName.isPresent() ?
+ optResourceName.get() : DEFAULT_RESOURCE_NAME;
+
+ MetricsComponent metricsComponent = metricsService.registerComponent(resourceName);
+
+ if (optResourceName.isPresent()) {
+ if (!diskMap.containsKey(resourceName) && DISK_RESOURCE_TYPE.equals(resType)) {
+ metricTypeSet.addAll(ControlResource.DISK_METRICS);
+ diskMap.putIfAbsent(resourceName,
+ getMeterMap(metricTypeSet, metricsComponent, metricsService));
+ metricsService.notifyReporters();
+ } else if (!networkMap.containsKey(resourceName) && NETWORK_RESOURCE_TYPE.equals(resType)) {
+ metricTypeSet.addAll(ControlResource.NETWORK_METRICS);
+ networkMap.putIfAbsent(resourceName,
+ getMeterMap(metricTypeSet, metricsComponent, metricsService));
+ metricsService.notifyReporters();
+ } else {
+ return;
+ }
+ } else {
+ if (systemMap.isEmpty()) {
+ metricTypeSet.addAll(ControlResource.MEMORY_METRICS);
+ metricTypeSet.addAll(ControlResource.CPU_METRICS);
+
+ systemMap.putAll(getMeterMap(metricTypeSet, metricsComponent, metricsService));
+ metricsService.notifyReporters();
+ }
+ }
+ }
+
+ private Map<ControlMetricType, Meter> getMeterMap(Set<ControlMetricType> types,
+ MetricsComponent component,
+ MetricsService service) {
+ Map<ControlMetricType, Meter> meterMap = Maps.newHashMap();
+ types.forEach(type -> {
+ MetricsFeature metricsFeature = component.registerFeature(type.toString());
+ Meter meter = service.createMeter(component, metricsFeature, DEFAULT_METER_SUFFIX);
+ meterMap.putIfAbsent(type, meter);
+ });
+ return meterMap;
+ }
+
+ private SystemMetricsAggregator() {
+ }
+
+ private static class SingletonHelper {
+ private static final SystemMetricsAggregator INSTANCE = new SystemMetricsAggregator();
}
}