Skip to content

Possible regression in 4.0.0-RC1 - tries to publish OTLP metrics #47806

@gatisnolv

Description

@gatisnolv

This is potentially a duplicate of #47785, though not sure.

Up until and including 4.0.0-M3, when running a test, Spring Boot did not automatically try to publish OTLP metrics. However on 4.0.0-RC1 it tries to do that:

2025-10-26T21:58:31.722+02:00  WARN 15263 --- [ionShutdownHook] [                                                 ] i.m.registry.otlp.OtlpMeterRegistry      : Failed to publish metrics to OTLP receiver (context: url=http://localhost:4318/v1/metrics, resource-attributes={service.name=unknown_service})
java.lang.Exception: java.net.ConnectException: Connection refused
	at io.micrometer.registry.otlp.OtlpHttpMetricsSender.send(OtlpHttpMetricsSender.java:61) ~[micrometer-registry-otlp-1.16.0-RC1.jar:1.16.0-RC1]
	at io.micrometer.registry.otlp.OtlpMeterRegistry.publish(OtlpMeterRegistry.java:190) ~[micrometer-registry-otlp-1.16.0-RC1.jar:1.16.0-RC1]
	at io.micrometer.core.instrument.push.PushMeterRegistry.publishSafelyOrSkipIfInProgress(PushMeterRegistry.java:63) ~[micrometer-core-1.16.0-RC1.jar:1.16.0-RC1]
	at io.micrometer.core.instrument.push.PushMeterRegistry.close(PushMeterRegistry.java:143) ~[micrometer-core-1.16.0-RC1.jar:1.16.0-RC1]
	at io.micrometer.registry.otlp.OtlpMeterRegistry.close(OtlpMeterRegistry.java:305) ~[micrometer-registry-otlp-1.16.0-RC1.jar:1.16.0-RC1]
	at org.springframework.boot.micrometer.metrics.autoconfigure.MetricsAutoConfiguration$MeterRegistryCloser.onApplicationEvent(MetricsAutoConfiguration.java:113) ~[spring-boot-micrometer-metrics-4.0.0-RC1.jar:4.0.0-RC1]
	at org.springframework.boot.micrometer.metrics.autoconfigure.MetricsAutoConfiguration$MeterRegistryCloser.onApplicationEvent(MetricsAutoConfiguration.java:101) ~[spring-boot-micrometer-metrics-4.0.0-RC1.jar:4.0.0-RC1]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:180) ~[spring-context-7.0.0-RC2.jar:7.0.0-RC2]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:173) ~[spring-context-7.0.0-RC2.jar:7.0.0-RC2]
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:151) ~[spring-context-7.0.0-RC2.jar:7.0.0-RC2]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:447) ~[spring-context-7.0.0-RC2.jar:7.0.0-RC2]
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:380) ~[spring-context-7.0.0-RC2.jar:7.0.0-RC2]
	at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1159) ~[spring-context-7.0.0-RC2.jar:7.0.0-RC2]
	at org.springframework.boot.web.server.reactive.context.ReactiveWebServerApplicationContext.doClose(ReactiveWebServerApplicationContext.java:158) ~[spring-boot-web-server-4.0.0-RC1.jar:4.0.0-RC1]
	at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1122) ~[spring-context-7.0.0-RC2.jar:7.0.0-RC2]
	at org.springframework.boot.SpringApplicationShutdownHook.closeAndWait(SpringApplicationShutdownHook.java:147) ~[spring-boot-4.0.0-RC1.jar:4.0.0-RC1]
	at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
	at org.springframework.boot.SpringApplicationShutdownHook.run(SpringApplicationShutdownHook.java:116) ~[spring-boot-4.0.0-RC1.jar:4.0.0-RC1]
	at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
Caused by: java.net.ConnectException: Connection refused
	at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
	at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:682) ~[na:na]
	at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) ~[na:na]
	at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:592) ~[na:na]
	at java.base/java.net.Socket.connect(Socket.java:751) ~[na:na]
	at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:178) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:531) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:636) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:280) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:386) ~[na:na]
	at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:408) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1319) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1252) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1138) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:1067) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1461) ~[na:na]
	at java.base/sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1432) ~[na:na]
	at io.micrometer.core.ipc.http.HttpUrlConnectionSender.send(HttpUrlConnectionSender.java:99) ~[micrometer-core-1.16.0-RC1.jar:1.16.0-RC1]
	at io.micrometer.core.ipc.http.HttpSender$Request$Builder.send(HttpSender.java:306) ~[micrometer-core-1.16.0-RC1.jar:1.16.0-RC1]
	at io.micrometer.registry.otlp.OtlpHttpMetricsSender.send(OtlpHttpMetricsSender.java:58) ~[micrometer-registry-otlp-1.16.0-RC1.jar:1.16.0-RC1]
	... 18 common frames omitted

I have minimal examples with M3 and RC1.

Turning on debug: true I observe a difference with management.defaults.metrics.export.enabled, on M3:

OtlpMetricsExportAutoConfiguration:
      Did not match:
         - @ConditionalOnEnabledMetricsExport management.defaults.metrics.export.enabled is considered false (OnMetricsExportEnabledCondition)
      Matched:
         - @ConditionalOnClass found required classes 'io.micrometer.registry.otlp.OtlpMeterRegistry', 'org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetryProperties' (OnClassCondition)

And on RC1:

OtlpMetricsExportAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'io.micrometer.registry.otlp.OtlpMeterRegistry', 'org.springframework.boot.opentelemetry.autoconfigure.OpenTelemetryProperties' (OnClassCondition)
      - @ConditionalOnEnabledMetricsExport management.defaults.metrics.export.enabled is considered true (OnMetricsExportEnabledCondition)
      - @ConditionalOnBean (types: io.micrometer.core.instrument.Clock; SearchStrategy: all) found bean 'micrometerClock' (OnBeanCondition)

I was not able to get further than this, as I don't see the property having changed between the two releases.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions