Bind default metrics to registry in monitoring SDK 37/88837/5
authorFilip Krzywka <filip.krzywka@nokia.com>
Thu, 30 May 2019 07:58:19 +0000 (09:58 +0200)
committerFilip Krzywka <filip.krzywka@nokia.com>
Mon, 3 Jun 2019 08:09:05 +0000 (10:09 +0200)
Change-Id: I074d28355eebe1dfb04e9dff1cc9580e68f10f2b
Issue-ID: DCAEGEN2-1522
Signed-off-by: Filip Krzywka <filip.krzywka@nokia.com>
standardization/moher-api/metrics/pom.xml
standardization/moher-api/metrics/src/main/java/org/onap/dcaegen2/services/sdk/standardization/moher/metrics/api/MetricsFactory.java
standardization/moher-api/metrics/src/main/java/org/onap/dcaegen2/services/sdk/standardization/moher/metrics/impl/MetricsImpl.java
standardization/moher-api/metrics/src/test/java/org/onap/dcaegen2/services/sdk/standardization/moher/metrics/impl/MetricsIT.java

index fd0c967..7c5a499 100644 (file)
             <groupId>io.projectreactor</groupId>
             <artifactId>reactor-core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>io.projectreactor</groupId>
             <artifactId>reactor-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-engine</artifactId>
index 359f747..33772c2 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.onap.dcaegen2.services.sdk.standardization.moher.metrics.api;
 
+import io.micrometer.core.instrument.binder.MeterBinder;
 import io.micrometer.prometheus.PrometheusConfig;
 import io.micrometer.prometheus.PrometheusMeterRegistry;
 import org.onap.dcaegen2.services.sdk.standardization.moher.metrics.impl.MetricsImpl;
@@ -42,6 +43,14 @@ public class MetricsFactory {
 
     /**
      * Method for creating default Prometheus registry.
+     * <p>
+     * Client is expected to populate registry with custom metrics.
+     * Exact procedure can be found at Micrometer project site.
+     * </p>
+     * <p>
+     * It is recommended to search through available implementations of {@link MeterBinder}
+     * as there exists a plenty of them for most common use cases.
+     * </p>
      *
      * @since 1.2.0
      */
@@ -51,11 +60,16 @@ public class MetricsFactory {
 
     /**
      * Method for creating {@link Metrics} with configured Prometheus registry.
+     * <p>
+     * Returned object will add to registry few default JVM (memory and threads usage, garbage collection)
+     * and system metrics (CPU usage). For exact list of metrics added, please refer to implementation.
      *
      * @param registry Prometheus registry to be used
      * @since 1.2.0
      */
     public static Metrics createMetrics(PrometheusMeterRegistry registry) {
-        return new MetricsImpl(registry);
+        MetricsImpl metrics = new MetricsImpl(registry);
+        metrics.configureDefaultMetrics();
+        return metrics;
     }
 }
index 068a2db..5fe4e12 100644 (file)
 package org.onap.dcaegen2.services.sdk.standardization.moher.metrics.impl;
 
 
+import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;
+import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
+import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
+import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
+import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
 import io.micrometer.prometheus.PrometheusMeterRegistry;
 import org.onap.dcaegen2.services.sdk.standardization.moher.metrics.api.Metrics;
 import reactor.core.publisher.Flux;
@@ -45,4 +50,12 @@ public class MetricsImpl implements Metrics {
         return Flux.interval(interval)
                 .map((l) -> registry.scrape());
     }
+
+    public void configureDefaultMetrics(){
+        new ClassLoaderMetrics().bindTo(registry);
+        new JvmThreadMetrics().bindTo(registry);
+        new JvmMemoryMetrics().bindTo(registry);
+        new JvmGcMetrics().bindTo(registry);
+        new ProcessorMetrics().bindTo(registry);
+    }
 }
index f04636e..d024d08 100644 (file)
@@ -30,7 +30,7 @@ import reactor.test.StepVerifier;
 
 import java.time.Duration;
 
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 
 class MetricsIT {
 
@@ -76,7 +76,7 @@ class MetricsIT {
                 cut.collect(INTERVAL).take(2)
         )
                 .consumeNextWith((collectedMetrics) -> {
-                    assertTrue(collectedMetrics.contains(COUNTER_NAME));
+                    assertMetricsContain(collectedMetrics, COUNTER_NAME);
                     counter.increment();
                 })
                 .thenAwait(INTERVAL)
@@ -84,4 +84,23 @@ class MetricsIT {
                         collectedMetrics.contains(COUNTER_NAME + "_total 1.0"))
                 .verifyComplete();
     }
+
+    @Test
+    void metrics_shouldIncludeSomeDefaultMetrics() {
+        StepVerifier.create(cut.collect())
+                .consumeNextWith((collectedMetrics) -> {
+                    assertMetricsContain(collectedMetrics, "jvm_threads");
+                    assertMetricsContain(collectedMetrics, "jvm_memory");
+                    assertMetricsContain(collectedMetrics, "jvm_classes");
+                    assertMetricsContain(collectedMetrics, "jvm_gc");
+                    assertMetricsContain(collectedMetrics, "system_cpu");
+                })
+                .verifyComplete();
+    }
+
+    private void assertMetricsContain(final String collectedMetrics, final String metricName) {
+        assertThat(collectedMetrics.contains(metricName))
+                .describedAs(String.format("Expected metric: %s", metricName))
+                .isTrue();
+    }
 }