From f1fdee3d90363d655d928c277426d6541d2bb9c4 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 26 Mar 2021 09:28:01 +0100 Subject: [PATCH] Add more system metrics (#1609) Add metrics about logging, file descriptors, process threads and process memory. Rename scm.http.requests to http.server.requests to match micrometer defaults. With this change the exposed metrics are now compatible (except for the tomcat metrics) to the official micrometer grafana dashboard (https://grafana.com/grafana/dashboards/4701). --- gradle/changelog/system_metrics.yaml | 2 ++ gradle/dependencies.gradle | 3 ++- scm-webapp/build.gradle | 3 +++ .../java/sonia/scm/metrics/HttpMetricsFilter.java | 2 +- .../sonia/scm/metrics/MeterRegistryProvider.java | 14 +++++++++++++- 5 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 gradle/changelog/system_metrics.yaml diff --git a/gradle/changelog/system_metrics.yaml b/gradle/changelog/system_metrics.yaml new file mode 100644 index 0000000000..3f8dfdc278 --- /dev/null +++ b/gradle/changelog/system_metrics.yaml @@ -0,0 +1,2 @@ +- type: added + description: Metrics about logging, file descriptors, process threads and process memory ([#1609](https://github.com/scm-manager/scm-manager/pull/1609)) diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index f94d112bd0..c07a78fb50 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -173,6 +173,7 @@ ext { jerseyClientRuntime: "com.sun.jersey.contribs:jersey-apache-client:${jerseyClientVersion}", // metrics - micrometerCore: "io.micrometer:micrometer-core:${micrometerVersion}" + micrometerCore: "io.micrometer:micrometer-core:${micrometerVersion}", + micrometerExtra: "io.github.mweirauch:micrometer-jvm-extras:0.2.2" ] } diff --git a/scm-webapp/build.gradle b/scm-webapp/build.gradle index 39504b90a2..1e321c8122 100644 --- a/scm-webapp/build.gradle +++ b/scm-webapp/build.gradle @@ -117,6 +117,9 @@ dependencies { implementation libraries.legmanShiro implementation libraries.legmanMicrometer + // metrics + implementation libraries.micrometerExtra + // lombok compileOnly libraries.lombok testCompileOnly libraries.lombok diff --git a/scm-webapp/src/main/java/sonia/scm/metrics/HttpMetricsFilter.java b/scm-webapp/src/main/java/sonia/scm/metrics/HttpMetricsFilter.java index e2189e31f1..830c1936be 100644 --- a/scm-webapp/src/main/java/sonia/scm/metrics/HttpMetricsFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/metrics/HttpMetricsFilter.java @@ -47,7 +47,7 @@ import java.io.IOException; @Priority(Filters.PRIORITY_PRE_BASEURL) public class HttpMetricsFilter extends HttpFilter { - static final String METRIC_DURATION = "scm.http.requests"; + static final String METRIC_DURATION = "http.server.requests"; private final HttpServletRequestTagsProvider tagsProvider = new DefaultHttpServletRequestTagsProvider(); diff --git a/scm-webapp/src/main/java/sonia/scm/metrics/MeterRegistryProvider.java b/scm-webapp/src/main/java/sonia/scm/metrics/MeterRegistryProvider.java index 497ff2b289..144bc4f727 100644 --- a/scm-webapp/src/main/java/sonia/scm/metrics/MeterRegistryProvider.java +++ b/scm-webapp/src/main/java/sonia/scm/metrics/MeterRegistryProvider.java @@ -26,13 +26,18 @@ package sonia.scm.metrics; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import io.github.mweirauch.micrometer.jvm.extras.ProcessMemoryMetrics; +import io.github.mweirauch.micrometer.jvm.extras.ProcessThreadMetrics; import io.micrometer.core.instrument.Meter; import io.micrometer.core.instrument.MeterRegistry; 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.logging.LogbackMetrics; +import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics; import io.micrometer.core.instrument.binder.system.ProcessorMetrics; +import io.micrometer.core.instrument.binder.system.UptimeMetrics; import io.micrometer.core.instrument.composite.CompositeMeterRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -103,12 +108,19 @@ public class MeterRegistryProvider implements Provider { return staticRegistry; } - @SuppressWarnings("java:S2095") // we can't close JvmGcMetrics, but it should be ok + @SuppressWarnings("java:S2095") // we can't close, but it should be ok private void bindCommonMetrics(MeterRegistry registry) { + // bind all metrics for https://grafana.com/grafana/dashboards/4701 + // expect those for tomcat new ClassLoaderMetrics().bindTo(registry); new JvmMemoryMetrics().bindTo(registry); new JvmGcMetrics().bindTo(registry); new ProcessorMetrics().bindTo(registry); new JvmThreadMetrics().bindTo(registry); + new UptimeMetrics().bindTo(registry); + new FileDescriptorMetrics().bindTo(registry); + new ProcessMemoryMetrics().bindTo(registry); + new ProcessThreadMetrics().bindTo(registry); + new LogbackMetrics().bindTo(registry); } }