Fix native-image StatsD publishing and logback metrics#1148
Conversation
Co-Authored-By: Codex with GPT-5 <codex@openai.com>
There was a problem hiding this comment.
Pull request overview
This PR addresses GraalVM native-image reliability issues for StatsD publishing and fixes a logback metrics recursion risk by introducing a native-image-specific UDP line sink plus an async-safe LogbackMetrics implementation.
Changes:
- Add a native-image UDP StatsD line sink and GraalVM native-image metadata/reflection hints for shaded Netty classes.
- Switch the LogbackMetrics binder to an async-safe implementation using
LongAdder+FunctionCountervia a TurboFilter. - Add regression tests covering native-image StatsD behavior and the logback recursion scenario.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| micrometer-registry-statsd/src/main/java/io/micronaut/configuration/metrics/micrometer/statsd/StatsdMeterRegistryFactory.java | Uses the native-image UDP sink when available; registers native-image reflection hints. |
| micrometer-registry-statsd/src/main/java/io/micronaut/configuration/metrics/micrometer/statsd/NativeImageUdpStatsdLineSink.java | New native-image-friendly UDP sender with buffering/flush scheduling. |
| micrometer-registry-statsd/src/main/java/io/micronaut/configuration/metrics/micrometer/statsd/NativeImageStatsdCondition.java | Enables the workaround only for native-image + UDP protocol. |
| micrometer-registry-statsd/src/main/resources/META-INF/native-image/io.micronaut.micrometer/micronaut-micrometer-registry-statsd/native-image.properties | Adds native-image runtime init args for shaded Netty classes. |
| micrometer-registry-statsd/src/test/groovy/.../StatsdNativeImageMetadataSpec.groovy | Verifies shaded native-image properties and reflection hints are present. |
| micrometer-registry-statsd/src/test/groovy/.../NativeImageUdpStatsdLineSinkSpec.groovy | Tests bean condition + UDP send behavior for the new sink. |
| micrometer-core/src/main/java/io/micronaut/configuration/metrics/binder/logging/MicronautLogbackMetrics.java | New async-safe LogbackMetrics variant using TurboFilter + LongAdder. |
| micrometer-core/src/main/java/io/micronaut/configuration/metrics/binder/logging/LogbackMeterRegistryBinderFactory.java | Switches binder to return MicronautLogbackMetrics. |
| micrometer-core/src/test/groovy/.../LogbackMeterRegistryBinderFactorySpec.groovy | Regression test guarding against counter/log recursion. |
Co-Authored-By: Codex with GPT-5 <codex@openai.com>
There was a problem hiding this comment.
Pull request overview
This PR addresses StatsD metric publishing failures in GraalVM native images by introducing a native-image-specific UDP line sink and adding native-image metadata for shaded Netty, and it hardens the Logback metrics binder against recursion when logging occurs during metric emission.
Changes:
- Add a native-image-only StatsD UDP
lineSinkimplementation and wire it into the StatsD registry factory when running as a native executable. - Package GraalVM native-image metadata and add reflection hints for shaded Netty/JCTools classes used by the StatsD registry in native images.
- Replace the default Logback binder with an async-safe implementation and add regression tests for both the native-image StatsD path and the logback recursion scenario.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| micrometer-registry-statsd/src/test/groovy/io/micronaut/configuration/metrics/micrometer/statsd/StatsdNativeImageMetadataSpec.groovy | Adds regression coverage for packaged native-image properties and reflection hints. |
| micrometer-registry-statsd/src/test/groovy/io/micronaut/configuration/metrics/micrometer/statsd/NativeImageUdpStatsdLineSinkSpec.groovy | Adds tests for sink bean conditions, UDP send behavior, and concurrency characteristics. |
| micrometer-registry-statsd/src/main/resources/META-INF/native-image/io.micronaut.micrometer/micronaut-micrometer-registry-statsd/native-image.properties | Adds GraalVM runtime-initialization metadata for shaded Netty used by StatsD in native images. |
| micrometer-registry-statsd/src/main/java/io/micronaut/configuration/metrics/micrometer/statsd/StatsdMeterRegistryFactory.java | Wires the optional native-image UDP sink into StatsD registry creation; adds TypeHint for shaded dependencies. |
| micrometer-registry-statsd/src/main/java/io/micronaut/configuration/metrics/micrometer/statsd/NativeImageUdpStatsdLineSink.java | Introduces the native-image-friendly UDP line sink with buffering and scheduled flush. |
| micrometer-registry-statsd/src/main/java/io/micronaut/configuration/metrics/micrometer/statsd/NativeImageStatsdCondition.java | Adds a condition to activate the workaround only under native-image + UDP. |
| micrometer-core/src/test/groovy/io/micronaut/configuration/metrics/binder/logging/LogbackMeterRegistryBinderFactorySpec.groovy | Adds regression tests for logback recursion avoidance and proper cleanup. |
| micrometer-core/src/main/java/io/micronaut/configuration/metrics/binder/logging/MicronautLogbackMetrics.java | Adds an async-safe Logback metrics binder using LongAdder + FunctionCounter. |
| micrometer-core/src/main/java/io/micronaut/configuration/metrics/binder/logging/LogbackMeterRegistryBinderFactory.java | Switches the produced binder from Micrometer’s LogbackMetrics to MicronautLogbackMetrics. |
Co-Authored-By: Codex with GPT-5 <codex@openai.com>
|



Summary
Testing
./gradlew :micronaut-micrometer-core:test --tests 'io.micronaut.configuration.metrics.binder.logging.LogbackMeterRegistryBinderFactorySpec'./gradlew :micronaut-micrometer-registry-statsd:test --tests 'io.micronaut.configuration.metrics.micrometer.statsd.NativeImageUdpStatsdLineSinkSpec'./gradlew spotlessCheck./gradlew --no-daemon -Dorg.gradle.workers.max=1 :micronaut-micrometer-core:test./gradlew :micronaut-micrometer-registry-statsd:testResolves #1062