diff --git a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java index af4bff9d218..662c292b76f 100644 --- a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java +++ b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java @@ -110,6 +110,7 @@ public class PrometheusMetricsProvider implements MetricsProvider { private int maxQueueSize = 1000000; private long workerShutdownTimeoutMs = 1000; private Optional executorOptional = Optional.empty(); + private String namespace; @Override public void configure(Properties configuration) throws MetricsProviderLifeCycleException { @@ -123,6 +124,7 @@ public void configure(Properties configuration) throws MetricsProviderLifeCycleE configuration.getProperty(MAX_QUEUE_SIZE, "1000000")); this.workerShutdownTimeoutMs = Long.parseLong( configuration.getProperty(WORKER_SHUTDOWN_TIMEOUT_MS, "1000")); + this.namespace = configuration.getProperty("namespace", ""); } @Override @@ -376,6 +378,7 @@ public PrometheusCounter(String name) { this.name = name; this.inner = io.prometheus.client.Counter .build(name, name) + .namespace(namespace) .register(collectorRegistry); } @@ -408,6 +411,7 @@ public PrometheusLabelledCounter(final String name) { this.inner = io.prometheus.client.Counter .build(name, name) .labelNames(LABELS) + .namespace(namespace) .register(collectorRegistry); } @@ -433,6 +437,7 @@ public PrometheusGaugeWrapper(String name, Gauge gauge, io.prometheus.client.Gau this.inner = prev != null ? prev : io.prometheus.client.Gauge .build(name, name) + .namespace(namespace) .register(collectorRegistry); } @@ -465,6 +470,7 @@ private PrometheusLabelledGaugeWrapper(final String name, this.inner = prev != null ? prev : io.prometheus.client.Gauge .build(name, name) + .namespace(namespace) .labelNames(LABELS) .register(collectorRegistry); } @@ -493,6 +499,7 @@ public PrometheusSummary(String name, MetricsContext.DetailLevel level) { if (level == MetricsContext.DetailLevel.ADVANCED) { this.inner = io.prometheus.client.Summary .build(name, name) + .namespace(namespace) .quantile(0.5, 0.05) // Add 50th percentile (= median) with 5% tolerated error .quantile(0.9, 0.01) // Add 90th percentile with 1% tolerated error .quantile(0.99, 0.001) // Add 99th percentile with 0.1% tolerated error @@ -500,6 +507,7 @@ public PrometheusSummary(String name, MetricsContext.DetailLevel level) { } else { this.inner = io.prometheus.client.Summary .build(name, name) + .namespace(namespace) .quantile(0.5, 0.05) // Add 50th percentile (= median) with 5% tolerated error .register(collectorRegistry); } @@ -530,6 +538,7 @@ public PrometheusLabelledSummary(String name, MetricsContext.DetailLevel level) this.inner = io.prometheus.client.Summary .build(name, name) .labelNames(LABELS) + .namespace(namespace) .quantile(0.5, 0.05) // Add 50th percentile (= median) with 5% tolerated error .quantile(0.9, 0.01) // Add 90th percentile with 1% tolerated error .quantile(0.99, 0.001) // Add 99th percentile with 0.1% tolerated error @@ -538,6 +547,7 @@ public PrometheusLabelledSummary(String name, MetricsContext.DetailLevel level) this.inner = io.prometheus.client.Summary .build(name, name) .labelNames(LABELS) + .namespace(namespace) .quantile(0.5, 0.05) // Add 50th percentile (= median) with 5% tolerated error .register(collectorRegistry); } diff --git a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderTest.java b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderTest.java index 59115e31d90..c3f51eef10c 100644 --- a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderTest.java +++ b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderTest.java @@ -679,6 +679,53 @@ private void createAndRegisterGaugeSet(final String name, provider.getRootContext().registerGaugeSet(name, gaugeSet); } + @Test + public void testNamespace() throws Exception { + provider.stop(); + provider = new PrometheusMetricsProvider(); + Properties configuration = new Properties(); + configuration.setProperty("httpPort", "0"); // ephemeral port + configuration.setProperty("exportJvmInfo", "false"); + configuration.setProperty("namespace", "zk_test_namespace"); + provider.configure(configuration); + provider.start(); + + Summary summary = provider.getRootContext() + .getSummary("cc", MetricsContext.DetailLevel.BASIC); + summary.add(10); + summary.add(10); + int[] count = {0}; + provider.dump((k, v) -> { + count[0]++; + int value = ((Number) v).intValue(); + + switch (k) { + case "zk_test_namespace_cc{quantile=\"0.5\"}": + assertEquals(10, value); + break; + case "zk_test_namespace_cc_count": + assertEquals(2, value); + break; + case "zk_test_namespace_cc_sum": + assertEquals(20, value); + break; + default: + fail("unespected key " + k); + break; + } + } + ); + assertEquals(3, count[0]); + count[0] = 0; + + String res = callServlet(); + + assertThat(res, containsString("# TYPE zk_test_namespace_cc summary")); + assertThat(res, CoreMatchers.containsString("zk_test_namespace_cc_sum 20.0")); + assertThat(res, CoreMatchers.containsString("zk_test_namespace_cc_count 2.0")); + assertThat(res, CoreMatchers.containsString("zk_test_namespace_cc{quantile=\"0.5\",} 10.0")); + } + private void validateWithDump(final Map expectedMetrics) { final Map returnedMetrics = new HashMap<>(); provider.dump(returnedMetrics::put);