From 0da409141005b560cd148d46f880d510e51fe07a Mon Sep 17 00:00:00 2001 From: Jeff Mesnil Date: Wed, 9 Jan 2019 14:32:11 +0100 Subject: [PATCH] [WFLY-11578] Distinguish WildFly metrics types * In microprofile-metrics-smallrye extension, when attributes that corresponds to metrics are collected, check whether the attribute access has the COUNTER_METRIC flag to register it in Prometheus collector as a counter. Otherwise, the metric is registered as a gauge. * Append _total to the Prometheus name for counters. JIRA: https://issues.jboss.org/browse/WFLY-11578 --- .../MicroProfile_Metrics.adoc | 10 +++- .../microprofile/metrics/MetricCollector.java | 46 ++++++++++++------- .../metrics/PrometheusCollector.java | 3 +- ...icroProfileMetricsApplicationTestCase.java | 2 +- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/docs/src/main/asciidoc/_admin-guide/subsystem-configuration/MicroProfile_Metrics.adoc b/docs/src/main/asciidoc/_admin-guide/subsystem-configuration/MicroProfile_Metrics.adoc index e19a78fcb891..bb87b587564f 100644 --- a/docs/src/main/asciidoc/_admin-guide/subsystem-configuration/MicroProfile_Metrics.adoc +++ b/docs/src/main/asciidoc/_admin-guide/subsystem-configuration/MicroProfile_Metrics.adoc @@ -91,12 +91,18 @@ The [helloworld-rs quickstart](https://github.com/wildfly/quickstart/tree/master that can be deployed in WildFly. A corresponding metric will be exposed for it with the name and labels: -* `wildfly_undertow_request_count{deployment="helloworld-rs.war",servlet="org.jboss.as.quickstarts.rshelloworld.JAXActivator",subdeployment="helloworld-rs.war"}` +* `wildfly_undertow_request_count_total{deployment="helloworld-rs.war",servlet="org.jboss.as.quickstarts.rshelloworld.JAXActivator",subdeployment="helloworld-rs.war"}` +[NOTE] +Some subsystems (such as `undertow` or `messaing-activemq`) do not enable their statistics by default +as they have an impact on performance and memory usage. These subsystems provides a `statistics-enabled` attribute that must +be set to `true` to enable them. +For convenience, WildFly standalone configuration provides expression to enable the statistics by setting a +System property `-Dwildfly.statistics-enabled=true` to enable statistics on the subsystems provided by the configuration. == Component Reference -The Eclipse MicroProfile Health is implemented by the SmallRye Health project. +The Eclipse MicroProfile Metrics is implemented by the SmallRye Metrics project. **** diff --git a/microprofile/metrics-smallrye/src/main/java/org/wildfly/extension/microprofile/metrics/MetricCollector.java b/microprofile/metrics-smallrye/src/main/java/org/wildfly/extension/microprofile/metrics/MetricCollector.java index 3b3825ccd201..b6571fcab4ef 100644 --- a/microprofile/metrics-smallrye/src/main/java/org/wildfly/extension/microprofile/metrics/MetricCollector.java +++ b/microprofile/metrics-smallrye/src/main/java/org/wildfly/extension/microprofile/metrics/MetricCollector.java @@ -25,8 +25,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import io.prometheus.client.Collector; +import io.prometheus.client.Collector.MetricFamilySamples; import io.prometheus.client.CollectorRegistry; +import io.prometheus.client.CounterMetricFamily; import io.prometheus.client.GaugeMetricFamily; import org.jboss.as.controller.LocalModelControllerClient; import org.jboss.as.controller.PathAddress; @@ -101,10 +102,16 @@ private void collectResourceMetrics0(final Resource current, } PathAddress resourceAddress = resourceAddressResolver.apply(address); MeasurementUnit unit = attributeAccess.getAttributeDefinition().getMeasurementUnit(); - MetricMetadata metricMetadata = new MetricMetadata(attributeName, resourceAddress, unit, globalPrefix); + boolean counter = attributeAccess.getFlags().contains(AttributeAccess.Flag.COUNTER_METRIC); + MetricMetadata metricMetadata = new MetricMetadata(attributeName, resourceAddress, unit, globalPrefix, counter); String attributeDescription = resourceDescription.get(ATTRIBUTES, attributeName, DESCRIPTION).asStringOrNull(); - GaugeMetricFamily gaugeMetricFamily = new GaugeMetricFamily(metricMetadata.metricName, attributeDescription, metricMetadata.labelNames); - Supplier> sampleSupplier = () -> { + final MetricFamilySamples metricFamilySamples; + if (counter) { + metricFamilySamples = new CounterMetricFamily(metricMetadata.metricName, attributeDescription, metricMetadata.labelNames); + } else { + metricFamilySamples = new GaugeMetricFamily(metricMetadata.metricName, attributeDescription, metricMetadata.labelNames); + } + Supplier> sampleSupplier = () -> { final ModelNode readAttributeOp = new ModelNode(); readAttributeOp.get(OP).set(READ_ATTRIBUTE_OPERATION); readAttributeOp.get(OP_ADDR).set(resourceAddress.toModelNode()); @@ -120,14 +127,14 @@ private void collectResourceMetrics0(final Resource current, try { double initialValue = result.asDouble(); double scaledValue = UnitConverter.scaleToBase(initialValue, unit); - return Optional.of(new Collector.MetricFamilySamples.Sample(metricMetadata.metricName, metricMetadata.labelNames, metricMetadata.labelValues, scaledValue)); + return Optional.of(new MetricFamilySamples.Sample(metricMetadata.metricName, metricMetadata.labelNames, metricMetadata.labelValues, scaledValue)); } catch (Exception e) { throw LOGGER.unableToConvertAttribute(attributeName, address, e); } } return Optional.empty(); }; - prometheusCollector.addMetricFamilySampleSupplier(gaugeMetricFamily, sampleSupplier); + prometheusCollector.addMetricFamilySampleSupplier(metricFamilySamples, sampleSupplier); registration.addUnregistrationTask(() -> prometheusCollector.removeMetricFamilySampleSupplier(metricMetadata.metricName, sampleSupplier)); } @@ -179,10 +186,16 @@ private void collectMetricFamilies(ImmutableManagementResourceRegistration manag DescriptionProvider modelDescription = managementResourceRegistration.getModelDescription(address); resourceDescription = modelDescription.getModelDescription(Locale.getDefault()); } - MetricMetadata metricMetadata = new MetricMetadata(attributeName, address, attributeAccess.getAttributeDefinition().getMeasurementUnit(), globalPrefix); + boolean counter = attributeAccess.getFlags().contains(AttributeAccess.Flag.COUNTER_METRIC); + MetricMetadata metricMetadata = new MetricMetadata(attributeName, address, attributeAccess.getAttributeDefinition().getMeasurementUnit(), globalPrefix, counter); String attributeDescription = resourceDescription.get(ATTRIBUTES, attributeName, DESCRIPTION).asStringOrNull(); - GaugeMetricFamily gaugeMetricFamily = new GaugeMetricFamily(metricMetadata.metricName, attributeDescription, metricMetadata.labelNames); - collector.addMetricFamilySamples(gaugeMetricFamily); + final MetricFamilySamples metricFamilySamples; + if (counter) { + metricFamilySamples = new CounterMetricFamily(metricMetadata.metricName, attributeDescription, metricMetadata.labelNames); + } else { + metricFamilySamples = new GaugeMetricFamily(metricMetadata.metricName, attributeDescription, metricMetadata.labelNames); + } + collector.addMetricFamilySamples(metricFamilySamples); } for (PathElement childAddress : managementResourceRegistration.getChildAddresses(address)) { @@ -237,7 +250,7 @@ private static class MetricMetadata { private final List labelNames; private final List labelValues; - MetricMetadata(String attributeName, PathAddress address, MeasurementUnit unit, String globalPrefix) { + MetricMetadata(String attributeName, PathAddress address, MeasurementUnit unit, String globalPrefix, boolean counter) { String metricPrefix = ""; labelNames = new ArrayList<>(); labelValues = new ArrayList<>(); @@ -249,7 +262,7 @@ private static class MetricMetadata { metricPrefix += value + "_"; continue; } - labelNames.add(getPrometheusMetricName(key, null)); + labelNames.add(getPrometheusMetricName(key, null, false)); labelValues.add(value); } // if the resource address defines a deployment (without subdeployment), @@ -260,13 +273,14 @@ private static class MetricMetadata { if (globalPrefix != null && !globalPrefix.isEmpty()) { metricPrefix = globalPrefix + "_" + metricPrefix; } - metricName = getPrometheusMetricName(metricPrefix + attributeName, unit); + metricName = getPrometheusMetricName(metricPrefix + attributeName, unit, counter); } - private static String getPrometheusMetricName(String name, MeasurementUnit unit) { - String out = (name + unitSuffix(unit)).replaceAll("[^\\w]+","_"); - out = decamelize(out); - return out; + private static String getPrometheusMetricName(String name, MeasurementUnit unit, boolean counter) { + String prometheusName = name + unitSuffix(unit) + (counter ? "_total" : ""); + prometheusName =prometheusName.replaceAll("[^\\w]+","_"); + prometheusName = decamelize(prometheusName); + return prometheusName; } diff --git a/microprofile/metrics-smallrye/src/main/java/org/wildfly/extension/microprofile/metrics/PrometheusCollector.java b/microprofile/metrics-smallrye/src/main/java/org/wildfly/extension/microprofile/metrics/PrometheusCollector.java index 6c8df6600025..62084c528043 100644 --- a/microprofile/metrics-smallrye/src/main/java/org/wildfly/extension/microprofile/metrics/PrometheusCollector.java +++ b/microprofile/metrics-smallrye/src/main/java/org/wildfly/extension/microprofile/metrics/PrometheusCollector.java @@ -10,7 +10,6 @@ import io.prometheus.client.Collector; import io.prometheus.client.Collector.MetricFamilySamples.Sample; -import io.prometheus.client.GaugeMetricFamily; public class PrometheusCollector extends Collector implements Collector.Describable { @@ -26,7 +25,7 @@ public void addMetricFamilySamples(MetricFamilySamples mfs) { } } - void addMetricFamilySampleSupplier(GaugeMetricFamily mfs, Supplier> sampleSupplier) { + void addMetricFamilySampleSupplier(MetricFamilySamples mfs, Supplier> sampleSupplier) { if (!metricNames.containsKey(mfs.name)) { addMetricFamilySamples(mfs); } diff --git a/testsuite/integration/basic/src/test/java/org/wildfly/test/integration/microprofile/metrics/application/MicroProfileMetricsApplicationTestCase.java b/testsuite/integration/basic/src/test/java/org/wildfly/test/integration/microprofile/metrics/application/MicroProfileMetricsApplicationTestCase.java index 5a43cad4eede..1315f7007ec5 100644 --- a/testsuite/integration/basic/src/test/java/org/wildfly/test/integration/microprofile/metrics/application/MicroProfileMetricsApplicationTestCase.java +++ b/testsuite/integration/basic/src/test/java/org/wildfly/test/integration/microprofile/metrics/application/MicroProfileMetricsApplicationTestCase.java @@ -199,7 +199,7 @@ private static String performCall(URL url) throws Exception { } private void checkRequestCount(int expectedCount, boolean deploymentMetricMustExist) throws IOException { - String prometheusMetricName = "wildfly_undertow_request_count"; + String prometheusMetricName = "wildfly_undertow_request_count_total"; String metrics = getPrometheusMetrics(managementClient, "", true); for (String line : metrics.split("\\R")) {