Skip to content

Commit

Permalink
Fix failing tests due to extended exemplars
Browse files Browse the repository at this point in the history
Micrometer introduced extended exemplars functionality that adds
exemplars to _count too not only to histogram buckets,
see: micrometer-metrics/micrometer#3996
Because of this, some verifications should be changed.
  • Loading branch information
jonatan-ivanov committed Aug 15, 2023
1 parent 39688a4 commit a4aefdd
Showing 1 changed file with 35 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@

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.ObservationRegistry;
import io.micrometer.prometheus.PrometheusMeterRegistry;
Expand All @@ -34,6 +38,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import static org.apache.commons.lang3.StringUtils.countMatches;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;

Expand All @@ -44,6 +49,12 @@
*/
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()
.withPropertyValues("management.tracing.sampling.probability=1.0",
"management.metrics.distribution.percentiles-histogram.all=true")
Expand Down Expand Up @@ -80,9 +91,27 @@ void prometheusOpenMetricsOutputShouldContainExemplars() {
Observation.start("test.observation", observationRegistry).stop();
PrometheusMeterRegistry prometheusMeterRegistry = context.getBean(PrometheusMeterRegistry.class);
String openMetricsOutput = prometheusMeterRegistry.scrape(TextFormat.CONTENT_TYPE_OPENMETRICS_100);
assertThat(openMetricsOutput).contains("test_observation_seconds_bucket")
.containsOnlyOnce("trace_id=")
.containsOnlyOnce("span_id=");

assertThat(openMetricsOutput).contains("test_observation_seconds_bucket");
assertThat(openMetricsOutput).containsOnlyOnce("test_observation_seconds_count");
assertThat(countMatches(openMetricsOutput, "span_id")).isEqualTo(2);
assertThat(countMatches(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));
});
}

Expand All @@ -98,4 +127,7 @@ SpanContextSupplier customSpanContextSupplier() {

}

private record TraceInfo(String traceId, String spanId) {
}

}

0 comments on commit a4aefdd

Please sign in to comment.