From 188860f7305fe7f3d003f6d034bda684bace70a7 Mon Sep 17 00:00:00 2001 From: Jonatan Ivanov Date: Fri, 14 Aug 2026 02:01:18 +0200 Subject: [PATCH] Adapt to changes in micrometer snapshots MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://github.com/micrometer-metrics/micrometer/issues/2297 Co-authored-by: Stéphane Nicoll --- ...lpMetricsExportAutoConfigurationTests.java | 16 ++------ .../OtlpExemplarsAutoConfigurationTests.java | 40 ++++++++++--------- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/otlp/OtlpMetricsExportAutoConfigurationTests.java b/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/otlp/OtlpMetricsExportAutoConfigurationTests.java index f4c267b8f19..49283bbb74d 100644 --- a/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/otlp/OtlpMetricsExportAutoConfigurationTests.java +++ b/module/spring-boot-micrometer-metrics/src/test/java/org/springframework/boot/micrometer/metrics/autoconfigure/export/otlp/OtlpMetricsExportAutoConfigurationTests.java @@ -151,10 +151,8 @@ class OtlpMetricsExportAutoConfigurationTests { @Test void allowsCustomMetricsSenderToBeUsed() { this.contextRunner.withUserConfiguration(BaseConfiguration.class, CustomMetricsSenderConfiguration.class) - .run((context) -> { - assertHasCustomMetricsSender(context); - assertThat(context).doesNotHaveBean(OtlpHttpMetricsSender.class); - }); + .run((context) -> assertThat(context).hasSingleBean(OtlpMetricsSender.class) + .doesNotHaveBean(OtlpHttpMetricsSender.class)); } @Test @@ -169,7 +167,8 @@ class OtlpMetricsExportAutoConfigurationTests { void allowsCustomMetricsSenderToBeUsedWithVirtualThreads() { this.contextRunner.withUserConfiguration(BaseConfiguration.class, CustomMetricsSenderConfiguration.class) .withPropertyValues("spring.threads.virtual.enabled=true") - .run(this::assertHasCustomMetricsSender); + .run((context) -> assertThat(context).hasSingleBean(OtlpMetricsSender.class) + .doesNotHaveBean(OtlpHttpMetricsSender.class)); } @Test @@ -274,13 +273,6 @@ class OtlpMetricsExportAutoConfigurationTests { return (HttpClient) httpClient; } - private void assertHasCustomMetricsSender(AssertableApplicationContext context) { - assertThat(context).hasSingleBean(OtlpMeterRegistry.class); - OtlpMeterRegistry registry = context.getBean(OtlpMeterRegistry.class); - assertThat(registry).extracting("metricsSender") - .satisfies((sender) -> assertThat(sender).isSameAs(CustomMetricsSenderConfiguration.customMetricsSender)); - } - private void assertHasCustomExemplarContextProvider(AssertableApplicationContext context) { assertThat(context).hasSingleBean(OtlpMeterRegistry.class); OtlpMeterRegistry registry = context.getBean(OtlpMeterRegistry.class); diff --git a/module/spring-boot-micrometer-tracing-brave/src/test/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/OtlpExemplarsAutoConfigurationTests.java b/module/spring-boot-micrometer-tracing-brave/src/test/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/OtlpExemplarsAutoConfigurationTests.java index 2bd4bb96d49..705d028527a 100644 --- a/module/spring-boot-micrometer-tracing-brave/src/test/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/OtlpExemplarsAutoConfigurationTests.java +++ b/module/spring-boot-micrometer-tracing-brave/src/test/java/org/springframework/boot/micrometer/tracing/brave/autoconfigure/OtlpExemplarsAutoConfigurationTests.java @@ -16,7 +16,10 @@ package org.springframework.boot.micrometer.tracing.brave.autoconfigure; +import java.util.List; + import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.observation.DefaultMeterObservationHandler; import io.micrometer.observation.Observation; import io.micrometer.observation.Observation.Context; @@ -24,6 +27,7 @@ import io.micrometer.observation.ObservationRegistry; import io.micrometer.registry.otlp.ExemplarContextProvider; import io.micrometer.registry.otlp.OtlpMeterRegistry; import io.micrometer.registry.otlp.OtlpMetricsSender; +import io.micrometer.registry.otlp.shaded.io.opentelemetry.sdk.metrics.data.DoubleExemplarData; import io.micrometer.tracing.Tracer; import io.micrometer.tracing.handler.TracingAwareMeterObservationHandler; import org.junit.jupiter.api.Test; @@ -38,6 +42,7 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -85,12 +90,15 @@ class OtlpExemplarsAutoConfigurationTests { ObservationRegistry observationRegistry = context.getBean(ObservationRegistry.class); Observation.start("test.observation", observationRegistry).stop(); OtlpMeterRegistry otlpMeterRegistry = context.getBean(OtlpMeterRegistry.class); - TestOtlpMetricsSender metricsSender = context.getBean(TestOtlpMetricsSender.class); + Timer timer = otlpMeterRegistry.get("test.observation").timer(); otlpMeterRegistry.close(); - assertThat(metricsSender.getOtlpRequest()).containsOnlyOnce("name: \"test.observation\"") - .containsOnlyOnce("exemplars") - .containsOnlyOnce("span_id") - .containsOnlyOnce("trace_id"); + + List exemplars = ReflectionTestUtils.invokeMethod(timer, "exemplars"); + assertThat(exemplars).hasSize(1).first().satisfies((exemplar) -> { + assertThat(exemplar).isNotNull(); + assertThat(exemplar.getSpanContext().getSpanId()).isNotEmpty(); + assertThat(exemplar.getSpanContext().getTraceId()).isNotEmpty(); + }); }); } @@ -104,12 +112,15 @@ class OtlpExemplarsAutoConfigurationTests { ObservationRegistry observationRegistry = context.getBean(ObservationRegistry.class); Observation.start("test.observation", observationRegistry).stop(); OtlpMeterRegistry otlpMeterRegistry = context.getBean(OtlpMeterRegistry.class); - TestOtlpMetricsSender metricsSender = context.getBean(TestOtlpMetricsSender.class); + Timer timer = otlpMeterRegistry.get("test.observation").timer(); otlpMeterRegistry.close(); - assertThat(metricsSender.getOtlpRequest()).containsOnlyOnce("name: \"test.observation\"") - .containsOnlyOnce("exemplars") - .containsOnlyOnce("span_id") - .containsOnlyOnce("trace_id"); + + List exemplars = ReflectionTestUtils.invokeMethod(timer, "exemplars"); + assertThat(exemplars).hasSize(1).first().satisfies((exemplar) -> { + assertThat(exemplar).isNotNull(); + assertThat(exemplar.getSpanContext().getSpanId()).isNotEmpty(); + assertThat(exemplar.getSpanContext().getTraceId()).isNotEmpty(); + }); }); } @@ -151,15 +162,8 @@ class OtlpExemplarsAutoConfigurationTests { static class TestOtlpMetricsSender implements OtlpMetricsSender { - private String request = ""; - @Override - public void send(Request request) throws Exception { - this.request = request.toString(); - } - - String getOtlpRequest() { - return this.request; + public void send(Request ignored) { } }