Fix failing tests due to extended exemplars

Micrometer introduced extended exemplars functionality that adds
exemplars to _count too not only to histogram buckets,
see: https://github.com/micrometer-metrics/micrometer/pull/3996
Because of this, some verifications should be changed.
pull/37013/head
Jonatan Ivanov 1 year ago committed by Stephane Nicoll
parent 73874911ad
commit a3f37089db

@ -16,6 +16,10 @@
package org.springframework.boot.actuate.autoconfigure.tracing.prometheus; package org.springframework.boot.actuate.autoconfigure.tracing.prometheus;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import io.micrometer.observation.Observation; import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.ObservationRegistry;
import io.micrometer.prometheus.PrometheusMeterRegistry; import io.micrometer.prometheus.PrometheusMeterRegistry;
@ -33,6 +37,7 @@ import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
@ -44,6 +49,12 @@ import static org.mockito.Mockito.mock;
*/ */
class PrometheusExemplarsAutoConfigurationTests { class PrometheusExemplarsAutoConfigurationTests {
private static final Pattern BUCKET_TRACE_INFO_PATTERN = Pattern.compile(
"^test_observation_seconds_bucket\\{error=\"none\",le=\".+\"} 1.0 # \\{span_id=\"(\\p{XDigit}+)\",trace_id=\"(\\p{XDigit}+)\"} .+$");
private static final Pattern COUNTER_TRACE_INFO_PATTERN = Pattern.compile(
"^test_observation_seconds_count\\{error=\"none\"} 1.0 # \\{span_id=\"(\\p{XDigit}+)\",trace_id=\"(\\p{XDigit}+)\"} .+$");
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withPropertyValues("management.tracing.sampling.probability=1.0", .withPropertyValues("management.tracing.sampling.probability=1.0",
"management.metrics.distribution.percentiles-histogram.all=true") "management.metrics.distribution.percentiles-histogram.all=true")
@ -80,9 +91,27 @@ class PrometheusExemplarsAutoConfigurationTests {
Observation.start("test.observation", observationRegistry).stop(); Observation.start("test.observation", observationRegistry).stop();
PrometheusMeterRegistry prometheusMeterRegistry = context.getBean(PrometheusMeterRegistry.class); PrometheusMeterRegistry prometheusMeterRegistry = context.getBean(PrometheusMeterRegistry.class);
String openMetricsOutput = prometheusMeterRegistry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100); String openMetricsOutput = prometheusMeterRegistry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100);
assertThat(openMetricsOutput).contains("test_observation_seconds_bucket")
.containsOnlyOnce("trace_id=") assertThat(openMetricsOutput).contains("test_observation_seconds_bucket");
.containsOnlyOnce("span_id="); assertThat(openMetricsOutput).containsOnlyOnce("test_observation_seconds_count");
assertThat(StringUtils.countOccurrencesOf(openMetricsOutput, "span_id")).isEqualTo(2);
assertThat(StringUtils.countOccurrencesOf(openMetricsOutput, "trace_id")).isEqualTo(2);
Optional<TraceInfo> bucketTraceInfo = openMetricsOutput.lines()
.filter((line) -> line.contains("test_observation_seconds_bucket") && line.contains("span_id"))
.map(BUCKET_TRACE_INFO_PATTERN::matcher)
.flatMap(Matcher::results)
.map((matchResult) -> new TraceInfo(matchResult.group(2), matchResult.group(1)))
.findFirst();
Optional<TraceInfo> counterTraceInfo = openMetricsOutput.lines()
.filter((line) -> line.contains("test_observation_seconds_count") && line.contains("span_id"))
.map(COUNTER_TRACE_INFO_PATTERN::matcher)
.flatMap(Matcher::results)
.map((matchResult) -> new TraceInfo(matchResult.group(2), matchResult.group(1)))
.findFirst();
assertThat(bucketTraceInfo).isNotEmpty().contains(counterTraceInfo.orElse(null));
}); });
} }
@ -98,4 +127,7 @@ class PrometheusExemplarsAutoConfigurationTests {
} }
private record TraceInfo(String traceId, String spanId) {
}
} }

Loading…
Cancel
Save