Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unable to load MacOSDnsServerAddressStreamProvider on Apple Silicon with statsd meter registries #3066

Closed
simondemartini opened this issue Mar 10, 2022 · 7 comments · Fixed by #3139
Assignees
Labels
enhancement A general enhancement registry: statsd A StatsD Registry related issue
Milestone

Comments

@simondemartini
Copy link
Contributor

Describe the bug
When running a statsd meter registry on an Apple Silicon based machine with native (arm64) java, Micrometer logs the following error:

ERROR io.micrometer.shaded.io.netty.resolver.dns.DnsServerAddressStreamProviders - Unable to load io.micrometer.shaded.io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS.

Environment

  • Micrometer version: 1.8.3
  • Micrometer registry: statsd
  • OS: macOS
  • CPU: Apple Silicon M1 (arm64)
  • Java version: 11.0.14 (Zulu, arm64 native)

To Reproduce
How to reproduce the bug:
Launch a Spring Boot application with a statsd meter registry on an Apple Silicon based computer. The error and full stack trace will be logged like the following:

1398 [main] ERROR io.micrometer.shaded.io.netty.resolver.dns.DnsServerAddressStreamProviders - Unable to load io.micrometer.shaded.io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolutions on MacOS.
java.lang.reflect.InvocationTargetException: null
	at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]
	at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:?]
	at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[?:?]
	at io.micrometer.shaded.io.netty.resolver.dns.DnsServerAddressStreamProviders.<clinit>(DnsServerAddressStreamProviders.java:64) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.io.netty.resolver.dns.DnsNameResolverBuilder.<init>(DnsNameResolverBuilder.java:60) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.netty.transport.NameResolverProvider.newNameResolverGroup(NameResolverProvider.java:479) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.netty.udp.UdpResources.getOrCreateDefaultResolver(UdpResources.java:242) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.netty.udp.UdpClientConfig.defaultAddressResolverGroup(UdpClientConfig.java:105) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.netty.transport.ClientTransportConfig.resolverInternal(ClientTransportConfig.java:224) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.netty.transport.ClientTransport.connect(ClientTransport.java:59) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.netty.udp.UdpClient.connect(UdpClient.java:87) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.statsd.StatsdMeterRegistry.lambda$connectAndSubscribe$13(StatsdMeterRegistry.java:284) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.core.publisher.FluxRetryWhen.subscribe(FluxRetryWhen.java:77) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.core.publisher.MonoRetryWhen.subscribeOrReturn(MonoRetryWhen.java:46) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.core.publisher.Mono.subscribe(Mono.java:4385) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.core.publisher.Mono.subscribeWith(Mono.java:4515) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.core.publisher.Mono.subscribe(Mono.java:4371) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.core.publisher.Mono.subscribe(Mono.java:4307) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.reactor.core.publisher.Mono.subscribe(Mono.java:4254) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.statsd.StatsdMeterRegistry.retryReplaceClient(StatsdMeterRegistry.java:293) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.statsd.StatsdMeterRegistry.connectAndSubscribe(StatsdMeterRegistry.java:282) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.statsd.StatsdMeterRegistry.prepareUdpClient(StatsdMeterRegistry.java:251) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.statsd.StatsdMeterRegistry.start(StatsdMeterRegistry.java:225) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.statsd.StatsdMeterRegistry.<init>(StatsdMeterRegistry.java:155) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.statsd.StatsdMeterRegistry.<init>(StatsdMeterRegistry.java:78) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.statsd.StatsdMeterRegistry$Builder.build(StatsdMeterRegistry.java:548) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at 
        ...
Caused by: java.lang.UnsatisfiedLinkError: 'io.micrometer.shaded.io.netty.resolver.dns.macos.DnsResolver[] io.micrometer.shaded.io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.resolvers()'
	at io.micrometer.shaded.io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.resolvers(Native Method) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.retrieveCurrentMappings(MacOSDnsServerAddressStreamProvider.java:127) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	at io.micrometer.shaded.io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider.<init>(MacOSDnsServerAddressStreamProvider.java:123) ~[micrometer-registry-statsd-1.8.3.jar:1.8.3]
	... 114 more

Expected behavior
The application should be able to load this class or not log the error if it's not significant.

Additional context
This appears to be related to netty/netty#11020 but since Micrometer includes a shaded version of Netty, this can't be fixed by telling applications to include that suggested dependency in the fix.

@shakuzen
Copy link
Member

For clarification and prioritization: is running on Apple silicon for development purposes and not production? I recently got a machine with Apple silicon, so I can test things out now. I'm able to see the error log as well, though it seems metrics still make it to a locally running statsd instance.

@shakuzen shakuzen added the registry: statsd A StatsD Registry related issue label Mar 11, 2022
@shakuzen shakuzen self-assigned this Mar 11, 2022
@shakuzen shakuzen added this to the 1.7.x milestone Mar 11, 2022
@simondemartini
Copy link
Contributor Author

Yeah so far this is just for development purposes

@shakuzen shakuzen modified the milestones: 1.7.x, 1.8.x May 11, 2022
@shakuzen shakuzen linked a pull request Jun 10, 2022 that will close this issue
@shakuzen shakuzen modified the milestones: 1.8.x, 1.10.0-M3 Jun 10, 2022
@shakuzen shakuzen added the enhancement A general enhancement label Jun 10, 2022
shakuzen pushed a commit that referenced this issue Jun 10, 2022
Also adds dependency management of netty dependencies using the netty-bom.
This avoids an error being logged on Apple silicon when Netty tries to load the native DNS resolver.

Resolves gh-3066
@ariv803
Copy link

ariv803 commented Jul 27, 2022

I am getting this error when using version 1.9.2. Is the fix only in 1.10.0-M3 ? I am trying to use the version compatible with the latest spring version according to this: https://docs.spring.io/spring-boot/docs/2.7.2/reference/html/dependency-versions.html#appendix.dependency-versions
Also 1.10.0-M3 gives me an error:
Caused by: java.lang.ClassNotFoundException io.micrometer.common.util.internal.logging.WarnThenDebugLogger

@shakuzen
Copy link
Member

The change that resolved this is not included in 1.9.x releases. Since the error log is generally only expected to happen on developer machines and it does not affect functionality, the decision was made to not add risk to a patch release by including the changes.

Also 1.10.0-M3 gives me an error

You would need to use the version of Spring Boot compatible with Micrometer 1.10.0-M3 to avoid that error.

@gkonovalov
Copy link

Hi @shakuzen
Thank you so much for the Micrometer library!
I wonder if you are planning to add native (aarch_64) Netty DNS resolver in the next Micrometer release or provide a way how we can add native Netty DNS resolver as a separate Gradle dependency?

@shakuzen
Copy link
Member

shakuzen commented Nov 2, 2022

@gkonovalov the resolution of this issue was to add the aarch64 macos Netty DNS resolver dependency. You can try out 1.10.0-RC1 or the latest snapshots that contain that. The 1.10.0 GA is planned for next week. Let us know if the issue is not fixed for you in those versions.

@gkonovalov
Copy link

Thank you so much!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement A general enhancement registry: statsd A StatsD Registry related issue
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants