diff --git a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/StatefulMetric.java b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/StatefulMetric.java index d7fb3afd0..87e8429f1 100644 --- a/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/StatefulMetric.java +++ b/prometheus-metrics-core/src/main/java/io/prometheus/metrics/core/metrics/StatefulMetric.java @@ -112,7 +112,20 @@ public D labelValues(String... labelValues) { "Expected " + labelNames.length + " label values, but got " + labelValues.length + "."); } } - return data.computeIfAbsent(Arrays.asList(labelValues), l -> newDataPoint()); + return data.computeIfAbsent( + Arrays.asList(labelValues), + l -> { + for (int i = 0; i < l.size(); i++) { + if (l.get(i) == null) { + throw new IllegalArgumentException( + "null label value for metric " + + getMetadata().getName() + + " and label " + + labelNames[i]); + } + } + return newDataPoint(); + }); } /** diff --git a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/StatefulMetricTest.java b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/StatefulMetricTest.java index 1120b06a3..e12618436 100644 --- a/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/StatefulMetricTest.java +++ b/prometheus-metrics-core/src/test/java/io/prometheus/metrics/core/metrics/StatefulMetricTest.java @@ -1,6 +1,7 @@ package io.prometheus.metrics.core.metrics; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import java.lang.reflect.Field; import java.util.Map; @@ -67,4 +68,12 @@ public void testClearNoLabels() { assertThat(counter.collect().getDataPoints()).hasSize(1); assertThat(counter.collect().getDataPoints().get(0).getValue()).isEqualTo(1.0); } + + @Test + public void testNullLabel() { + Counter counter = Counter.builder().name("test").labelNames("l1", "l2").build(); + assertThatExceptionOfType(IllegalArgumentException.class) + .isThrownBy(() -> counter.labelValues("l1", null)) + .withMessage("null label value for metric test and label l2"); + } }