Giter Club home page Giter Club logo

micronaut-discovery-client's Introduction

Micronaut Discovery Client

Maven Central Build Status Revved up by Develocity

This module integrates Micronaut with Service Discovery and Distributed Configuration systems.

The implementation currently includes Service Discovery support for:

As well as Distributed Configuration support for:

Documentation

See the Documentation for more information.

See the Snapshot Documentation for the current development docs.

Snapshots and Releases

Snapshots are automatically published to Sonatype Snapshots using Github Actions.

See the documentation in the Micronaut Docs for how to configure your build to use snapshots.

Releases are published to JCenter and Maven Central via Github Actions.

Releases are completely automated. To perform a release use the following steps:

micronaut-discovery-client's People

Contributors

alvarosanchez avatar atrzcinski avatar croudet avatar dependabot-preview[bot] avatar dependabot[bot] avatar donbeave avatar fnonnenmacher avatar frogdevelopper avatar gavrilovsv avatar graemerocher avatar ilopmar avatar jameskleeh avatar lightoze avatar micronaut-build avatar musketyr avatar n0tl3ss avatar pkostrzewa avatar recursivecodes avatar renovate[bot] avatar rvanderwerf avatar scoquelin avatar sdelamo avatar ssouris avatar svishnyakoff avatar thiagolocatelli avatar timyates avatar wetted avatar xoiram avatar zacharyklein avatar zendern avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

micronaut-discovery-client's Issues

Spring Config Client running into CodecException when used with Docker Native Image

Expected Behavior

The spring cloud config client should be able to read and deserialize the JSON response from config server into a ConfigServerResponse instance. When this happens, a log entry similar to the one below can be seen:

Resolved XX configuration sources from client: compositeConfigurationClient(spring-cloud-config-client)

Actual Behaviour

When running the docker-native image, a io.micronaut.http.codec.CodecException is thrown with cause Cannot construct instance of io.micronaut.discovery.spring.config.client.ConfigServerResponse (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator).

Stack trace
  Error starting Micronaut server: Error reading distributed configuration from Spring Cloud: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.spring.config.client.ConfigServerResponse]: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
   at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
  io.micronaut.context.exceptions.ConfigurationException: Error reading distributed configuration from Spring Cloud: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.spring.config.client.ConfigServerResponse]: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
   at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
          at io.micronaut.discovery.spring.config.SpringCloudConfigurationClient.lambda$getPropertySources$0(SpringCloudConfigurationClient.java:122)
          at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
          at reactor.core.publisher.FluxMap$MapSubscriber.onError(FluxMap.java:132)
          at reactor.core.publisher.FluxSwitchMap$SwitchMapMain.checkTerminated(FluxSwitchMap.java:391)
          at reactor.core.publisher.FluxSwitchMap$SwitchMapMain.drain(FluxSwitchMap.java:338)
          at reactor.core.publisher.FluxSwitchMap$SwitchMapMain.innerError(FluxSwitchMap.java:424)
          at reactor.core.publisher.FluxSwitchMap$SwitchMapInner.onError(FluxSwitchMap.java:517)
          at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:106)
          at reactor.core.publisher.Operators.error(Operators.java:198)
          at reactor.core.publisher.FluxError.subscribe(FluxError.java:43)
          at reactor.core.publisher.Flux.subscribe(Flux.java:8469)
          at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103)
          at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
          at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.onError(FluxTimeout.java:219)
          at reactor.core.publisher.FluxCreate$BaseSink.error(FluxCreate.java:453)
          at reactor.core.publisher.FluxCreate$SerializedFluxSink.drainLoop(FluxCreate.java:230)
          at reactor.core.publisher.FluxCreate$SerializedFluxSink.drain(FluxCreate.java:206)
          at reactor.core.publisher.FluxCreate$SerializedFluxSink.error(FluxCreate.java:182)
          at io.micronaut.http.client.netty.DefaultHttpClient$11.channelReadInstrumented(DefaultHttpClient.java:2503)
          at io.micronaut.http.client.netty.DefaultHttpClient$11.channelReadInstrumented(DefaultHttpClient.java:2334)
          at io.micronaut.http.client.netty.DefaultHttpClient$SimpleChannelInboundHandlerInstrumented.channelRead0(DefaultHttpClient.java:3089)
          at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
          at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
          at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:214)
          at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:189)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
          at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
          at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
          at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
          at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
          at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
          at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
          at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327)
          at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299)
          at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
          at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
          at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
          at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
          at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
          at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
          at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
          at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
          at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
          at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
          at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
          at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
          at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
          at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
          at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
          at java.lang.Thread.run(Thread.java:829)
          at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:596)
          at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
          Suppressed: java.lang.Exception: #block terminated with an error
                  at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
                  at reactor.core.publisher.Mono.block(Mono.java:1707)
                  at io.micronaut.discovery.client.config.DistributedPropertySourceLocator.findPropertySources(DistributedPropertySourceLocator.java:79)
                  at io.micronaut.context.DefaultApplicationContext$RuntimeConfiguredEnvironment.readPropertySourceList(DefaultApplicationContext.java:734)
                  at io.micronaut.context.env.DefaultEnvironment.readPropertySources(DefaultEnvironment.java:408)
                  at io.micronaut.context.env.DefaultEnvironment.start(DefaultEnvironment.java:270)
                  at io.micronaut.context.DefaultApplicationContext$RuntimeConfiguredEnvironment.start(DefaultApplicationContext.java:720)
                  at io.micronaut.context.DefaultApplicationContext$RuntimeConfiguredEnvironment.start(DefaultApplicationContext.java:689)
                  at io.micronaut.context.DefaultApplicationContext.startEnvironment(DefaultApplicationContext.java:230)
                  at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:182)
                  at io.micronaut.runtime.Micronaut.start(Micronaut.java:72)
                  at io.micronaut.runtime.Micronaut.run(Micronaut.java:313)
                  at io.micronaut.runtime.Micronaut.run(Micronaut.java:299)
                  at org.myorg.myapp.staging.Application.main(Application.java:10)
  Caused by: io.micronaut.http.client.exceptions.HttpClientResponseException: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.spring.config.client.ConfigServerResponse]: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
   at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
          at io.micronaut.http.client.netty.DefaultHttpClient$11.channelReadInstrumented(DefaultHttpClient.java:2491)
          ... 45 common frames omitted
  Caused by: io.micronaut.http.codec.CodecException: Error decoding stream for type [class io.micronaut.discovery.spring.config.client.ConfigServerResponse]: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
   at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
          at io.micronaut.json.codec.MapperMediaTypeCodec.decode(MapperMediaTypeCodec.java:192)
          at io.micronaut.http.client.netty.FullNettyClientHttpResponse.convertByteBuf(FullNettyClientHttpResponse.java:279)
          at io.micronaut.http.client.netty.FullNettyClientHttpResponse.lambda$getBody$1(FullNettyClientHttpResponse.java:217)
          at java.util.HashMap.computeIfAbsent(HashMap.java:1134)
          at io.micronaut.http.client.netty.FullNettyClientHttpResponse.getBody(FullNettyClientHttpResponse.java:191)
          at io.micronaut.http.client.netty.FullNettyClientHttpResponse.<init>(FullNettyClientHttpResponse.java:110)
          at io.micronaut.http.client.netty.DefaultHttpClient$11.channelReadInstrumented(DefaultHttpClient.java:2411)
          ... 45 common frames omitted
  Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `io.micronaut.discovery.spring.config.client.ConfigServerResponse` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
   at [Source: (byte[])"{"name":"some-service","profiles":["cloud,staging"],"label":null,"version":"649fa009bd06a9c69c2b5809f2a4bb0559017d6c","state":null,"propertySources":[{"name":"https://git.myorg.com/configuration.git/some-service-staging.yml","source":{"mongodb.uri":"mongodb://template:template@localhost:27017/template110","mongodb.database":"template110"}},{"name":"https://git.myorg.com/configuration.git/application-stag"[truncated 691 bytes]; line: 1, column: 2]
          at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1764)
          at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
          at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1209)
          at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
          at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:362)
          at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)
          at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:322)
          at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
          at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3643)
          at io.micronaut.jackson.databind.JacksonDatabindMapper.readValue(JacksonDatabindMapper.java:119)
          at io.micronaut.json.codec.MapperMediaTypeCodec.decode(MapperMediaTypeCodec.java:189)
          ... 51 common frames omitted

Steps To Reproduce

  • Create application from scratch
  • Enable spring config client
  • Build docker native image - ./gradlew clean dockerBuildNative
  • A container created out of this image should print out the error

Environment Information

  • Operating System: Pop!_OS 20.05 LTS
  • Micronaut Version: 3.3.0
  • JDK Version: OpenJDK 11

Example Application

realbucksavage/mn-native-config-demo

Version

3.4.1

CheckID does not have associated TTL

After updating micronaut to the latest version 2.4.0. Getting an exception as CheckID does not have associated TTL

consul:
  client:
    defaultZone: ${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}
    registration:
      enabled: true

Access any endpoint the error appears

Exeption

14:53:03.304 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 8865ms. Server Running: http://localhost:8080
14:53:03.947 [default-nioEventLoopGroup-1-2] INFO  i.m.d.registration.AutoRegistration - Registered service [fete-bird-apigateway] with Consul
14:53:44.094 [default-nioEventLoopGroup-1-8] ERROR i.m.d.registration.AutoRegistration - Error reporting passing state to Consul: CheckID "service:fete-bird-apigateway:8080" does not have associated TTL
io.micronaut.http.client.exceptions.HttpClientResponseException: CheckID "service:fete-bird-apigateway:8080" does not have associated TTL
	at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2161)
	at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2076)
	at io.micronaut.http.client.netty.DefaultHttpClient$SimpleChannelInboundHandlerInstrumented.channelRead0(DefaultHttpClient.java:2776)
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:193)
	at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:183)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:832)

Consul Service Discovery broken with Consul Server v1.7+

Task List

  • Steps to reproduce provided
  • Stacktrace (if present) provided
  • Example that reproduces the problem uploaded to Github
  • Full description of the issue provided (see below)

Steps to Reproduce

  1. Create project from scratch.
  2. Configure usage of consul service discovery on a Consul v1.7 instance.
  3. Start application.

Expected Behaviour

The log should state some line similar to:
Registered service [<project-name>] with Consul

Actual Behaviour

Log shows error message after a while:

10:56:21.911 [nioEventLoopGroup-1-5] ERROR i.m.d.registration.AutoRegistration - Error occurred during service registration with Consul: Request decode failed: json: unknown field "ID"
io.micronaut.http.client.exceptions.HttpClientResponseException: Request decode failed: json: unknown field "ID"
	at io.micronaut.http.client.DefaultHttpClient$10.channelRead0(DefaultHttpClient.java:1821)
	at io.micronaut.http.client.DefaultHttpClient$10.channelRead0(DefaultHttpClient.java:1739)
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:190)
	at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:185)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295)
	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(Thread.java:748)

Environment Information

  • Operating System: Windows 10 & Ubuntu 18.04
  • Micronaut Version: 1.2.0+ (up to at least 1.3.6)
  • JDK Version: Java 8 & Java 11

This issue seems to be triggered by a major change from 1.6 to 1.7 in Consul server, see https://www.consul.io/docs/upgrading/upgrade-specific#stricter-json-decoding

Microanut service registration for consul and eureka does not startup, will not fully register the service

Expected Behavior

Run the tutorial and demonstrage how sonsul would work.

Actual Behaviour

The application fails with the following stack trace:
/Users/kristianrickert/.sdkman/candidates/java/17.0.5-amzn/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=62002:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/kristianrickert/Downloads/micronaut-microservices-services-discover-consul-gradle-kotlin (1)/bookrecommendation/build/classes/kotlin/main:/Users/kristianrickert/Downloads/micronaut-microservices-services-discover-consul-gradle-kotlin (1)/bookrecommendation/build/generated/ksp/main/classes:/Users/kristianrickert/Downloads/micronaut-microservices-services-discover-consul-gradle-kotlin (1)/bookrecommendation/build/resources/main:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.discovery/micronaut-discovery-client/4.0.1/93edd521ca27ce769f590abc22eac7389df6ad65/micronaut-discovery-client-4.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.kotlin/micronaut-kotlin-runtime/4.0.2/a85061b54a2a7908dbf3a7991af58e7e7846704a/micronaut-kotlin-runtime-4.0.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.reactor/micronaut-reactor-http-client/3.0.2/81d44de5e8cc0bedf6f4b4872022eff4b3505ca0/micronaut-reactor-http-client-3.0.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.reactor/micronaut-reactor/3.0.2/209dc7dc4710e241c048a8bafaaf6b0003b99b40/micronaut-reactor-3.0.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.serde/micronaut-serde-jackson/2.2.4/2c037ddb72942d01cd742424a35ab6699a33c1ff/micronaut-serde-jackson-2.2.4.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-client/4.1.6/991f4f20ccfc135bd369f3a4d1873f7f1dfbec1d/micronaut-http-client-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-retry/4.1.6/3347c66e64e7070eade33dcade17a64806152aae/micronaut-retry-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-management/4.1.6/ab0d444971a5967cface2fa969a56d1f17a7ba67/micronaut-management-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-server-netty/4.1.6/88b4c225560685e668133e3d67caf35877f5ed6b/micronaut-http-server-netty-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-inject/4.1.6/51ead8f85c5abfeaa4e9234f1bf7cc5ffcafdee6/micronaut-inject-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.nativeimage/svm/23.0.1/3a8dc6ab2a0a01b6a5a0cf02941492d6a5a9beea/svm-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-reflect/1.8.22/b52be44bc57cb6fd2169a29aefa4507c4e49c858/kotlin-reflect-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.8.22/b25c86d47d6b962b9cf0f8c3f320c8a10eea3dd1/kotlin-stdlib-jdk8-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-discovery-core/4.1.6/4f6c414c5a110b9a90cafa4670ee7d22668d243c/micronaut-discovery-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-json-core/4.1.6/899071d64f2f2696f6ad465751e3d98c46c4d922/micronaut-json-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.validation/micronaut-validation/4.0.3/2792c9474f65b5d5ff775d4d804bde7dd3ad1699/micronaut-validation-4.0.3.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-context/4.1.6/b52f30d46cec46c176d9dac3020f62372b82e6ab/micronaut-context-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.projectreactor/reactor-core/3.5.10/b2d043508fbc0190bfb63eea1b33551f48a8c32b/reactor-core-3.5.10.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.serde/micronaut-serde-api/2.2.4/b0de3fa4823a97e91f3c385400b4e6c21ce6edfa/micronaut-serde-api-2.2.4.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-jackson-core/4.1.6/e0450ffc50b1533645d29658a46cd5e186ff925a/micronaut-jackson-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.15.2/4724a65ac8e8d156a24898d50fd5dbd3642870b8/jackson-annotations-2.15.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-websocket/4.1.6/22eac813b6d57125ac5301f19c7b75c8d80b32cf/micronaut-websocket-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-client-core/4.1.6/e47a5eab2eb6a9ef5ae8bbe9fe66bcfbd3c619b6/micronaut-http-client-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-netty/4.1.6/c6c287095312541c62bf03a3665eca6628b700da/micronaut-http-netty-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-handler-proxy/4.1.97.Final/a99ecef0e1d86a92e40a7c89805c236d9cd7493e/netty-handler-proxy-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/2.0.9/7cf2726fdcfbc8610f9a71fb3ed639871f315340/slf4j-api-2.0.9.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-core-reactive/4.1.6/856b4ef83a273b39ba2b4a39657eca7e73ab6fe9/micronaut-core-reactive-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-router/4.1.6/eeaf11ff4caaea6a2ae24ebe733f1440d885fd2d/micronaut-router-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http-server/4.1.6/eabe112b07c2c0174279359da1ba80e4109406d7/micronaut-http-server-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec-http/4.1.97.Final/af78acec783ffd77c63d8aeecc21041fd39ac54f/netty-codec-http-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-core/4.1.6/7165916b17e00ea684ec960d38598828702e81ea/micronaut-core-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/jakarta.annotation/jakarta.annotation-api/2.1.1/48b9bda22b091b1f48b13af03fe36db3be6e1ae3/jakarta.annotation-api-2.1.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/jakarta.inject/jakarta.inject-api/2.0.1/4c28afe1991a941d7702fe1362c365f0a8641d1e/jakarta.inject-api-2.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.nativeimage/objectfile/23.0.1/fdf2498dec4e3a9c245194459489326139542ebb/objectfile-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.nativeimage/pointsto/23.0.1/4c00015096d190329bed2afb6d944e3325d3c5e8/pointsto-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.nativeimage/native-image-base/23.0.1/5e6f202d15d266fad0fb80691608578dfb36b97d/native-image-base-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.compiler/compiler/23.0.1/d46d27452f8565a54f753208b16d4e0809180a98/compiler-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.sdk/graal-sdk/23.0.1/a9e13a0f6d6dea76f2dfdedc7f10325e4f0481c4/graal-sdk-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.8.22/636bf8b320e7627482771bbac9ed7246773c02bd/kotlin-stdlib-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.8.22/4dabb8248310d833bb6a8b516024a91fd3d275c/kotlin-stdlib-jdk7-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-http/4.1.6/45f92cb2a7806464e5788583fb20950fd26c1593/micronaut-http-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/jakarta.validation/jakarta.validation-api/3.0.2/92b6631659ba35ca09e44874d3eb936edfeee532/jakarta.validation-api-3.0.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-aop/4.1.6/8e06948b197df724bfec6661dec2d657df169c4b/micronaut-aop-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.reactivestreams/reactive-streams/1.0.4/3864a1320d97d7b045f729a326e1e077661f31b7/reactive-streams-1.0.4.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-core/2.15.2/a6fe1836469a69b3ff66037c324d75fc66ef137c/jackson-core-2.15.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-buffer-netty/4.1.6/57429cf821a1f39ed1f1e0efb99f5ec0ab267d17/micronaut-buffer-netty-4.1.6.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec-http2/4.1.97.Final/893888d09a7bef0d0ba973d7471943e765d0fd08/netty-codec-http2-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-handler/4.1.97.Final/abb86c6906bf512bf2b797a41cd7d2e8d3cd7c36/netty-handler-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec-socks/4.1.97.Final/30e8fa29a349db5a933225d61891b8802836bb79/netty-codec-socks-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-codec/4.1.97.Final/384ba4d75670befbedb45c4d3b497a93639c206d/netty-codec-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport/4.1.97.Final/f37380d23c9bb079bc702910833b2fd532c9abd0/netty-transport-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-buffer/4.1.97.Final/f8f3d8644afa5e6e1a40a3a6aeb9d9aa970ecb4f/netty-buffer-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-common/4.1.97.Final/7cceacaf11df8dc63f23d0fb58e9d4640fc88404/netty-common-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.graalvm.truffle/truffle-api/23.0.1/7a374e07d336784c1ec94e8fed45a61a700c0993/truffle-api-23.0.1.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.8.22/1a8e3601703ae14bb58757ea6b2d8e8e5935a586/kotlin-stdlib-common-1.8.22.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-transport-native-unix-common/4.1.97.Final/d469d84265ab70095b01b40886cabdd433b6e664/netty-transport-native-unix-common-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.netty/netty-resolver/4.1.97.Final/cec8348108dc76c47cf87c669d514be52c922144/netty-resolver-4.1.97.Final.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.module/jackson-module-kotlin/2.15.2/475c9721f5a2a5b7bea57d504bd8b0586d1ba5e/jackson-module-kotlin-2.15.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.4.11/54450c0c783e896a1a6d88c043bd2f1daba1c382/logback-classic-1.4.11.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/2.0/3aab2116756442bf0d4cd1c089b24d34c3baa253/snakeyaml-2.0.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.typesafe/config/1.4.2/4c40a633e7994cfb0354244efb6d03fcb11c3ecf/config-1.4.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut.serde/micronaut-serde-support/2.2.4/80a9170538d1097bfc376e9ba994b3b435625cba/micronaut-serde-support-2.2.4.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-databind/2.15.2/9353b021f10c307c00328f52090de2bdb4b6ff9c/jackson-databind-2.15.2.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.4.11/2f9f280219a9922a74200eaf7138c4c17fb87c0f/logback-core-1.4.11.jar:/Users/kristianrickert/.gradle/caches/modules-2/files-2.1/io.micronaut/micronaut-context-propagation/4.1.6/ba078112b19834cbe716321a79d2039e01c89b1b/micronaut-context-propagation-4.1.6.jar example.micronaut.ApplicationKt


| / () ___ _ __ ___ _ __ __ _ _ | |
| |/| | |/ | '/ _ | '
\ / ` | | | | |
| | | | | (
| | | (
) | | | | (| | || | |_
|| |||___|| ___/|| ||_,|_,|__|
20:18:52.607 [main] INFO i.m.c.DefaultApplicationContext$RuntimeConfiguredEnvironment - Established active environments: [dev]
20:18:52.609 [main] INFO i.m.c.DefaultApplicationContext$BootstrapEnvironment - Established active environments: [dev]
20:18:52.618 [main] INFO i.m.context.DefaultBeanContext - Reading bootstrap environment configuration
20:18:53.126 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 730ms. Server Running: http://localhost:8080
20:19:03.140 [default-nioEventLoopGroup-1-2] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
20:19:09.167 [default-nioEventLoopGroup-1-3] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
20:19:18.178 [default-nioEventLoopGroup-1-4] WARN i.n.channel.DefaultChannelPipeline - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
20:19:20.195 [default-nioEventLoopGroup-1-5] ERROR i.m.d.registration.AutoRegistration - Error occurred during service registration with Consul: Error encoding object [io.micronaut.discovery.consul.client.v1.NewServiceEntry@9a176cd9] to JSON: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
io.micronaut.http.codec.CodecException: Error encoding object [io.micronaut.discovery.consul.client.v1.NewServiceEntry@9a176cd9] to JSON: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
at io.micronaut.json.body.JsonMessageHandler.decorateWrite(JsonMessageHandler.java:127)
at io.micronaut.json.body.JsonMessageHandler.writeTo(JsonMessageHandler.java:136)
at io.micronaut.http.body.MessageBodyWriter.writeTo(MessageBodyWriter.java:138)
at io.micronaut.http.netty.body.NettyJsonHandler.writeTo(NettyJsonHandler.java:133)
at io.micronaut.http.body.DynamicMessageBodyWriter.writeTo(DynamicMessageBodyWriter.java:79)
at io.micronaut.http.client.netty.DefaultHttpClient.buildNettyRequest(DefaultHttpClient.java:1326)
at io.micronaut.http.client.netty.DefaultHttpClient.sendRequestThroughChannel(DefaultHttpClient.java:1468)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchangeImpl$26(DefaultHttpClient.java:1102)
at reactor.core.publisher.FluxCreate.subscribe(FluxCreate.java:95)
at reactor.core.publisher.Flux.subscribe(Flux.java:8773)
at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onNext(MonoFlatMapMany.java:195)
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82)
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82)
at io.micronaut.http.client.netty.CancellableMonoSink.tryForward(CancellableMonoSink.java:69)
at io.micronaut.http.client.netty.CancellableMonoSink.tryEmitValue(CancellableMonoSink.java:86)
at io.micronaut.http.client.netty.ConnectionManager$Pool$ConnectionHolder.emitPoolHandle(ConnectionManager.java:1155)
at io.micronaut.http.client.netty.ConnectionManager$Pool$Http1ConnectionHolder.dispatch0(ConnectionManager.java:1308)
at io.micronaut.http.client.netty.ConnectionManager$Pool$ConnectionHolder.dispatch(ConnectionManager.java:1179)
at io.micronaut.http.client.netty.PoolResizer.dispatchSafe(PoolResizer.java:169)
at io.micronaut.http.client.netty.PoolResizer.doSomeWork(PoolResizer.java:115)
at io.micronaut.http.client.netty.PoolResizer.dirty(PoolResizer.java:77)
at io.micronaut.http.client.netty.PoolResizer.onNewConnectionEstablished1(PoolResizer.java:208)
at io.micronaut.http.client.netty.ConnectionManager$Pool$Http1ConnectionHolder.init(ConnectionManager.java:1248)
at io.micronaut.http.client.netty.ConnectionManager$Pool$2$1.channelActive(ConnectionManager.java:1038)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:262)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:238)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelActive(CombinedChannelDuplexHandler.java:412)
at io.netty.channel.ChannelInboundHandlerAdapter.channelActive(ChannelInboundHandlerAdapter.java:69)
at io.netty.channel.CombinedChannelDuplexHandler.channelActive(CombinedChannelDuplexHandler.java:211)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:260)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:238)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelActive(AbstractChannelHandlerContext.java:231)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelActive(DefaultChannelPipeline.java:1398)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:258)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelActive(AbstractChannelHandlerContext.java:238)
at io.netty.channel.DefaultChannelPipeline.fireChannelActive(DefaultChannelPipeline.java:895)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:305)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:335)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:776)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: io.micronaut.serde.exceptions.SerdeException: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
at io.micronaut.serde.support.serializers.ObjectSerializer$4.tryToFindSerializer(ObjectSerializer.java:218)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.lambda$getSerializer$0(ObjectSerializer.java:280)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.getSerializer(ObjectSerializer.java:278)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.support.serializers.OptionalSerializer$1.serialize(OptionalSerializer.java:63)
at io.micronaut.serde.support.serializers.OptionalSerializer$1.serialize(OptionalSerializer.java:51)
at io.micronaut.serde.support.serializers.CustomizedObjectSerializer.serialize(CustomizedObjectSerializer.java:132)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.jackson.JacksonJsonMapper.writeValue(JacksonJsonMapper.java:114)
at io.micronaut.serde.jackson.JacksonJsonMapper.writeValue(JacksonJsonMapper.java:193)
at io.micronaut.json.body.JsonMessageHandler.writeTo(JsonMessageHandler.java:134)
... 45 common frames omitted
Caused by: io.micronaut.core.beans.exceptions.IntrospectionException: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
at io.micronaut.serde.support.DefaultSerdeIntrospections.getSerializableIntrospection(DefaultSerdeIntrospections.java:102)
at io.micronaut.serde.support.serializers.SerBean.(SerBean.java:107)
at io.micronaut.serde.support.serializers.ObjectSerializer.create(ObjectSerializer.java:202)
at io.micronaut.serde.support.serializers.ObjectSerializer.lambda$getSerBean$0(ObjectSerializer.java:193)
at io.micronaut.core.util.SupplierUtil$2.get(SupplierUtil.java:79)
at io.micronaut.serde.support.serializers.ObjectSerializer.getSerBean(ObjectSerializer.java:194)
at io.micronaut.serde.support.serializers.ObjectSerializer.createSpecificInternal(ObjectSerializer.java:93)
at io.micronaut.serde.support.serializers.ObjectSerializer.createSpecific(ObjectSerializer.java:86)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.tryToFindSerializer(ObjectSerializer.java:296)
at io.micronaut.serde.support.serializers.ObjectSerializer$4.tryToFindSerializer(ObjectSerializer.java:216)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.lambda$getSerializer$0(ObjectSerializer.java:280)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.getSerializer(ObjectSerializer.java:278)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.isEmpty(ObjectSerializer.java:256)
at io.micronaut.serde.support.serializers.OptionalSerializer$1.isEmpty(OptionalSerializer.java:77)
at io.micronaut.serde.support.serializers.OptionalSerializer$1.isEmpty(OptionalSerializer.java:51)
at io.micronaut.serde.support.serializers.CustomizedObjectSerializer.serialize(CustomizedObjectSerializer.java:100)
... 49 common frames omitted
20:20:03.761 [parallel-4] ERROR i.m.m.health.indicator.HealthResult - Health indicator [compositeDiscoveryClient(consul)] reported exception: io.micronaut.http.client.exceptions.ReadTimeoutException: Read Timeout
io.micronaut.http.client.exceptions.ReadTimeoutException: Read Timeout
at io.micronaut.http.client.exceptions.ReadTimeoutException.(ReadTimeoutException.java:26)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchangeImpl$28(DefaultHttpClient.java:1135)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:295)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:280)
at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:419)
at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:271)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:286)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.239 [default-nioEventLoopGroup-1-5] ERROR i.m.d.registration.AutoRegistration - Error occurred de-registering service [bookrecommendation] with Consul: Read Timeout
io.micronaut.http.client.exceptions.ReadTimeoutException: Read Timeout
at io.micronaut.http.client.exceptions.ReadTimeoutException.(ReadTimeoutException.java:26)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchangeImpl$28(DefaultHttpClient.java:1135)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:295)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:280)
at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:419)
at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:271)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:286)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.367 [default-nioEventLoopGroup-1-23] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.367 [default-nioEventLoopGroup-1-21] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.369 [default-nioEventLoopGroup-1-24] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.370 [default-nioEventLoopGroup-1-22] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.371 [default-nioEventLoopGroup-1-25] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.372 [default-nioEventLoopGroup-1-27] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.372 [default-nioEventLoopGroup-1-29] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.470 [default-nioEventLoopGroup-1-28] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:31.470 [default-nioEventLoopGroup-1-26] ERROR i.m.h.client.netty.DefaultHttpClient - Failed to connect to remote
java.lang.IllegalStateException: executor not accepting a task
at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:61)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:208)
at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:189)
at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:175)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:990)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516)
at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429)
at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
20:20:34.326 [Thread-0] INFO io.micronaut.runtime.Micronaut - Embedded Application shutting down

Process finished with exit code 0

Steps To Reproduce

  1. Download and install consul server
    brew tap hashicorp/tap
    brew install hashicorp/tap/consul
    consul agent -dev
  2. Download and run the consol service discovery tutorial
  3. the micronaut client registry fails

Environment Information

JDK
java --version
openjdk 17.0.8 2023-07-18 LTS
OpenJDK Runtime Environment Corretto-17.0.8.7.1 (build 17.0.8+7-LTS)
OpenJDK 64-Bit Server VM Corretto-17.0.8.7.1 (build 17.0.8+7-LTS, mixed mode, sharing)

OSX - Sonoma 14

Micronaut consul tutorial

https://guides.micronaut.io/latest/micronaut-microservices-services-discover-consul-gradle-kotlin.html
https://guides.micronaut.io/latest/micronaut-microservices-services-discover-consul-maven-java.html
Both fail

I also have an app on github below that fails in the same manner. There are 2 standalone grpc servers on that code, both have the same failures

I also tried running consul as local docker deploy. Same result

Furthermore, I get a similar error when trying Eureka

Example Application

https://github.com/krickert/search_indexer

Version

mn -V: Micronaut Version: 4.1.3

No serializable introspection present for type Inet4Address with Serde

Expected Behavior

Not failing

Actual Behaviour

Before @SerdeImport(Inet4Address.class)

Java:

2022-12-07 22:44:12,338 [default-nioEventLoopGroup-1-2] WARN  io.netty.channel.DefaultChannelPipeline:1152 - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
2022-12-07 22:44:18,369 [default-nioEventLoopGroup-1-3] WARN  io.netty.channel.DefaultChannelPipeline:1152 - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
2022-12-07 22:44:27,373 [default-nioEventLoopGroup-1-4] WARN  io.netty.channel.DefaultChannelPipeline:1152 - An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.timeout.ReadTimeoutException: null
2022-12-07 22:44:29,368 [default-nioEventLoopGroup-1-5] ERROR io.micronaut.discovery.client.registration.DiscoveryServiceAutoRegistration$1:83 - Error occurred during service registration with Consul: Error encoding object [io.micronaut.discovery.consul.client.v1.NewServiceEntry@d3092a09] to JSON: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
io.micronaut.http.codec.CodecException: Error encoding object [io.micronaut.discovery.consul.client.v1.NewServiceEntry@d3092a09] to JSON: No serializable introspection present for type Inet4Address. Consider adding Serdeable. Serializable annotate to type Inet4Address. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(Inet4Address.class) to enable serialization of this type.
	at io.micronaut.json.codec.MapperMediaTypeCodec.encode(MapperMediaTypeCodec.java:212)
	at io.micronaut.json.codec.MapperMediaTypeCodec.encode(MapperMediaTypeCodec.java:258)
	at io.micronaut.http.client.netty.DefaultHttpClient.lambda$buildNettyRequest$41(DefaultHttpClient.java:1340)
	at java.base/java.util.Optional.map(Optional.java:260)

Consul:

2022-12-07T21:45:28.719Z [DEBUG] agent: Node info in sync
2022-12-07T21:45:44.485Z [ERROR] agent.http: Request error: method=PUT url="/v1/agent/service/deregister/users%3A773d43e0d4" from=10.0.2.100:54606 error="Unknown service ID \"users:773d43e0d4\". Ensure that the service ID is passed, not the service name."
2022-12-07T21:45:44.485Z [DEBUG] agent.http: Request finished: method=PUT url="/v1/agent/service/deregister/users%3A773d43e0d4" from=10.0.2.100:54606 latency="38.971µs"

After @SerdeImport(Inet4Address.class)

Java:

2022-12-07 22:46:51,905 [default-nioEventLoopGroup-1-5] ERROR io.micronaut.discovery.client.registration.DiscoveryServiceAutoRegistration$1:83 - Error occurred during service registration with Consul: Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string
io.micronaut.http.client.exceptions.HttpClientResponseException: Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string
	at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.makeErrorFromRequestBody(DefaultHttpClient.java:2253)
	at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.buildResponse(DefaultHttpClient.java:2215)
	at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.buildResponse(DefaultHttpClient.java:2138)
	at io.micronaut.http.client.netty.DefaultHttpClient$BaseHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2113)
	at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2174)
	at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2138)
	at io.micronaut.http.client.netty.SimpleChannelInboundHandlerInstrumented.channelRead0(SimpleChannelInboundHandlerInstrumented.java:49)
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:215)
	at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:180)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:336)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:308)
	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:1589)
2022-12-07 22:46:51,915 [default-nioEventLoopGroup-1-5] INFO  io.micronaut.discovery.client.registration.DiscoveryServiceAutoRegistration:136 - De-registered service [users] with Consul

Consul:

2022-12-07T21:46:12.221Z [DEBUG] agent.router.manager: Rebalanced servers, new active server: number_of_servers=1 active_server="9fb5babb1567.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)"
2022-12-07T21:46:24.874Z [ERROR] agent.http: Request error: method=PUT url=/v1/agent/service/register from=10.0.2.100:43834 error="Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string"
2022-12-07T21:46:24.874Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=10.0.2.100:43834 latency="118.011µs"
2022-12-07T21:46:30.888Z [ERROR] agent.http: Request error: method=PUT url=/v1/agent/service/register from=10.0.2.100:52772 error="Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string"
2022-12-07T21:46:30.888Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=10.0.2.100:52772 latency="136.531µs"
2022-12-07T21:46:39.893Z [ERROR] agent.http: Request error: method=PUT url=/v1/agent/service/register from=10.0.2.100:39200 error="Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string"
2022-12-07T21:46:39.893Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=10.0.2.100:39200 latency="140.581µs"
2022-12-07T21:46:51.900Z [ERROR] agent.http: Request error: method=PUT url=/v1/agent/service/register from=10.0.2.100:53236 error="Request decode failed: json: cannot unmarshal object into Go struct field .Address of type string"
2022-12-07T21:46:51.900Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=10.0.2.100:53236 latency="108.231µs"
2022-12-07T21:46:51.914Z [ERROR] agent.http: Request error: method=PUT url="/v1/agent/service/deregister/users%3A79d3a09b97" from=10.0.2.100:53244 error="Unknown service ID \"users:79d3a09b97\". Ensure that the service ID is passed, not the service name."
2022-12-07T21:46:51.915Z [DEBUG] agent.http: Request finished: method=PUT url="/v1/agent/service/deregister/users%3A79d3a09b97" from=10.0.2.100:53244 latency="48.32µs"

Steps To Reproduce

Run discovery-fail.zip

Environment Information

Consul: 1.14.2 (Docker)

Example Application

No response

Version

3.7.4

Eureka Client GraalVM error

Hi,

I configured a micronaut service to connect to Eureka which works fine for a regular Java package. But if I package it via docker-native as a GraalVM image, the microservice throw constantly exceptions at runtime.

 13:02:08.386 [default-nioEventLoopGroup-1-19] ERROR i.m.m.health.indicator.HealthResult - Health indicator [eureka] reported exception: io.micronaut.http.client.exceptions.HttpClientResponseException: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$Applicatio
nInfos]: Cannot construct instance of `io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
  at [Source: (byte[])"{"applications":{"versions__delta":"1","apps__hashcode":"DOWN_1_UP_1_","application":[{"name":"MODULE1","instance":[{"instanceId":"module1:8080","hostName":"module1-001","app":"MODULE1","ipAddr":"172.20.0.5","status":"DOWN","overriddenStatus":"DOWN","port":{"$":8080,"@enabled":"true"},"securePort":{"$":0,"@enabled":"false"},"
countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"reg"[truncated 1612 bytes]; line: 1, column: 18]
 io.micronaut.http.client.exceptions.HttpClientResponseException: Error decoding HTTP response body: Error decoding stream for type [class io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos]: Cannot construct instance of `io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos` (no Creators, like
 default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
  at [Source: (byte[])"{"applications":{"versions__delta":"1","apps__hashcode":"DOWN_1_UP_1_","application":[{"name":"MODULE1","instance":[{"instanceId":"module1:8080","hostName":"module1-001","app":"MODULE1","ipAddr":"172.20.0.5","status":"DOWN","overriddenStatus":"DOWN","port":{"$":8080,"@enabled":"true"},"securePort":{"$":0,"@enabled":"false"},"
countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"reg"[truncated 1612 bytes]; line: 1, column: 18]
        at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2206)
        at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2076)
        at io.micronaut.http.client.netty.DefaultHttpClient$SimpleChannelInboundHandlerInstrumented.channelRead0(DefaultHttpClient.java:2780)
        at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:193)
        at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:183)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
        at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
        at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
        at java.lang.Thread.run(Thread.java:829)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:553)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
 Caused by: io.micronaut.http.codec.CodecException: Error decoding stream for type [class io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos]: Cannot construct instance of `io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos` (no Creators, like default constructor, exist): cannot deserialize
from Object value (no delegate- or property-based Creator)
  at [Source: (byte[])"{"applications":{"versions__delta":"1","apps__hashcode":"DOWN_1_UP_1_","application":[{"name":"MODULE1","instance":[{"instanceId":"module1:8080","hostName":"module1-001","app":"MODULE1","ipAddr":"172.20.0.5","status":"DOWN","overriddenStatus":"DOWN","port":{"$":8080,"@enabled":"true"},"securePort":{"$":0,"@enabled":"false"},"
countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"reg"[truncated 1612 bytes]; line: 1, column: 18]
        at io.micronaut.jackson.codec.JacksonMediaTypeCodec.decode(JacksonMediaTypeCodec.java:209)
        at io.micronaut.http.client.netty.FullNettyClientHttpResponse.convertByteBuf(FullNettyClientHttpResponse.java:280)
        at io.micronaut.http.client.netty.FullNettyClientHttpResponse.lambda$getBody$1(FullNettyClientHttpResponse.java:218)
        at java.util.HashMap.computeIfAbsent(HashMap.java:1133)
        at io.micronaut.http.client.netty.FullNettyClientHttpResponse.getBody(FullNettyClientHttpResponse.java:192)
        at io.micronaut.http.client.netty.FullNettyClientHttpResponse.<init>(FullNettyClientHttpResponse.java:111)
        at io.micronaut.http.client.netty.DefaultHttpClient$12.channelReadInstrumented(DefaultHttpClient.java:2136)
        ... 45 common frames omitted
 Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient$ApplicationInfos` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
  at [Source: (byte[])"{"applications":{"versions__delta":"1","apps__hashcode":"DOWN_1_UP_1_","application":[{"name":"MODULE1","instance":[{"instanceId":"module1:8080","hostName":"module1-001","app":"MODULE1","ipAddr":"172.20.0.5","status":"DOWN","overriddenStatus":"DOWN","port":{"$":8080,"@enabled":"true"},"securePort":{"$":0,"@enabled":"false"},"
countryId":1,"dataCenterInfo":{"@class":"com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo","name":"MyOwn"},"leaseInfo":{"renewalIntervalInSecs":30,"durationInSecs":90,"reg"[truncated 1612 bytes]; line: 1, column: 18]
        at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1764)
        at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
        at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1209)
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1415)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:362)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:195)
        at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext._unwrapAndDeserialize(DefaultDeserializationContext.java:355)
        at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:319)
        at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4593)
        at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3609)
        at io.micronaut.jackson.codec.JacksonMediaTypeCodec.decode(JacksonMediaTypeCodec.java:206)
        ... 51 common frames omitted

Imho, Jackson fails because it uses an unsupported reflection access to deserialize io.micronaut.discovery.eureka.client.v2.AbstractEurekaClient.ApplicationInfo. Micronaut Documentation states that you have to annotate such classes with @Introspected to point out to the compiler to add additional configuration information.

Greets, Aaron

New application with feature `discovery-eureka` fails test task

Issue description

Micronaut Version: 3.1.1
sdelamo@ig11 discovery-eureka % mn create-app example.micronaut.guidethreeoneone --features=discovery-eureka
| Application created at /Users/sdelamo/github/issues/discovery-eureka/guidethreeoneone
sdelamo@ig11 discovery-eureka % cd guidethreeoneone 
sdelamo@ig11 guidethreeoneone % ./gradlew test

> Task :compileTestJava
Note: Creating bean classes for 1 type elements

> Task :test FAILED

GuidethreeoneoneTest > initializationError FAILED
    io.micronaut.context.exceptions.BeanInstantiationException at DefaultBeanContext.java:2368
        Caused by: java.lang.UnsupportedOperationException at NettyHttpServer.java:379

1 test completed, 1 failed

It seems like a regression. However, 3.0.3 does not behave correctly either.

Test never completes but it does not crashes.

% sdk use micronaut 3.0.3

Using micronaut version 3.0.3 in this shell.
sdelamo@ig11 discovery-eureka % mn --version                                                                
Micronaut Version: 3.0.3
sdelamo@ig11 discovery-eureka % mn create-app example.micronaut.guidethreezerothree --features=discovery-eureka
| Application created at /Users/sdelamo/github/issues/discovery-eureka/guidethreezerothree
sdelamo@ig11 discovery-eureka % cd guidethree
cd: no such file or directory: guidethree
sdelamo@ig11 discovery-eureka % cd guidethreezerothree 
sdelamo@ig11 guidethreezerothree % ./gradlew test

> Task :compileTestJava
Note: Creating bean classes for 1 type elements
<===========--> 85% EXECUTING [57s]
> :test > 1 test completed
> :test > Executing test example.micronaut.GuidethreezerothreeTest

Consul reports health check problems when an application is configured for Consul to check application health instead of the application sending heartbeat

Task List

  • Steps to reproduce provided
  • Stacktrace (if present) provided
  • Example that reproduces the problem uploaded to Github
  • Full description of the issue provided (see below)

Steps to Reproduce

  1. Use https://micronaut.io/launch to make a new Micronaut project, and select config-consul and discovery-consul features
  2. Install consul through docker and add the following configuration to bootstrap.yml and application.yml. The configuration in application.yml tells the application that Consul is the one who checks for the health of the application instead of the application sending the heartbeat to Consul:

bootstrap.yml

micronaut:
  application:
    name: demoApp
  config-client:
    enabled: true

application.yml

consul:
  client:
    registration:
      enabled: true
      check:
        http: true
    default-zone: "${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}"
  1. Build and run the application

Expected Behaviour

On Consul's web client you should see that the application is running with no problems.

Actual Behaviour

Under health checks tab for the service, Consul's web client reports the following:

Get "http://localhost:8080/health": dial tcp 127.0.0.1:8080: connect: connection refused

Environment Information

  • Operating System: Debian Buster
  • Micronaut Version: 2.5.5
  • JDK Version: 11.0.11

Example Application

I would also like to report that there are currently inconsistencies in what is stated in the guide with respect to Consul configuration and what https://micronaut.io/launch configures for service discovery with Consul. On the official Micronaut Discovery Client guide page, it is stated that implementation("io.micronaut:micronaut-discovery-client") is needed to add the discovery client to the application but, checking what is generated with the launcher, the dependency is instead the following: implementation("io.micronaut.discovery:micronaut-discovery-client").

I have attached a picture that describes the problem.

Screenshot from 2021-06-10 17-36-23

Micronaut won't start (throws exception) when "discovery-client" feature is enabled

Expected Behavior

The application should start.

Actual Behaviour

The BeanInstantiationException exception is thrown.

Stack trace:

19:20:06.684 [main] INFO  i.m.context.DefaultBeanContext - Reading bootstrap environment configuration
19:20:06.848 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Bean definition [io.micronaut.discovery.eureka.EurekaServiceInstanceList] could
not be loaded: io/micronaut/http/client/HttpClientConfiguration
io.micronaut.context.exceptions.BeanInstantiationException: Bean definition [io.micronaut.discovery.eureka.EurekaServiceInstanceList] could not be loaded: io/micronaut/http/client/HttpClientConfiguration
        at io.micronaut.context.DefaultBeanContext$BeanDefinitionProducer.getDefinition(DefaultBeanContext.java:4157)
        at io.micronaut.context.DefaultBeanContext.collectBeanCandidates(DefaultBeanContext.java:2138)
        at io.micronaut.context.DefaultBeanContext.findBeanCandidates(DefaultBeanContext.java:2113)
        at io.micronaut.context.DefaultBeanContext.findBeanCandidatesInternal(DefaultBeanContext.java:3362)
        at io.micronaut.context.DefaultBeanContext.getBeanRegistrations(DefaultBeanContext.java:3417)
        at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:1436)
        at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:881)
        at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:871)
        at io.micronaut.context.event.ApplicationEventPublisherFactory$2.lambda$$1(ApplicationEventPublisherFactory.java:215)
        at io.micronaut.core.util.SupplierUtil$1.get(SupplierUtil.java:47)
        at io.micronaut.context.event.ApplicationEventPublisherFactory$2.publishEvent(ApplicationEventPublisherFactory.java:226)
        at io.micronaut.context.DefaultBeanContext.publishEvent(DefaultBeanContext.java:1779)
        at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:360)
        at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:198)
        at io.micronaut.runtime.Micronaut.start(Micronaut.java:73)
        at io.micronaut.runtime.Micronaut.run(Micronaut.java:322)
        at io.micronaut.runtime.Micronaut.run(Micronaut.java:308)
        at foo.Application.main(Application.java:8)
Caused by: java.lang.NoClassDefFoundError: io/micronaut/http/client/HttpClientConfiguration
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
        at java.base/java.lang.ClassLoader.defineClass1(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
        at io.micronaut.discovery.eureka.$EurekaServiceInstanceList$Definition.<clinit>(Unknown Source)
        at io.micronaut.discovery.eureka.$EurekaServiceInstanceList$Definition$Reference.load(Unknown Source)
        at io.micronaut.context.AbstractInitializableBeanDefinitionReference.load(AbstractInitializableBeanDefinitionReference.java:178)
        at io.micronaut.context.DefaultBeanContext$BeanDefinitionProducer.getDefinition(DefaultBeanContext.java:4152)
        ... 17 common frames omitted
Caused by: java.lang.ClassNotFoundException: io.micronaut.http.client.HttpClientConfiguration
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
        ... 39 common frames omitted

Steps To Reproduce

Create a new micronaut application with discovery-client feature.
Run the application.

mn create-app foo.bar --features=discovery-client --build=maven --lang=java

cd bar

mvn mn:run

Environment Information

OS: Windows 11 / WSL 2 (Ubuntu)

$ java -version
openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment Temurin-17.0.8.1+1 (build 17.0.8.1+1)
OpenJDK 64-Bit Server VM Temurin-17.0.8.1+1 (build 17.0.8.1+1, mixed mode, sharing)

mvn --version
Apache Maven 3.9.4 (dfbb324ad4a7c8fb0bf182e6d91b0ae20e3d2dd9)
Maven home: /home/user/.sdkman/candidates/maven/current
Java version: 17.0.8.1, vendor: Eclipse Adoptium, runtime: /home/user/.sdkman/candidates/java/17.0.8.1-tem
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.15.90.1-microsoft-standard-wsl2", arch: "amd64", family: "unix"

mn --version
Micronaut Version: 4.1.1

Example Application

No response

Version

4.1.1

Unable to run test locally

% ./gradlew test --parallel         

Version catalog 'mnTest' can be automatically imported. You can remove it from settings.gradle(.kts) file.
Type-safe project accessors is an incubating feature.
Project accessors enabled, but root project name not explicitly set for 'buildSrc'. Checking out the project in different folders will impact the generated code and implicitly the buildscript classpath, breaking caching.

> Task :test-suite-consul-graal:internalStartTestResourcesService
[1.312s][warning][cds] Preload Warning: Cannot find io/netty/channel/$Proxy12
[1.767s][warning][cds] Skipping jdk/internal/event/Event: JFR event class
[1.769s][warning][cds] Skipping jdk/internal/event/ProcessStartEvent: JFR event class
[1.769s][warning][cds] Skipping jdk/internal/event/SecurityProviderServiceEvent: JFR event class

[test-resources-service] 12:00:33.272 [ForkJoinPool.commonPool-worker-20] INFO  i.m.t.e.TestResourcesResolverLoader - Loaded 1 test resources resolvers: io.micronaut.testresources.testcontainers.GenericTestContainerProvider

> Task :micronaut-discovery-client:testecuting test io.micronaut.discovery.consul.ConsulMockAutoRegistrationSpec


Predictive Test Selection: all test classes selected
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test mock server PASSED

  SLF4J: No SLF4J providers were found.
  SLF4J: Defaulting to no-operation (NOP) logger implementation
  SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.

Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that the service is automatically registered with Consul PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that the service is automatically de-registered with Consul PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with tags PASSED

[test-resources-service] 12:00:33.373 [main] INFO  i.m.t.server.TestResourcesService - A Micronaut Test Resources server is listening on port 65349, started in 153ms
[test-resources-service] 12:00:34.600 [default-nioEventLoopGroup-1-2] INFO  i.m.t.e.TestResourcesResolverLoader - Loaded 1 test resources resolvers: io.micronaut.testresources.testcontainers.GenericTestContainerProvider
[test-resources-service] 12:00:34.843 [default-nioEventLoopGroup-1-2] INFO  o.t.utility.ImageNameSubstitutor - Image name substitution will be performed by: DefaultImageNameSubstitutor (composite of 'ConfigurationFileImageNameSubstitutor' and 'PrefixingImageNameSubstitutor')eted
[test-resources-service] 12:00:34.845 [default-nioEventLoopGroup-1-2] INFO  i.m.t.testcontainers.TestContainers - Starting test container consul
[test-resources-service] 12:00:34.958 [default-nioEventLoopGroup-1-2] INFO  o.t.d.DockerClientProviderStrategy - Found Docker environment with Testcontainers Host with tc.host=tcp://127.0.0.1:65500
[test-resources-service] 12:00:34.959 [default-nioEventLoopGroup-1-2] INFO  o.testcontainers.DockerClientFactory - Docker host IP address is 127.0.0.1
[test-resources-service] 12:00:34.962 [default-nioEventLoopGroup-1-2] INFO  o.testcontainers.DockerClientFactory - Connected to docker: 
  Server Version: 24.0.6 (via Testcontainers Desktop 1.4.16)
  API Version: 1.43l-graal:test > Executing test io.micronaut.consul.graal.ConsulTest
  Operating System: Docker Desktop
  Total Memory: 48105 MB
[test-resources-service] 12:00:34.964 [default-nioEventLoopGroup-1-2] INFO  o.testcontainers.DockerClientFactory - Checking the system...
[test-resources-service] 12:00:34.964 [default-nioEventLoopGroup-1-2] INFO  o.testcontainers.DockerClientFactory - ✔︎ Docker server version should be at least 1.6.0
[test-resources-service] 12:00:34.979 [default-nioEventLoopGroup-1-2] INFO  tc.consul:1.9.0 - Creating container for image: consul:1.9.0
[test-resources-service] 12:00:35.112 [default-nioEventLoopGroup-1-2] INFO  tc.testcontainers/ryuk:0.5.1 - Creating container for image: testcontainers/ryuk:0.5.1
[test-resources-service] 12:00:40.040 [default-nioEventLoopGroup-1-2] INFO  tc.testcontainers/ryuk:0.5.1 - Container testcontainers/ryuk:0.5.1 is starting: ccc3906f6ec98de7e8355b9d87f71e1b7547356ed3651e3258ca95d7254776b9
[test-resources-service] 12:00:41.246 [default-nioEventLoopGroup-1-2] INFO  tc.testcontainers/ryuk:0.5.1 - Container testcontainers/ryuk:0.5.1 started in PT6.134272S
[test-resources-service] 12:00:41.270 [default-nioEventLoopGroup-1-2] INFO  tc.consul:1.9.0 - Container consul:1.9.0 is starting: e9ed335d684538878ee6ee8a7a22e743c4bc42f1492794a558aa85c2556cabd1
[test-resources-service] 12:00:41.397 [default-nioEventLoopGroup-1-2] INFO  o.t.c.wait.strategy.HttpWaitStrategy - /inspiring_lalande: Waiting for 60 seconds for URL: http://127.0.0.1:65393/v1/status/leader (where port 65393 maps to container port 8500)l:test > 0 tests completed
[test-resources-service] 12:00:42.411 [default-nioEventLoopGroup-1-2] INFO  tc.consul:1.9.0 - Container consul:1.9.0 started in PT7.446201S

> Task :micronaut-discovery-client:test
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with metadata PASSED (30s)
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with an HTTP health check PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with an HTTP health check and deregisterCriticalServiceAfter PASSEDDLE
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with an HTTP health check and tlsSkipVerify PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a service can be registered with an HTTP health check and HTTP method PASSED
Test Run :micronaut-discovery-client:test > Partition 1 in session 1 on localhost-executor-1 > ConsulMockAutoRegistrationSpec test that a asl token can be configured PASSED
Test Run :micronaut-discovery-client:test > Partition 2 in session 1 on localhost-executor-1 > EurekaAutoRegistrationSpec test that an application can be registered and de-registered with Eureka PASSED (17.1s)
Test Run :micronaut-discovery-client:test > Partition 3 in session 1 on localhost-executor-1 > EurekaClientSpec test is a discovery client PASSED
Test Run :micronaut-discovery-client:test > Partition 3 in session 1 on localhost-executor-1 > EurekaClientSpec test validation PASSED
Test Run :micronaut-discovery-client:test > Partition 3 in session 1 on localhost-executor-1 > EurekaClientSpec test register and de-register instance PASSED
Test Run :micronaut-discovery-client:test > Partition 6 in session 1 on localhost-executor-1 > VaultJacksonIntegrationTest test list secrets from vault PASSED (1.3s)
Test Run :micronaut-discovery-client:test > Partition 6 in session 1 on localhost-executor-1 > ClientScopeSpec test that a client can be discovered using @Client scope PASSED (3.1s)
Test Run :micronaut-discovery-client:test > Partition 6 in session 1 on localhost-executor-1 > ClientScopeSpec test that a client can be discovered using @Client scope with Consul  SKIPPED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that the service is automatically registered with Consul with a TTL configuration PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that the service is automatically registered with Consul with a HTTP configuration PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that a service can be registered with tags and queried with tags PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that a service can be registered with metadata PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test that when Consul is explicitly configured, no AWS service discovery stuff is registered PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > ConsulAutoRegistrationSpec test auto-registration with checks PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec test that an application can be registered and de-registered with Eureka hyphenated PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec test that an application can be registered and de-registered with Eureka PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec > test that an application can be registered and de-registered with Eureka with metadata test that an application can be registered and de-registered with Eureka with metadata [serviceId: myService, configuration: [asgName:test, vipAddress:myVip, secureVipAddress:mySecureVip, appGroupName:myAppGroup, status:STARTING], #0] PASSE
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec > test that an application can be registered and de-registered with Eureka with metadata test that an application can be registered and de-registered with Eureka with metadata [serviceId: myService, configuration: [homePageUrl:http://home, statusPageUrl:http://status, healthCheckUrl:http://health, secureHealthCheckUrl:http://securehealth], #1] PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec > test that an application can be registered and de-registered with Eureka with metadata test that an application can be registered and de-registered with Eureka with metadata [serviceId: myService, configuration: [metadata:[foo:bar]], #2] PASSED
Test Run :micronaut-discovery-client:test > Partition 7 in session 1 on localhost-executor-1 > EurekaMockAutoRegistrationSpec > test that an application can be registered and de-registered with Eureka with metadata test that an application can be registered and de-registered with Eureka with metadata [serviceId: myService, configuration: [port:9999, securePort:9998], #3] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test is a discovery client PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test list services PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test register and deregister catalog entry PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test register and deregister service entry PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test register service with health check PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test list members PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulClientSpec test get self PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EagerInitSpec test run with eager init PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > ConsulHealthStatusSpec test the consul service's health status is correct PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaMockHeartbeatSpec test that the server reports a heartbeat to Eureka PASSED (5s)
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > test configure default zone test configure default zone [value: localhost:8087, result: [http://localhost:8087 (eureka)], #0] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > test configure default zone test configure default zone [value: localhost:8087,localhost:8088, result: [http://localhost:8087 (eureka), http://localhost:8088 (eureka)], #1] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > test configure other zones test configure other zones [value: localhost:8087, result: [http://localhost:8087 (eureka)], #0] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > test configure other zones test configure other zones [value: localhost:8087,localhost:8088, result: [http://localhost:8087 (eureka), http://localhost:8088 (eureka)], #1] PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec test configure registration client PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > should correctly setup instance info (prefer ip-addr: #preferIpAddr) should correctly setup instance info (prefer ip-addr: true) PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > should correctly setup instance info (prefer ip-addr: #preferIpAddr) should correctly setup instance info (prefer ip-addr: false) PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > should correctly setup instance info with overrides from configuration properties (prefer ip-addr: #preferIpAddr) should correctly setup instance info with overrides from configuration properties (prefer ip-addr: true) PASSED
Test Run :micronaut-discovery-client:test > Partition 8 in session 1 on localhost-executor-1 > EurekaClientConfigSpec > should correctly setup instance info with overrides from configuration properties (prefer ip-addr: #preferIpAddr) should correctly setup instance info with overrides from configuration properties (prefer ip-addr: false) PASSED
Test Run :micronaut-discovery-client:test > Partition 4 in session 1 on localhost-executor-1 > TtlHeartbeatSpec test that the server reports a TTL heartbeat when configured to do so PASSED (5.1s)
Test Run :micronaut-discovery-client:test > Partition 4 in session 1 on localhost-executor-1 > TtlHeartbeatSpec test that if the consul server goes down and comes back up the application re-registers SKIPPED
Test Run :micronaut-discovery-client:test > Partition 5 in session 1 on localhost-executor-1 > EurekaContextPathSpec test that the server reports a heartbeat to Eureka PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > MockConfigurationDiscoverySpec test read application configuration from Consul PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > MockConfigurationDiscoverySpec test multiple environment precedence PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > MockConfigurationDiscoverySpec test disable application configuration from Consul PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientFilesSpec test discovery property sources from Consul with YAML handling PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaMockBasicAuthSpec test authentication works PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigSecuredTest test spring name configuration field when server secured and authorization provided PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigSecuredTest test when cloud server secured and authorization not provided PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigSecuredTest test when cloud server secured and only username is provided PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigSecuredTest test when cloud server secured and invalid user credentials provided PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > CompositeDiscoverySpec test multiple service discovery clients PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockHealthStatusSpec test the consul service's health status is correct PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > VaultClientV2ConfigTest test configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > VaultClientV2ConfigTest test prefixed configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > DigitalOceanMetadataResolverSpec test building digital ocean compute metadata PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is not enabled with no config PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is enabled with service discovery settings PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is enabled with service discovery enabled PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is enabled with registration settings PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is enabled with registration enabled PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaEnabledSpec test client is disabled if both registration and discovery are disabled PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > VaultClientV1ConfigTest test configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > VaultClientV1ConfigTest test prefixed configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaHealthIndicatorSpec test eureka health indicator PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigTest test configuration order PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > SpringCloudConfigTest test spring name configuration field PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientYamlSpec initializationError FAILED

  java.lang.IllegalStateException: failed to create a child event loop
      at app//io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:88)
      at app//io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:60)
      at app//io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:49)
      at app//io.netty.channel.MultithreadEventLoopGroup.<init>(MultithreadEventLoopGroup.java:59)
      at app//io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:87)
      at app//io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:82)
      at app//io.netty.channel.nio.NioEventLoopGroup.<init>(NioEventLoopGroup.java:69)
      at app//io.micronaut.http.netty.channel.NioEventLoopGroupFactory.createEventLoopGroup(NioEventLoopGroupFactory.java:56)
      at app//io.micronaut.http.netty.channel.EventLoopGroupFactory.createEventLoopGroup(EventLoopGroupFactory.java:75)
      at app//io.micronaut.http.netty.channel.DefaultEventLoopGroupFactory.createEventLoopGroup(DefaultEventLoopGroupFactory.java:96)
      at app//io.micronaut.http.server.netty.DefaultNettyEmbeddedServerFactory.createEventLoopGroup(DefaultNettyEmbeddedServerFactory.java:284)
      at app//io.micronaut.http.server.netty.NettyHttpServer.newEventLoopGroup(NettyHttpServer.java:688)
      at app//io.micronaut.http.server.netty.NettyHttpServer.lambda$createParentEventLoopGroup$11(NettyHttpServer.java:478)
      at [email protected]/java.util.Optional.orElseGet(Optional.java:364)
      at app//io.micronaut.http.server.netty.NettyHttpServer.createParentEventLoopGroup(NettyHttpServer.java:477)
      at app//io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:272)
      at app//io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:104)
      at app//io.micronaut.context.ApplicationContext.run(ApplicationContext.java:238)
      at app//io.micronaut.context.ApplicationContext.run(ApplicationContext.java:210)
      at app//io.micronaut.discovery.consul.ConsulMockConfigurationClientYamlSpec.$spock_initializeSharedFields(ConsulMockConfigurationClientYamlSpec.groovy:36)
  Caused by: io.netty.channel.ChannelException: failed to open a new selector
      at app//io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:179)
      at app//io.netty.channel.nio.NioEventLoop.<init>(NioEventLoop.java:146)
      at app//io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:183)
      at app//io.netty.channel.nio.NioEventLoopGroup.newChild(NioEventLoopGroup.java:38)
      at app//io.netty.util.concurrent.MultithreadEventExecutorGroup.<init>(MultithreadEventExecutorGroup.java:84)
      ... 19 more
  Caused by: java.io.IOException: Too many open files
      at [email protected]/sun.nio.ch.KQueueSelectorImpl.<init>(KQueueSelectorImpl.java:82)
      at [email protected]/sun.nio.ch.KQueueSelectorProvider.openSelector(KQueueSelectorProvider.java:36)
      at app//io.netty.channel.nio.NioEventLoop.openSelector(NioEventLoop.java:177)
      ... 23 more

Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientJsonSpec test discovery property sources from Consul with JSON handling PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientJsonSpec test discovery property sources from Consul with invalid JSON PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientNativeSpec test read and write key values with ConsulClient PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientNativeSpec test discovery property sources from Consul with native property handling PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > EurekaInstanceInfoSpec test deserialize amazon instance info PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > DiscoveryClientHealthIndicatorConfigurationSpec test that the health indicator configuration is not available when disabled via config PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > DiscoveryClientHealthIndicatorConfigurationSpec test that the health indicator configuration is available when no entry is in config PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > ConsulMockConfigurationClientPropertiesSpec test discovery property sources from Consul with Properties file handling PASSED
Test Run :micronaut-discovery-client:test > Partition 9 in session 1 on localhost-executor-1 > InstanceInfoSpec test instance info PASSED

FAILURE: Executed 86 tests in 1m 33s (1 failed, 2 skipped)



86 tests completed, 1 failed, 2 skipped

> Task :micronaut-discovery-client:test FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':micronaut-discovery-client:test'.
> There were failing tests. See the report at: file:///Users/sdelamo/github/micronaut-projects/micronaut-discovery-client/discovery-client/build/reports/tests/test/index.html

Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

For more on this, please refer to https://docs.gradle.org/8.2.1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation.

BUILD FAILED in 1m 34s
22 actionable tasks: 4 executed, 2 from cache, 16 up-to-date

Publishing build scan...
https://ge.micronaut.io/s/xkc4dflt7k5dk

Missing documentation for HashiCorp Vault dynamic database secrets.

Issue description

Hi,

I tried to find information about HashiCorp Vault support and found:
https://docs.micronaut.io/latest/guide/index.html#distributedConfigurationVault
https://micronaut-projects.github.io/micronaut-discovery-client/latest/guide/configurationreference.html#io.micronaut.discovery.vault.config.VaultClientConfiguration

In configuration properties I do see that vault.client.secret-engine-name is by default set to secret so key value backend may be used. But what about dynamic database secrets described here? Are they supported? Does automatic rotation of database secret work in micronaut-discovery-client? If yes can someone please share an example?

Thank you!

Registration with Eureka doesn't work when using Micronaut serialization

Expected Behavior

Registration with Eureka should work when using Micronaut serialization just as it does when using Jackson serialization.

Actual Behaviour

During registration, Micronaut reports an error that PortWrapper could not be serialized:

Caused by: io.micronaut.serde.exceptions.SerdeException: No serializable introspection present for type PortWrapper portWrapper. Consider adding Serdeable. Serializable annotate to type PortWrapper portWrapper. Alternatively if you are not in control of the project's source code, you can use @SerdeImport(PortWrapper.class) to enable serialization of this type.
at io.micronaut.serde.support.serializers.ObjectSerializer$4.tryToFindSerializer(ObjectSerializer.java:218)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.lambda$getSerializer$0(ObjectSerializer.java:280)
at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.getSerializer(ObjectSerializer.java:278)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.support.serializers.CustomizedObjectSerializer.serialize(CustomizedObjectSerializer.java:132)
at io.micronaut.serde.support.serializers.ObjectSerializer$RuntimeTypeSerializer.serialize(ObjectSerializer.java:245)
at io.micronaut.serde.jackson.JacksonJsonMapper.writeValue(JacksonJsonMapper.java:114)
at io.micronaut.serde.jackson.JacksonJsonMapper.writeValue(JacksonJsonMapper.java:193)
at io.micronaut.json.body.JsonMessageHandler.writeTo(JsonMessageHandler.java:136)
... 45 common frames omitted

This seems like an easy fix – just adding @Serdeable to PortWrapper. However, when I clone the code and add the @Serdeable annotation to the PortWrapper, the registration still doesn't work. This time, the issue is with serializing the DataCenterInfo class. On the discovery service side (spring boot application), the following exception is logged (trimmed for conciseness):

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class com.netflix.appinfo.DataCenterInfo]: missing type id property '@Class'
at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 707]
at com.fasterxml.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) ~[jackson-databind-2.14.1.jar:2.14.1]
at com.fasterxml.jackson.databind.DeserializationContext.missingTypeIdException(DeserializationContext.java:2088) ~[jackson-databind-2.14.1.jar:2.14.1]

Looking at what's being sent, it seems that Micronaut serialization indeed does not include the @Class attribute into the json. Here's the resulting json:

{"instance":{"hostName":"localhost","port":{"@enabled":true,"$":8099},"securePort":{"@enabled":false,"$":0},"app":"transaction-service","instanceId":"transaction-service:8099","countryId":1,"ipAddr":"127.0.0.1","status":"UP","dataCenterInfo":{"dataCenterInfo":{"name":"MyOwn"},"leaseInfo":{"leaseInfo":{"registrationTimestamp":0,"lastRenewalTimestamp":0,"evictionTimestamp":0,"serviceUpTimestamp":0,"renewalIntervalInSecs":30,"durationInSecs":90},"statusPageUrl":"http://localhost:8099/health","homePageUrl":"http://localhost:8099","healthCheckUrl":"http://localhost:8099/health","vipAddress":"transaction-service","secureVipAddress":"transaction-service","secureHealthCheckUrl":"https://localhost/health"}}}}]

Steps To Reproduce

  1. Create a sample project using Micronaut Launch with a single feature of eureka-discovery (Java 17 + Maven).
  2. No changes to generated pom.xml are necessary (attached)
  3. Use the standard configuration for Eureka and make sure Eureka server is running on that port:
micronaut.application.name=demo
eureka.client.defaultZone=${EUREKA_HOST\:localhost}\:${EUREKA_PORT\:8761}
eureka.client.registration.enabled=true
  1. Run the application
  2. After adding the @Serdeable to the PortWrapper class, repeat the steps to see the second failure
    pom.txt

Environment Information

  • Operating system: Macos Ventura Apple Silicon
  • Java version: same behaviour using both 17 and 21

Example Application

No response

Version

4.2.0

Incorrect Order of precedence for Consul Distributed Configurations

Expected Behavior

In the documentation, we can read

Within the /config directory Micronaut searches values within the following directories in order of precedence:

Directory Description
/config/application Configuration shared by all applications
/config/application,prod Configuration shared by all applications for the prod Environment
/config/[APPLICATION_NAME] Application-specific configuration, example /config/hello-world
/config/[APPLICATION_NAME],prod Application-specific configuration for an active Environment

will should so have the order

  1. /config/application
  2. /config/application,prod
  3. /config/[APPLICATION_NAME]
  4. /config/[APPLICATION_NAME],prod

Actual Behaviour

The order applied instead is

  1. /config/application
  2. /config/[APPLICATION_NAME]
  3. /config/application,prod
  4. /config/[APPLICATION_NAME],prod

if we have a look inside the code of ConsulConfigurationClient

                for (LocalSource localSource: propertySources.values()) {
                    int priority;
                    if (localSource.environment != null) {
                        priority = envBasePriority + (activeNames.indexOf(localSource.environment) * 2);
                    } else {
                        priority = basePriority + 1;
                    }
                    if (localSource.appSpecific) {
                        priority++;
                    }
                    emitter.next(PropertySource.of(ConsulClient.SERVICE_ID + '-' + localSource.name, localSource.values, priority));
                }

we can easily see that we have an incrementation of the priority in case of appSpecific so we have correctly precedence for appSpecific over application (with and without environment)
but nothing is done to have the priority appSpecific > application,env

Steps To Reproduce

Using a simple test:

    private static class LocalSource {

        private final boolean appSpecific;
        private final String environment;
        private final String name;

        LocalSource(boolean appSpecific, String environment, String name) {
            this.appSpecific = appSpecific;
            this.environment = environment;
            this.name = name;
        }

        @Override
        public String toString() {
            if (environment != null && environment.length() > 0) {
                return "%s[%s]".formatted(name, environment);
            }

            return name;
        }
    }

    @Test
    void should_correctly_resolve_order_precedences() {
        // given
        int basePriority = EnvironmentPropertySource.POSITION + 100; // -100
        int envBasePriority = basePriority + 50; // -50
        List<String> activeNames = List.of("prod", "other");

        var localSources = List.of(
                new LocalSource(false, null, "application"),
                new LocalSource(false, "other", "application"),
                new LocalSource(false, "prod", "application"),
                new LocalSource(true, null, "my-app"),
                new LocalSource(true, "prod", "my-app"),
                new LocalSource(true, "other", "my-app"));

        // ACTUAL
        // when
        Map<String, Integer> priorities = new HashMap<>();
        for (LocalSource localSource : localSources) {
            int priority;
            if (localSource.environment != null) {
                priority = envBasePriority + (activeNames.indexOf(localSource.environment) * 2);
            } else {
                priority = basePriority + 1;
            }
            if (localSource.appSpecific) {
                priority++;
            }
            priorities.put(localSource.toString(), priority);
        }

        // then
        SoftAssertions.assertSoftly(softAssertions -> {
            softAssertions.assertThat(priorities.get("application")).isEqualTo(-99); // -100 + 1
            softAssertions.assertThat(priorities.get("my-app")).isEqualTo(-98); // (-100 + 1) + 1
            softAssertions.assertThat(priorities.get("application[prod]")).isEqualTo(-50); // -50 + (0 * 2)
            softAssertions.assertThat(priorities.get("my-app[prod]")).isEqualTo(-49); // (-50 + (0 * 2)) + 1
            softAssertions.assertThat(priorities.get("application[other]")).isEqualTo(-48); // -50 + (1 * 2)
            softAssertions.assertThat(priorities.get("my-app[other]")).isEqualTo(-47); // (-50 + (1 * 2)) + 1

            // => we get a mixed order of application/my-app precedences, not very easy to know where to put configuration correctly without it being overridden
        });

        // EXPECTING
        for (LocalSource localSource : localSources) {
            int priority;
            if (localSource.appSpecific) {
                if (localSource.environment != null) {
                    priority = envBasePriority + ((activeNames.indexOf(localSource.environment) + 1) * 2);
                } else {
                    priority = envBasePriority + 1;
                }
            } else {
                if (localSource.environment != null) {
                    priority = basePriority + ((activeNames.indexOf(localSource.environment) + 1) * 2);
                } else {
                    priority = basePriority + 1;
                }
            }
            priorities.put(localSource.toString(), priority);
        }

        // expecting something more like
        SoftAssertions.assertSoftly(softAssertions -> {
            // 1s the global application, followed by the environment ordered as given in activeNames
            softAssertions.assertThat(priorities.get("application")).isEqualTo(-99);
            softAssertions.assertThat(priorities.get("application[prod]")).isEqualTo(-98);
            softAssertions.assertThat(priorities.get("application[other]")).isEqualTo(-96);

            // then the app specific, followed by the environment ordered as given in activeNames
            softAssertions.assertThat(priorities.get("my-app")).isEqualTo(-49);
            softAssertions.assertThat(priorities.get("my-app[prod]")).isEqualTo(-48);
            softAssertions.assertThat(priorities.get("my-app[other]")).isEqualTo(-46);
        });
    }

Environment Information

No response

Example Application

No response

Version

3.4.3

Add flag for use name as prefix

Feature description

To use consul I have this config:

micronaut:
  application:
    name: myProject
  config-client:
    enabled: true

This will collect all key values from Consul which are in application and in myProject directory. This is cool.

But it also will collect all keys from myProject2. Which we do not want. I can imagine that this can be a handy feature. That I can have generic keys which will merge into other projects. But we have over 50 projects and we run into names which happen to start the same.

What we do now to work around this is adding a / at the end of the name. Which is a problem as profiles will not work any more. Than it will look for myProject/,profile1 instead of myProject,profile

So a solution could be that there is an option like this

micronaut:
  application:
    name: myProject
  config-client:
    enabled: true
    use-name-as-prefix: false

Which will not use the name as a prefix but only exact matches are allowed

Fast registration/deregistration leads to inconsistent Consul state

Some time ago we faced with unstable tests. They become very often on CI and rare at dev machine. I found out that there is an issue with registration and deregistration in consul (I'll prove logs and traces bellow)

Task List

  • Steps to reproduce provided
  • Stacktrace (if present) provided
  • Example that reproduces the problem uploaded to Github
  • Full description of the issue provided (see below)

Steps to Reproduce

  1. Create context with endpoints and client bean with annotation @Client(id = 'service-id', path = '/api/endpoint-path')
  2. Create fast test with annotation @MicronautTest (in my case it's validation configuration test)
  3. Create test with endpoint also annotated with @MicronautTest
  4. Make sure the fast test runs before test with endpoint

Expected Behaviour

in the first test app register and then deregister correctly and the second test goes OK

Actual Behaviour

first test call deregister earlier than register and make consul inconsistent
the second fails with stacktrace

?[36m18:57:37.257?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.env.DefaultEnvironment?[0;39m - Established active environments: [test]
?[36m18:57:37.263?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.DefaultBeanContext?[0;39m - Reading Startup environment from bootstrap.yml
?[36m18:57:37.319?[0;39m ?[1;30m[default-nioEventLoopGroup-3-3]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP PUT to http://localhost:8500/v1/agent/service/register
?[36m18:57:37.355?[0;39m ?[1;30m[default-nioEventLoopGroup-4-2]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/kv/config/myproject?recurse=true
?[36m18:57:37.356?[0;39m ?[1;30m[default-nioEventLoopGroup-4-1]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/kv/config/application?recurse=true
?[36m18:57:37.359?[0;39m ?[1;30m[default-nioEventLoopGroup-4-2]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 404 from http://localhost:8500/v1/kv/config/myproject?recurse=true
?[36m18:57:37.367?[0;39m ?[1;30m[default-nioEventLoopGroup-4-1]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 404 from http://localhost:8500/v1/kv/config/application?recurse=true
?[36m18:57:37.371?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.discovery.client.config.DistributedPropertySourceLocator?[0;39m - Resolved 0 configuration sources from client: compositeConfigurationClient(consul)
?[36m18:57:37.400?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-2 - Starting...
?[36m18:57:37.408?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-2 - Start completed.
?[36m18:57:37.421?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.flyway.AbstractFlywayMigration?[0;39m - Cleaning schema for database with qualifier [default]
?[36m18:57:37.423?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.license.VersionPrinter?[0;39m - Flyway Community Edition 7.0.4 by Redgate
?[36m18:57:37.426?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.database.base.DatabaseType?[0;39m - Database: jdbc:postgresql://localhost:5432/jdkmn_main_test (PostgreSQL 12.4)
?[36m18:57:37.435?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully dropped pre-schema database level objects (execution time 00:00.000s)
?[36m18:57:37.462?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully cleaned schema "public" (execution time 00:00.026s)
?[36m18:57:37.463?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully dropped post-schema database level objects (execution time 00:00.000s)
?[36m18:57:37.528?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.flyway.AbstractFlywayMigration?[0;39m - Running migrations for database with qualifier [default]
?[36m18:57:37.529?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.license.VersionPrinter?[0;39m - Flyway Community Edition 7.0.4 by Redgate
?[36m18:57:37.556?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbValidate?[0;39m - Successfully validated 2 migrations (execution time 00:00.013s)
?[36m18:57:37.569?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory?[0;39m - Creating Schema History table "public"."flyway_schema_history" ...
?[36m18:57:37.588?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Current version of schema "public": << Empty Schema >>
?[36m18:57:37.593?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Migrating schema "public" to version "0.0 - create-testing-schema"
?[36m18:57:37.608?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Migrating schema "public" to version "1.0 - initial-ddl"
?[36m18:57:37.627?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Successfully applied 2 migrations to schema "public" (execution time 00:00.044s)
?[36m18:57:37.704?[0;39m ?[1;30m[default-nioEventLoopGroup-5-3]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP PUT to http://localhost:8500/v1/agent/service/register
?[36m18:57:37.714?[0;39m ?[1;30m[default-nioEventLoopGroup-5-3]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 200 from http://localhost:8500/v1/agent/service/register
?[36m18:57:37.715?[0;39m ?[1;30m[default-nioEventLoopGroup-5-3]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.discovery.registration.AutoRegistration?[0;39m - Registered service [myproject] with Consul
?[36m18:57:38.019?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.cluster?[0;39m - Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms'}
?[36m18:57:38.064?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.cluster?[0;39m - Cluster description not yet available. Waiting for 30000 ms before timing out
?[36m18:57:38.102?[0;39m ?[1;30m[cluster-ClusterId{value='606e00a25e8b1707517304df', description='null'}-localhost:27017]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.connection?[0;39m - Opened connection [connectionId{localValue:1, serverValue:22}] to localhost:27017
?[36m18:57:38.102?[0;39m ?[1;30m[cluster-rtt-ClusterId{value='606e00a25e8b1707517304df', description='null'}-localhost:27017]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.connection?[0;39m - Opened connection [connectionId{localValue:2, serverValue:23}] to localhost:27017
?[36m18:57:38.116?[0;39m ?[1;30m[cluster-ClusterId{value='606e00a25e8b1707517304df', description='null'}-localhost:27017]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.cluster?[0;39m - Monitor thread successfully connected to server with description ServerDescription{address=localhost:27017, type=REPLICA_SET_PRIMARY, state=CONNECTED, ok=true, minWireVersion=0, maxWireVersion=8, maxDocumentSize=16777216, logicalSessionTimeoutMinutes=30, roundTripTimeNanos=31479707, setName='rs0', canonicalAddress=mongo:27017, hosts=[mongo:27017], passives=[mongo-repl1:27018, mongo-repl2:27019], arbiters=[], primary='mongo:27017', tagSet=TagSet{[]}, electionId=7fffffff0000000000000001, setVersion=1, topologyVersion=null, lastWriteDate=Wed Apr 07 18:57:31 UTC 2021, lastUpdateTimeNanos=894121323822}
?[36m18:57:38.264?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.mongodb.driver.connection?[0;39m - Opened connection [connectionId{localValue:3, serverValue:24}] to localhost:27017
?[36m18:57:38.530?[0;39m ?[1;30m[default-nioEventLoopGroup-5-4]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/health/service/myproject?passing=false
?[36m18:57:38.538?[0;39m ?[1;30m[default-nioEventLoopGroup-5-4]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 200 from http://localhost:8500/v1/health/service/myproject?passing=false
?[36m18:57:38.654?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[1;31mERROR?[0;39m ?[35mio.micronaut.retry.intercept.RecoveryInterceptor?[0;39m - Type [myproject.NavigationFsControllerSpec$NavigationFsControllerClient$Intercepted] executed with error: Connect Error: Connection refused: localhost/127.0.0.1:28394
io.micronaut.http.client.exceptions.HttpClientException: Connect Error: Connection refused: localhost/127.0.0.1:28394
	at io.micronaut.http.client.netty.DefaultHttpClient.lambda$null$34(DefaultHttpClient.java:1119)
	at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571)
	at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550)
	at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)
	at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)
	at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:609)
	at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:117)
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:321)
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:337)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:707)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:28394
Caused by: java.net.ConnectException: Connection refused
	at java.base/sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
	at java.base/sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:779)
	at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)
	at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:707)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:834)

What happens in consul

==> Found address '172.18.0.3' for interface 'eth0', setting bind option...
==> Starting Consul agent...
           Version: '1.8.9'
           Node ID: '34af0a18-a36b-e150-61c6-1b9fbb6abf99'
         Node name: '0e17b5bd8380'
        Datacenter: 'dc1' (Segment: '<all>')
            Server: true (Bootstrap: false)
       Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
      Cluster Addr: 172.18.0.3 (LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

==> Log data will now stream in as it occurs:

    2021-04-07T18:55:24.940Z [INFO]  agent.server.raft: initial configuration: index=1 servers="[{Suffrage:Voter ID:34af0a18-a36b-e150-61c6-1b9fbb6abf99 Address:172.18.0.3:8300}]"
    2021-04-07T18:55:24.940Z [INFO]  agent.server.serf.wan: serf: EventMemberJoin: 0e17b5bd8380.dc1 172.18.0.3
    2021-04-07T18:55:24.940Z [INFO]  agent.server.serf.lan: serf: EventMemberJoin: 0e17b5bd8380 172.18.0.3
    2021-04-07T18:55:24.941Z [INFO]  agent.router: Initializing LAN area manager
    2021-04-07T18:55:24.941Z [INFO]  agent.server: Adding LAN server: server="0e17b5bd8380 (Addr: tcp/172.18.0.3:8300) (DC: dc1)"
    2021-04-07T18:55:24.941Z [INFO]  agent.server: Handled event for server in area: event=member-join server=0e17b5bd8380.dc1 area=wan
    2021-04-07T18:55:24.941Z [INFO]  agent: Started DNS server: address=0.0.0.0:8600 network=udp
    2021-04-07T18:55:24.941Z [INFO]  agent.server.raft: entering follower state: follower="Node at 172.18.0.3:8300 [Follower]" leader=
    2021-04-07T18:55:24.941Z [INFO]  agent: Started DNS server: address=0.0.0.0:8600 network=tcp
    2021-04-07T18:55:24.942Z [INFO]  agent: Started HTTP server: address=[::]:8500 network=tcp
    2021-04-07T18:55:24.942Z [INFO]  agent: Started gRPC server: address=[::]:8502 network=tcp
    2021-04-07T18:55:24.942Z [INFO]  agent: started state syncer
==> Consul agent running!
    2021-04-07T18:55:24.981Z [WARN]  agent.server.raft: heartbeat timeout reached, starting election: last-leader=
    2021-04-07T18:55:24.982Z [INFO]  agent.server.raft: entering candidate state: node="Node at 172.18.0.3:8300 [Candidate]" term=2
    2021-04-07T18:55:24.982Z [DEBUG] agent.server.raft: votes: needed=1
    2021-04-07T18:55:24.982Z [DEBUG] agent.server.raft: vote granted: from=34af0a18-a36b-e150-61c6-1b9fbb6abf99 term=2 tally=1
    2021-04-07T18:55:24.982Z [INFO]  agent.server.raft: election won: tally=1
    2021-04-07T18:55:24.982Z [INFO]  agent.server.raft: entering leader state: leader="Node at 172.18.0.3:8300 [Leader]"
    2021-04-07T18:55:24.982Z [INFO]  agent.server: cluster leadership acquired
    2021-04-07T18:55:24.982Z [DEBUG] agent.server: Cannot upgrade to new ACLs: leaderMode=0 mode=0 found=true leader=172.18.0.3:8300
    2021-04-07T18:55:24.982Z [INFO]  agent.server: New leader elected: payload=0e17b5bd8380
    2021-04-07T18:55:24.982Z [INFO]  agent.leader: started routine: routine="federation state anti-entropy"
    2021-04-07T18:55:24.983Z [INFO]  agent.leader: started routine: routine="federation state pruning"
    2021-04-07T18:55:24.983Z [DEBUG] connect.ca.consul: consul CA provider configured: id=07:80:c8:de:f6:41:86:29:8f:9c:b8:17:d6:48:c2:d5:c5:5c:7f:0c:03:f7:cf:97:5a:a7:c1:68:aa:23:ae:81 is_primary=true
    2021-04-07T18:55:24.989Z [INFO]  agent.server.connect: initialized primary datacenter CA with provider: provider=consul
    2021-04-07T18:55:24.990Z [INFO]  agent.leader: started routine: routine="intermediate cert renew watch"
    2021-04-07T18:55:24.990Z [INFO]  agent.leader: started routine: routine="CA root pruning"
    2021-04-07T18:55:24.990Z [DEBUG] agent.server: Skipping self join check for node since the cluster is too small: node=0e17b5bd8380
    2021-04-07T18:55:24.990Z [INFO]  agent.server: member joined, marking health alive: member=0e17b5bd8380
    2021-04-07T18:55:25.013Z [INFO]  agent.server: federation state anti-entropy synced
    2021-04-07T18:55:25.073Z [DEBUG] agent: Skipping remote check since it is managed automatically: check=serfHealth
    2021-04-07T18:55:25.073Z [INFO]  agent: Synced node info
    2021-04-07T18:55:26.407Z [DEBUG] agent: Skipping remote check since it is managed automatically: check=serfHealth
    2021-04-07T18:55:26.407Z [DEBUG] agent: Node info in sync
    2021-04-07T18:55:26.407Z [DEBUG] agent: Node info in sync
    2021-04-07T18:56:24.982Z [DEBUG] agent.server: Skipping self join check for node since the cluster is too small: node=0e17b5bd8380
    2021-04-07T18:56:33.857Z [DEBUG] agent: Skipping remote check since it is managed automatically: check=serfHealth
    2021-04-07T18:56:33.857Z [DEBUG] agent: Node info in sync
    2021-04-07T18:57:24.941Z [DEBUG] agent.router.manager: Rebalanced servers, new active server: number_of_servers=1 active_server="0e17b5bd8380.dc1 (Addr: tcp/172.18.0.3:8300) (DC: dc1)"
    2021-04-07T18:57:24.941Z [DEBUG] agent.router.manager: Rebalanced servers, new active server: number_of_servers=1 active_server="0e17b5bd8380 (Addr: tcp/172.18.0.3:8300) (DC: dc1)"
    2021-04-07T18:57:24.982Z [DEBUG] agent.server: Skipping self join check for node since the cluster is too small: node=0e17b5bd8380
    2021-04-07T18:57:34.982Z [DEBUG] agent.http: Request finished: method=GET url=/v1/kv/config/application?recurse=true from=172.18.0.1:35540 latency=88.79µs
    2021-04-07T18:57:34.985Z [DEBUG] agent.http: Request finished: method=GET url=/v1/kv/config/myproject?recurse=true from=172.18.0.1:35536 latency=64.455µs
        2021-04-07T18:57:37.177Z [WARN]  agent: Failed to deregister service: service=myproject:28394 error="Service {"myproject:28394" {}} does not exist"
    2021-04-07T18:57:37.177Z [DEBUG] agent: Node info in sync
    2021-04-07T18:57:37.177Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/deregister/myproject%3A28394 from=172.18.0.1:35590 latency=647.099µs
    2021-04-07T18:57:37.350Z [DEBUG] agent: Node info in sync
    2021-04-07T18:57:37.350Z [INFO]  agent: Synced service: service=myproject:28394
    2021-04-07T18:57:37.350Z [DEBUG] agent: Check in sync: check=service:myproject:28394
    2021-04-07T18:57:37.350Z [DEBUG] agent.http: Request finished: method=PUT url=/v1/agent/service/register from=172.18.0.1:35586 latency=3.44803ms
    2021-04-07T18:57:37.350Z [DEBUG] agent: Node info in sync
    2021-04-07T18:57:37.350Z [DEBUG] agent: Service in sync: service=myproject:28394
    2021-04-07T18:57:37.350Z [DEBUG] agent: Check in sync: check=service:myproject:28394
    2021-04-07T18:57:37.357Z [DEBUG] agent.http: Request finished: method=GET url=/v1/kv/config/myproject?recurse=true from=172.18.0.1:35598 latency=48.017µs
    2021-04-07T18:57:37.360Z [DEBUG] agent.http: Request finished: method=GET url=/v1/kv/config/application?recurse=true from=172.18.0.1:35594 latency=60.014µs

You can see log

2021-04-07T18:57:37.177Z [WARN]  agent: Failed to deregister service: service=myproject:28394 error="Service {"myproject:28394" {}} does not exist"

appears earlier than registration bellow. We use random port configuration so every test uses it's own port

my fast test looks like

@MicronautTest(application = TestingApplication)
class MicronautValidationSpec extends Specification {
    @Inject Validator validator

    void "dto is validated with validator"() {
       //some code 
    }

    def "hack for very fast register and deregister in consul" (){
        when: "on CI it can leads to inconsistency in consult when all integration test takes several ms"
        sleep(500)

        then: 'deregister done correctly'
        noExceptionThrown()
    }
}

and this is it's log

?[36m18:57:33.077?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.env.DefaultEnvironment?[0;39m - Established active environments: [test]
?[36m18:57:33.102?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.env.DefaultEnvironment?[0;39m - Established active environments: [test]
?[36m18:57:33.134?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.context.DefaultBeanContext?[0;39m - Reading Startup environment from bootstrap.yml
?[36m18:57:34.925?[0;39m ?[1;30m[default-nioEventLoopGroup-1-2]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/kv/config/jdkmn-main?recurse=true
?[36m18:57:34.927?[0;39m ?[1;30m[default-nioEventLoopGroup-1-1]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP GET to http://localhost:8500/v1/kv/config/application?recurse=true
?[36m18:57:34.991?[0;39m ?[1;30m[default-nioEventLoopGroup-1-2]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 404 from http://localhost:8500/v1/kv/config/jdkmn-main?recurse=true
?[36m18:57:34.993?[0;39m ?[1;30m[default-nioEventLoopGroup-1-1]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 404 from http://localhost:8500/v1/kv/config/application?recurse=true
?[36m18:57:35.004?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.discovery.client.config.DistributedPropertySourceLocator?[0;39m - Resolved 0 configuration sources from client: compositeConfigurationClient(consul)
?[36m18:57:35.519?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-1 - Starting...
?[36m18:57:35.603?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-1 - Start completed.
?[36m18:57:35.610?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.flyway.AbstractFlywayMigration?[0;39m - Cleaning schema for database with qualifier [default]
?[36m18:57:35.622?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.license.VersionPrinter?[0;39m - Flyway Community Edition 7.0.4 by Redgate
?[36m18:57:35.669?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.database.base.DatabaseType?[0;39m - Database: jdbc:postgresql://localhost:5432/myproject_test (PostgreSQL 12.4)
?[36m18:57:35.705?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully dropped pre-schema database level objects (execution time 00:00.000s)
?[36m18:57:35.730?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully cleaned schema "public" (execution time 00:00.022s)
?[36m18:57:35.731?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbClean?[0;39m - Successfully dropped post-schema database level objects (execution time 00:00.000s)
?[36m18:57:36.130?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.flyway.AbstractFlywayMigration?[0;39m - Running migrations for database with qualifier [default]
?[36m18:57:36.131?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.license.VersionPrinter?[0;39m - Flyway Community Edition 7.0.4 by Redgate
?[36m18:57:36.184?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbValidate?[0;39m - Successfully validated 2 migrations (execution time 00:00.029s)
?[36m18:57:36.196?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.schemahistory.JdbcTableSchemaHistory?[0;39m - Creating Schema History table "public"."flyway_schema_history" ...
?[36m18:57:36.232?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Current version of schema "public": << Empty Schema >>
?[36m18:57:36.238?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Migrating schema "public" to version "0.0 - create-testing-schema"
?[36m18:57:36.267?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Migrating schema "public" to version "1.0 - initial-ddl"
?[36m18:57:36.291?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35morg.flywaydb.core.internal.command.DbMigrate?[0;39m - Successfully applied 2 migrations to schema "public" (execution time 00:00.068s)
?[36m18:57:37.146?[0;39m ?[1;30m[default-nioEventLoopGroup-3-6]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Sending HTTP PUT to http://localhost:8500/v1/agent/service/deregister/jdkmn-main%3A28394
?[36m18:57:37.178?[0;39m ?[1;30m[default-nioEventLoopGroup-3-6]?[0;39m [/] ?[39mDEBUG?[0;39m ?[35mio.micronaut.http.client.netty.DefaultHttpClient?[0;39m - Received response 200 from http://localhost:8500/v1/agent/service/deregister/jdkmn-main%3A28394
?[36m18:57:37.180?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mio.micronaut.discovery.registration.AutoRegistration?[0;39m - De-registered service [jdkmn-main] with Consul
?[36m18:57:37.213?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-1 - Shutdown initiated...
?[36m18:57:37.244?[0;39m ?[1;30m[Test worker]?[0;39m [/] ?[34mINFO ?[0;39m ?[35mcom.zaxxer.hikari.HikariDataSource?[0;39m - HikariPool-1 - Shutdown completed.

You can see that timing is odd in consul, looks like registering takes more time and deregistering ignores fails and during heartbeat (I think) all next tests can see wrong registration

How I create my clients inside test

@MicronautTest(application = TestingApplication, rollback = false, transactional = false)
class NavigationFsControllerSpec extends Specification {
    @Inject NavigationFsControllerClient client

    //tests

    @Client(id = 'jmyproject', path = '/api/web/navigation')
    static interface NavigationFsControllerClient extends NavigationFsEndpoints {} 
}

Environment Information

  • Operating System: Ubuntu Linux 20.04 + 18.04 (CI)
  • Micronaut Version: 2.2.1
  • JDK Version: openjdk 11.0.10 2021-01-19 LTS
  • testing framework: spock
  • lang: groovy
  • Consul and other services are in docker (via docker compose)

Example Application

  • TODO: link to github repository with example that reproduces the issue

Consul deregistration not working for multi-registered application

Expected Behavior

GIVEN an application with both netty and gRPC server
WHEN application start
THEN both server are registered as service
WHEN application stop
THEN both services are deregistered

Actual Behaviour

The 1st server (netty) only is deregistered, the seconde one (gRPC) is on timeout

2023-06-28 15:39:46,059 INFO [main ] [GrpcEmbeddedServerListener.java] - GRPC started on port 9380 - [] - []
2023-06-28 15:39:46,062 INFO [main ] [Micronaut.java] - Startup completed in 1538ms. Server Running: http://localhost:9381 - [] - []
2023-06-28 15:39:46,092 INFO [default-nioEventLoopGroup-3-2] [DiscoveryServiceAutoRegistration.java] - Registered service [my-applicationr-grpc] with Consul - [] - []
2023-06-28 15:39:46,094 INFO [default-nioEventLoopGroup-3-3] [DiscoveryServiceAutoRegistration.java] - Registered service [my-application] with Consul - [] - []
Disconnected from the target VM, address: '127.0.0.1:51820', transport: 'socket'
2023-06-28 15:39:49,621 INFO [Thread-4 ] [Micronaut.java] - Embedded Application shutting down - [] - []
2023-06-28 15:39:49,651 INFO [Thread-4 ] [DiscoveryServiceAutoRegistration.java] - De-registered service [generic-data-provider] with Consul - [] - []
2023-06-28 15:39:49,652 INFO [Thread-4 ] [ApplicationLifeCycleHook.java] - Cooling down - [] - []
2023-06-28 15:39:49,652 INFO [Thread-4 ] [ApplicationLifeCycleHook.java] - Cooling down - [] - []
2023-06-28 15:39:49,656 INFO [ForkJoinPool.commonPool-worker-4] [ConsulConfigurationsWatchesHook.java] - All watches closed - [] - []
2023-06-28 15:39:49,656 INFO [ForkJoinPool.commonPool-worker-4] [ConsulConfigurationsWatchesHook.java] - All watches closed - [] - []
2023-06-28 15:39:55,785 WARN [parallel-7] [AbstractChannel.java:490] - Force-closing a channel whose registration task was not accepted by an event loop: [id: 0xd7b3aa4c] - [] - [] -
java.util.concurrent.RejectedExecutionException: event executor terminated
at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:934)
at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:351)
at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:344)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:836)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:827)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:817)
at io.netty.channel.AbstractChannel$AbstractUnsafe.register(AbstractChannel.java:483)
at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:89)
at io.netty.channel.SingleThreadEventLoop.register(SingleThreadEventLoop.java:83)
at io.netty.channel.MultithreadEventLoopGroup.register(MultithreadEventLoopGroup.java:86)
at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:323)
at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:155)
at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:139)
at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:123)
at io.micronaut.http.client.netty.ConnectionManager.doConnect(ConnectionManager.java:419)
at io.micronaut.http.client.netty.ConnectionManager.lambda$connectForExchange$8(ConnectionManager.java:487)
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58)
at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
at io.micronaut.configuration.metrics.binder.web.WebMetricsPublisher.subscribe(WebMetricsPublisher.java:151)
at reactor.core.publisher.Flux.subscribe(Flux.java:8660)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.subscribeInner(FluxSwitchMapNoPrefetch.java:218)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.onNext(FluxSwitchMapNoPrefetch.java:164)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
at reactor.core.publisher.MonoCallable$MonoCallableSubscription.request(MonoCallable.java:156)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.onSubscribe(FluxSwitchMapNoPrefetch.java:147)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96)
at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:48)
at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
at reactor.core.publisher.FluxDelaySubscription.accept(FluxDelaySubscription.java:59)
at reactor.core.publisher.FluxDelaySubscription.accept(FluxDelaySubscription.java:36)
at reactor.core.publisher.FluxDelaySubscription$DelaySubscriptionOtherSubscriber.onNext(FluxDelaySubscription.java:131)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:271)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:286)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
... (lot of the same error)
2023-06-28 15:40:45,898 ERROR [scheduled-executor-thread-4] [DefaultPromise.java:864] - Failed to submit a listener notification task. Event loop shut down? - [] - [] -
java.util.concurrent.RejectedExecutionException: event executor terminated
at io.netty.util.concurrent.SingleThreadEventExecutor.reject(SingleThreadEventExecutor.java:934)
at io.netty.util.concurrent.SingleThreadEventExecutor.offerTask(SingleThreadEventExecutor.java:351)
at io.netty.util.concurrent.SingleThreadEventExecutor.addTask(SingleThreadEventExecutor.java:344)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:836)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute0(SingleThreadEventExecutor.java:827)
at io.netty.util.concurrent.SingleThreadEventExecutor.execute(SingleThreadEventExecutor.java:817)
at io.netty.util.concurrent.DefaultPromise.safeExecute(DefaultPromise.java:862)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:500)
at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:185)
at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:95)
at io.netty.channel.DefaultChannelPromise.addListener(DefaultChannelPromise.java:30)
at io.micronaut.http.client.netty.ConnectionManager.addInstrumentedListener(ConnectionManager.java:905)
at io.micronaut.http.client.netty.ConnectionManager.lambda$connectForExchange$8(ConnectionManager.java:488)
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58)
at reactor.core.publisher.InternalFluxOperator.subscribe(InternalFluxOperator.java:62)
at io.micronaut.configuration.metrics.binder.web.WebMetricsPublisher.subscribe(WebMetricsPublisher.java:151)
at reactor.core.publisher.Flux.subscribe(Flux.java:8660)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.subscribeInner(FluxSwitchMapNoPrefetch.java:218)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.onNext(FluxSwitchMapNoPrefetch.java:164)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:129)
at reactor.core.publisher.MonoCallable$MonoCallableSubscription.request(MonoCallable.java:156)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:171)
at reactor.core.publisher.FluxSwitchMapNoPrefetch$SwitchMapMain.onSubscribe(FluxSwitchMapNoPrefetch.java:147)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96)
at reactor.core.publisher.MonoCallable.subscribe(MonoCallable.java:48)
at reactor.core.publisher.Flux.subscribe(Flux.java:8660)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:426)
at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:272)
at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:230)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:371)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:165)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:87)
at reactor.core.publisher.Mono.subscribe(Mono.java:4444)
at io.micronaut.management.health.monitor.HealthMonitorTask.monitor(HealthMonitorTask.java:98)
at io.micronaut.management.health.monitor.$HealthMonitorTask$Definition$Exec.dispatch(Unknown Source)
at io.micronaut.context.AbstractExecutableMethodsDefinition$DispatchedExecutableMethod.invoke(AbstractExecutableMethodsDefinition.java:371)
at io.micronaut.inject.DelegatingExecutableMethod.invoke(DelegatingExecutableMethod.java:76)
at io.micronaut.scheduling.processor.ScheduledMethodProcessor.lambda$process$5(ScheduledMethodProcessor.java:127)
at io.micrometer.core.instrument.composite.CompositeTimer.record(CompositeTimer.java:141)
at io.micrometer.core.instrument.Timer.lambda$wrap$0(Timer.java:196)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.runAndReset$$$capture(FutureTask.java:305)
at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
2023-06-28 15:40:45,904 ERROR [ForkJoinPool.commonPool-worker-4] [HealthMonitorTask.java:116] - Health monitor check failed with exception: Unable to start GRPC server: Failed to bind to address 0.0.0.0/0.0.0.0:9380 - [] - [] -
io.micronaut.runtime.exceptions.ApplicationStartupException: Unable to start GRPC server: Failed to bind to address 0.0.0.0/0.0.0.0:9380
at io.micronaut.grpc.server.GrpcEmbeddedServer.start(GrpcEmbeddedServer.java:194)
at io.micronaut.grpc.server.GrpcEmbeddedServer.getPort(GrpcEmbeddedServer.java:130)
at io.micronaut.grpc.server.health.GrpcServerHealthIndicator.getHealthResult(GrpcServerHealthIndicator.java:76)
at io.micronaut.core.async.publisher.AsyncSingleResultPublisher$ExecutorServiceSubscription.lambda$request$1(AsyncSingleResultPublisher.java:100)
at java.base/java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1375)
at java.base/java.util.concurrent.ForkJoinTask.doExec$$$capture(ForkJoinTask.java:373)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1182)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1655)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1622)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:165)
Caused by: java.io.IOException: Failed to bind to address 0.0.0.0/0.0.0.0:9380
at io.grpc.netty.NettyServer.start(NettyServer.java:328)
at io.grpc.internal.ServerImpl.start(ServerImpl.java:184)
at io.grpc.internal.ServerImpl.start(ServerImpl.java:93)
at io.micronaut.grpc.server.GrpcEmbeddedServer.start(GrpcEmbeddedServer.java:169)
... 10 common frames omitted
Caused by: java.net.BindException: Address already in use
at java.base/sun.nio.ch.Net.bind0(Native Method)
at java.base/sun.nio.ch.Net.bind(Net.java:555)
at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337)
at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294)
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:141)
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:562)
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1334)
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:600)
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:579)
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:973)
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:260)
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:356)
at io.netty.util.concurrent.AbstractEventExecutor.runTask$$$capture(AbstractEventExecutor.java:174)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:167)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
2023-06-28 15:40:49,805 ERROR [Thread-4] [DiscoveryServiceAutoRegistration.java:140] - Error occurred de-registering service [generic-data-provider-grpc] with Consul: Read Timeout - [] - [] -
io.micronaut.http.client.exceptions.ReadTimeoutException: Read Timeout
at io.micronaut.http.client.exceptions.ReadTimeoutException.(ReadTimeoutException.java:26)
at io.micronaut.http.client.netty.DefaultHttpClient.lambda$exchangeImpl$33(DefaultHttpClient.java:1097)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94)
at reactor.core.publisher.SerializedSubscriber.onError(SerializedSubscriber.java:124)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.handleTimeout(FluxTimeout.java:295)
at reactor.core.publisher.FluxTimeout$TimeoutMainSubscriber.doTimeout(FluxTimeout.java:280)
at reactor.core.publisher.FluxTimeout$TimeoutTimeoutSubscriber.onNext(FluxTimeout.java:419)
at reactor.core.publisher.FluxOnErrorReturn$ReturnSubscriber.onNext(FluxOnErrorReturn.java:162)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.propagateDelay(MonoDelay.java:271)
at reactor.core.publisher.MonoDelay$MonoDelayRunnable.run(MonoDelay.java:286)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68)
at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28)
at java.base/java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:264)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)

Process finished with exit code 130 (interrupted by signal 2: SIGINT)

Note: suffixing grpc instance

consul:
  client:
    registration:
      enabled: true
grpc:
  server:
    instance-id: ${micronaut.application.name}-grpc

Steps To Reproduce

  1. Create a simple application with netty and grpc server
  2. Have a consul (docker) running
  3. Have the consul registration enabled
  4. Start the application
  5. Stop the application

Environment Information

  • MacOs Ventura 13.4
  • JDK 17
  • Consul 1.11.2 -> 1.16.0 (issue in all these versions)

Example Application

No response

Version

3.3.1

Support watching Consul for changes

When combining @value with a Configuration Server like Consul, the changes to the properties in Consul are not propagated automatically to the beans that reference them

We can only force it using the /refresh endpoint that would reload all the beans annotated with Refreshable.

Micronaut could benefit if a mechanism is in place in order to subcsribe to events Consul changes, in order to perform the same action, without the need of hitting the refresh endpoint

Issue with resolving environment in consul config

Expected Behavior

Using consul config (format: FILE), in ConsulConfigurationClient class the resolveEnvironment method should correctly determine the envName variable allowing it to find the appropriate environment configuration.

Running the application with MICRONAUT_ENVIRONMENTS={ENV_NAME} should result in overwriting the default properties with those from the environment file.

I created the Pull Request #532.

Actual Behaviour

Running the application with MICRONAUT_ENVIRONMENTS={ENV_NAME} with the existing code, the value of the envName variable will never be resolved correctly.

For example: if the name of the configuration file is my-service-prod.yaml (where prod is the name of the environment) and we provide fileName as a parameter (value is my-service-prod) instead of finalName (value is my-service[alpha]), then resolveEnvironment method will not be able to find environment.

The effect is that consul will overwrite the environment configuration with the standard configuration (e.g. my-service.yaml), i.e. the environment configuration will not be considered appropriate. If the same properties will be used, then result of that property will be from standard config file, not file with environment.

Steps To Reproduce

  1. Create standard configuration for service (ex. my-service.yaml (! no application.yml)) with value:
mongodb:
  uri: mongodb://127.0.0.1:27017/standard
  1. Create configuration with environment (ex. my-service-prod.yml)
mongodb:
  uri: mongodb://127.0.0.1:27017/prod
  1. Run the application with MICRONAUT_ENVIRONMENTS=prod

The environment will not be considered appropriate. If the same properties will be used, then result will be connecting to db named standard instead of prod.

Environment Information

No response

Example Application

No response

Version

3.8.7 - *

Add property name inside spring.cloud.config

Spring Cloud Configuration supports a property called name inside spring.cloud.config configuration, Micronaut does not. This configuration is interesting because sometimes the configuration file name differs from project name. Besides that, Spring Cloud Config supports a list of file names, like file1, file2, file3. This is useful when you share some configuration files between microservices, like logging configurations for example.

Task List

  • Steps to reproduce provided
  • Stacktrace (if present) provided
  • Example that reproduces the problem uploaded to Github
  • Full description of the issue provided (see below)

Steps to Reproduce

  1. TODO
  2. TODO
  3. TODO

Expected Behaviour

Read the file name from spring.cloud.config.name if it is set, otherwise read the name from micronaut.application.name

Actual Behaviour

Read the file name from micronaut.application.name

Environment Information

  • Operating System: TODO
  • Micronaut Version: TODO
  • JDK Version: TODO

Example Application

  • TODO: link to github repository with example that reproduces the issue

ConsulClient should provide session and lock management methods

v1.1.0.RC2.
ConsulClient currently doesn't provide any methods for releasing and acquiring locks and sessions.
https://www.consul.io/docs/internals/sessions.html

In addition to service discovery and distributed configuration management, sessions API is a very useful mechanism in Consul for implementing leader election or distributed semaphores. I had no previous experience working with Micronaut, or Consul, but I was able to come up with this class that gets the basic job done. Perhaps you could improve on it to add session management to the ConsulClient.

Distributed Configuration for application name matching as "equals"

Issue description

Hello,

I don't think it is an issue or a new feature, but here is what we have:

  • an application named hello-world
  • an other application name hello-world-wide

when starting application for hello-world, its name matchs the configurations both applications when we want to have it matching only its own application configuration

In the code ConsulConfigurationClient#L167 we can see that the test is on the path match startsWith

boolean isApplicationSpecificConfigKey = hasApplicationSpecificConfig && key.startsWith(applicationSpecificPath);

Nowhere on the documentation there is any mention about the name matching strategy, so we though it was an equals

I understand that this startWith strategy help manage the environment key (hello-world,dev or hello-world,prod for instances), but can't it be handle in a way that let the exact matching for the name ?
Like

boolean isApplicationSpecificConfigKey = hasApplicationSpecificConfig && (key.equals(applicationSpecificPath) || key.startsWith(applicationSpecificPath + ","));

Thanks for your time

VaultConfigurationClient failed if 1 path is not found

Expected Behavior

If a path return 404 - NOT_FOUND, the application start

Actual Behaviour

The API return 404 - NOT_FOUND with a body

{
    "errors": []
}

and the application does not start and we got the error:

java.lang.IllegalAccessError: class io.micronaut.http.hateoas.JsonError$Creator4JacksonDeserializer066f2705 tried to access method 'void io.micronaut.http.hateoas.JsonError.()' (io.micronaut.http.hateoas.JsonError$Creator4JacksonDeserializer066f2705 is in unnamed module of loader com.fasterxml.jackson.module.afterburner.util.MyClassLoader @7e93f3b0; io.micronaut.http.hateoas.JsonError is in unnamed module of loader 'app')
at io.micronaut.http.hateoas.JsonError$Creator4JacksonDeserializer066f2705.createUsingDefault(io/micronaut/http/hateoas/JsonError$Creator4JacksonDeserializer.java)
at com.fasterxml.jackson.module.afterburner.deser.SuperSonicBeanDeserializer.deserialize(SuperSonicBeanDeserializer.java:136)
at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:323)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4730)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3771)
at io.micronaut.jackson.databind.JacksonDatabindMapper.readValue(JacksonDatabindMapper.java:119)
at io.micronaut.json.codec.MapperMediaTypeCodec.decode(MapperMediaTypeCodec.java:190)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.convertByteBuf(FullNettyClientHttpResponse.java:279)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.lambda$getBody$1(FullNettyClientHttpResponse.java:217)
at java.base/java.util.HashMap.computeIfAbsent(HashMap.java:1220)
at io.micronaut.http.client.netty.FullNettyClientHttpResponse.getBody(FullNettyClientHttpResponse.java:191)
at io.micronaut.http.client.exceptions.HttpClientResponseException.initResponse(HttpClientResponseException.java:95)
at io.micronaut.http.client.exceptions.HttpClientResponseException.(HttpClientResponseException.java:63)
at io.micronaut.http.client.exceptions.HttpClientResponseException.(HttpClientResponseException.java:50)
at io.micronaut.http.client.exceptions.HttpClientResponseException.(HttpClientResponseException.java:41)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.makeErrorFromRequestBody(DefaultHttpClient.java:2232)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.buildResponse(DefaultHttpClient.java:2194)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.buildResponse(DefaultHttpClient.java:2117)
at io.micronaut.http.client.netty.DefaultHttpClient$BaseHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2092)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2153)
at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2117)
at io.micronaut.http.client.netty.SimpleChannelInboundHandlerInstrumented.channelRead0(SimpleChannelInboundHandlerInstrumented.java:49)

If I understand it correctly, as the body returned by the response is not taken into account, the response generated has a null body, so the serializer try to use the empty constructor of JsonError which is package accessible only

    @Internal
    JsonError() {
    }

so can not be accessed by the Jackson and thus throw the error

I was able to pass through this issue by replacing client VaultConfigHttpClientV2 by a custom one, adding the errorType parameter to the client configuration

@Client(
     value = VaultClientConfiguration.VAULT_CLIENT_CONFIG_ENDPOINT, 
     configuration = VaultClientConfiguration.class, 
     errorType = VaultErrorV2.class)
@Replaces(io.micronaut.discovery.vault.config.v2.VaultConfigHttpClientV2.class)
@BootstrapContextCompatible
public interface VaultConfigHttpClientV2Fixed extends VaultConfigHttpClient<VaultResponseV2> {
...
}
@Introspected
public class VaultErrorV2 {

    protected List<String> errors;
    
    @JsonCreator
    @Internal
    public VaultErrorV2(@JsonProperty("errors") final List<String> errors) {
        this.errors = errors;
    }

    public List<String> getErrors() {
        return errors;
    }
}

Steps To Reproduce

I'll try to create a small project to reproduce it

Environment Information

  • Operating System: MacOs Ventura 13.3.1 (a)
  • JDK: 17.0.6-tem
  • IDE: IntelliJ IDEA 2023.1.2 (Ultimate Edition)
  • Vault (docker): 1.13.2

Example Application

No response

Version

3.9.1

Error cache service-registry spring eureka

Expected Behavior

Connect to eureka and get client id to call the api rest

Actual Behaviour

I received and error when i run the tests.

first, i received the next error:
i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: No cache configured for name: discovery-client

i activated the cache and change the cache to cafffeine and the error is the same.

second, i change the cache to redis cache including the next sentences in the properties.

redis:
caches:
discovery-client:
expire-after-access: 60s

and the error changed to the next:
18:07:07.296 [default-nioEventLoopGroup-1-12] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: I/O error occurred during serialization: io.micronaut.discovery.eureka.EurekaServiceInstance
io.micronaut.core.serialize.exceptions.SerializationException: I/O error occurred during serialization: io.micronaut.discovery.eureka.EurekaServiceInstance
at io.micronaut.core.serialize.JdkSerializer.serialize(JdkSerializer.java:63)

I do not which key and value i should to add to serializate the object correctly

Steps To Reproduce

No response

Environment Information

Windows 10
JDK 11

Example Application

No response

Version

2.3.0

HashiCorp Vault Binding seems not to work

Expected Behavior

Declaring a key-vault binding in the bootstrap.yml according to the documentation (https://docs.micronaut.io/latest/guide/#distributedConfigurationVault) should import keys provided in the vault into the application properties.

Actual Behaviour

When declaring a key-vault in the bootstrap.yml according to the documentation (https://docs.micronaut.io/latest/guide/#distributedConfigurationVault), micronaut fails with the error

12:14:28.292 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: No bean of type [io.micronaut.http.client.loadbalance.DiscoveryClientLoadBalancerFactory] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).

Without even contacting the actual key-vault.

Steps To Reproduce

  1. Checkout the example project, which also declares a consul binding for testing purposes
  2. Possibly necessary: Disable consul config in the project or launch a consul docker instance via
    docker run -d --name dev-consul --rm -p 8500:8500 consul
  3. Possibly necessary if the actual bug is mitigated: Launch a docker instance for vault:
    docker run -d --name dev-server --rm --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=vault-token' -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:1234' -p 1234:1234 vault
  4. Run application, the error occurs

Note: The code was created via web-start, but some additional configs (i.e. enabling discovery client) were added, as it seems necessary. Possibly the documentation needs updating, too.

Environment Information

  • OS: Microsoft Windows 10 Pro 10.0.19043 Build 19043
  • Java Version: AdoptOpenJDK, jdk-16.0.1.9-hotspot

Example Application

https://github.com/0xSpell/keyvault

Version

3.4.2

Add HashiCorp Vault subpath support

Feature description

Micronaut HashiCorp Vault supports structure of kv engine where applications secrets starts from engine root

Directory Description
/application Configuration shared by all applications
/[APPLICATION_NAME] Application-specific configuration
/application/[ENV_NAME] Configuration shared by all applications for an active environment name
/ Application-specific configuration for an active environment name

And there is no way to use secrets placed somewhere deeper in engine.

Creating secret engine for each project in companies with a lot of departments with a lot of projects will cause project hell in root of vault.

It would be great to add some optional property like vault.client.path-prefix where you can put smth like [PROJECT_NAME] or [GROUP_NAME]/[PROJECT_NAME]/[SUBPROJECT_NAME] with any level of depth

Directory Description
[PATH_PREFIX]/application Configuration shared by all applications
[PATH_PREFIX]/[APPLICATION_NAME] Application-specific configuration
[PATH_PREFIX]/application/[ENV_NAME] Configuration shared by all applications for an active environment name
[PATH_PREFIX]/ Application-specific configuration for an active environment name

Client id is always haphenated when using micronaut eureka discovery

I have a eureka micro-service whose service ID is in camelCaseForm, not kebab-case: TradingCenterService

Here is how a created a Client to consume this service:

@Client(id = "TradingCenterService")
public interface TradingCenterClient extends TradingCenterOperations {

    @Get("/v1/quotaTotal/query")
    Single<Result> callUserQuotaQuantity(@Body BaseUserCQQueryDto queryDto);
}

When it get called, it complained No available services for ID: trading-center-service

seems like it always hiphenate the serviceID, which in my case stops me from consuming services with camelCase serviceIDs.

Micronaut Searching Config Using Wrong Application Name In Spring Cloud Config

Problem Statement:
Let's say the micronaut.application.name is "MicronautConfigClientExample" and profile/environment is "test", it is actually searching for "micronaut-config-client-example" properties in Spring Config Server. Thus, unable to find the desired configuration. Is it possible to make the kebab format configurable so that developers can turn it off or on as per their own requirement and thus, they would be liable for the degraded performance ?.

Evidence Log:

19:00:41.855 [main] DEBUG i.m.d.s.c.SpringCloudConfigurationClient - Application Name: micronaut-config-client-example, Application Profiles: test, label: null

Guide references old io.micronaut:micronaut-discovery-client artifact

Expected Behavior

References "io.micronaut.discovery:micronaut-discovery-client"

Actual Behaviour

References "io.micronaut:micronaut-discovery-client"

Steps To Reproduce

Unfortunately I don't know how adoc resolves the dependency:micronaut-discovery-client thingy. Otherwise I'd create a PR :)

Environment Information

No response

Example Application

No response

Version

3.0.0

Consul service check fails with TTL expired on Kubernetes

Issue description

I am trying to mount this example on a kubernetes cluster 'https://guides.micronaut.io/latest/micronaut-microservices-services-discover-consul-gradle-kotlin.html'. Try to mount the 'bookcatalogue' service on the cluster first, do the configuration with the consul server. Fortunately, the service registers correctly, but after a few seconds the health check fails. as seen in the following image:

chekc-fails

The problem does not occur when I run the application locally or even when I use docker-compose.
The logs of the kubernetes cluster of the 'bookcatalogue' service are:

�[36m17:30:46.437�[0;39m �[1;30m[main]�[0;39m �[34mINFO �[0;39m �[35mi.m.context.env.DefaultEnvironment�[0;39m - Established active environments: [k8s, cloud]
�[36m17:30:46.447�[0;39m �[1;30m[main]�[0;39m �[34mINFO �[0;39m �[35mi.m.context.env.DefaultEnvironment�[0;39m - Established active environments: [k8s, cloud]
�[36m17:30:46.650�[0;39m �[1;30m[main]�[0;39m �[34mINFO �[0;39m �[35mi.m.context.DefaultBeanContext�[0;39m - Reading bootstrap environment configuration
�[36m17:30:55.257�[0;39m �[1;30m[main]�[0;39m �[34mINFO �[0;39m �[35mio.micronaut.runtime.Micronaut�[0;39m - Startup completed in 11295ms. Server Running: http://bookcatalogue-74f7958b5-5gp7d:8080
�[36m17:30:57.556�[0;39m �[1;30m[default-nioEventLoopGroup-1-2]�[0;39m �[34mINFO �[0;39m �[35mi.m.d.registration.AutoRegistration�[0;39m - Registered service [bookcatalogue] with Consul

In the consul-server logs I get the following:

2022-04-09T17:37:27.289Z [INFO] agent.http: Request cancelled: method=GET url=/v1/health/service/bookcatalogue?dc=dc1&index=3889 from=127.0.0.1:47192 error="context canceled"
2022-04-09T17:38:34.688Z [INFO] agent.http: Request cancelled: method=GET url=/v1/health/service/bookcatalogue?dc=dc1&index=3889 from=127.0.0.1:47262 error="context canceled"

I really don't know if I'm configuring consul wrong, this is my config file (I'm running consul with helm -> helm install -f config.yml consul hashicorp/consul --create-namespace -n consul
):
config.yml

global:
  name: consul
  datacenter: dc1
server:
  replicas: 1
  securityContext:
    runAsNonRoot: false
    runAsGroup: 0
    runAsUser: 0
    fsGroup: 0
ui:
  enabled: true
  service:
    type: 'NodePort'
connectInject:
  enabled: true
controller:
  enabled: true
dns:
  enabled: true
  enableRedirection: true

And my deployment file for the 'bookcatalogue' service is:
deployment.yml

kind: Service
apiVersion: v1
metadata:
  name: bookcatalogue
spec:
  selector:
    app: bookcatalogue
  ports:
    - name: bookcatalogue
      port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookcatalogue
spec:
  selector:
    matchLabels:
      app: bookcatalogue
  template:
    metadata:
      labels:
        app: bookcatalogue
    spec:
      containers:
        - name: bookcatalogue
          image: deworg/bookcatalogue
          env:
            - name: CONSUL_HOST
              value: "consul-server.consul"
            - name: CONSUL_PORT
              value: "8500"
          resources:
            limits:
              memory: "128Mi"
              cpu: "500m"
          ports:
            - containerPort: 8080

I appreciate any help.

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Pending Approval

These branches will be created by Renovate only once you click their checkbox below.

  • chore(deps): update actions/checkout action to v4.1.5
  • chore(deps): update github artifact actions to v4 (major) (actions/download-artifact, actions/upload-artifact)
  • 🔐 Create all pending approval PRs at once 🔐

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

github-actions
.github/workflows/central-sync.yml
  • actions/checkout v4
  • gradle/wrapper-validation-action v2
  • actions/setup-java v4
.github/workflows/graalvm-dev.yml
  • actions/checkout v4
  • actions/checkout v4
.github/workflows/graalvm-latest.yml
  • actions/checkout v4
  • actions/checkout v4
.github/workflows/gradle.yml
  • actions/checkout v4
  • graalvm/setup-graalvm v1.2.1
  • gradle/gradle-build-action v3.2.1
  • mikepenz/action-junit-report v4
  • actions/upload-artifact v3.1.3@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
  • haya14busa/action-cond v1
.github/workflows/publish-snapshot.yml
  • actions/checkout v4
  • actions/cache v4
  • actions/setup-java v4
.github/workflows/release.yml
  • actions/checkout v4
  • gradle/wrapper-validation-action v2
  • actions/setup-java v4
  • actions/upload-artifact v3.1.3@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
  • actions/upload-artifact v3.1.3@a8a3f3ad30e3422c9c7b888a15615d19a852ae32
  • actions/download-artifact v3.0.2@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
  • slsa-framework/slsa-github-generator v1.10.0
  • actions/checkout v4.1.1@b4ffde65f46336ab88eb53be808477a3936bae11
  • actions/download-artifact v3.0.2@9bc31d5ccc31df68ecc42ccf4149144866c47d8a
  • softprops/action-gh-release v0.1.15@de2c0eb89ae2a093876385947365aca7b0e5f844
gradle
gradle.properties
settings.gradle
  • io.micronaut.build.shared.settings 6.7.0
build.gradle
buildSrc/build.gradle
buildSrc/src/main/groovy/io.micronaut.build.internal.discovery-client-base.gradle
buildSrc/src/main/groovy/io.micronaut.build.internal.discovery-client-module.gradle
buildSrc/src/main/groovy/io.micronaut.build.internal.discovery-client-tests-consul.gradle
buildSrc/src/main/groovy/io.micronaut.build.internal.discovery-client-tests.gradle
discovery-client/build.gradle
discovery-client-bom/build.gradle
discovery-client-tests/build.gradle
gradle/libs.versions.toml
  • io.micronaut:micronaut-core-bom 4.4.1
  • io.micronaut.reactor:micronaut-reactor-bom 3.3.0
  • io.micronaut.serde:micronaut-serde-bom 2.9.0
  • io.micronaut.test:micronaut-test-bom 4.3.0
  • io.micronaut.testresources:micronaut-test-resources-bom 2.4.0
  • io.micronaut.validation:micronaut-validation-bom 4.5.0
  • io.micronaut.docs:micronaut-docs-asciidoc-config-props 2.0.0
  • org.awaitility:awaitility 4.2.1
  • org.spockframework:spock-core 2.3-groovy-4.0
gradle/license.gradle
test-suite-consul-graal/build.gradle.kts
test-suite-consul-graal-jacksondatabind/build.gradle.kts
  • org.graalvm.buildtools.native 0.10.1
  • io.micronaut.library 4.3.6
  • io.micronaut.test-resources 4.3.6
test-suite-consul-graal-serde/build.gradle.kts
  • org.graalvm.buildtools.native 0.10.1
  • io.micronaut.library 4.3.6
  • io.micronaut.test-resources 4.3.6
gradle-wrapper
gradle/wrapper/gradle-wrapper.properties
  • gradle 8.7

  • Check this box to trigger a request for Renovate to run again on this repository

Provide a way to dynamically generate Vault authentication token

We are looking to integrate with Vault, and the current VaultConfiguration class does not have a way to generate the authentication token at runtime.

Our use case is that Vault is secured using Googles IAM authentication and service accounts. We need to be able to generate an IAM token to be used for authentication at runtime, and not have it hard coded in a property.

Looking at the current code, I would have to override and replace VaultClientConfiguration and shove our IAM token stuff in there. I think it's possible, but it's not very nice or flexible. Spring provides a simple ClientAuthentication interface you can implement to provide the token, and something similar would suffice.

If I have time I'll see about getting a more thorough proposal together, but wanted to throw this out there and see if maybe my approach has an obvious downsides.

Retry not working for Consul Config Client

Task List

  • Steps to reproduce provided
  • Stacktrace (if present) provided
  • Example that reproduces the problem uploaded to Github
  • Full description of the issue provided (see below)

Steps to Reproduce

Documentation on Retry states:

  1. The simplest form of retry is just to add the @retryable annotation to a type or method. The default behaviour of @retryable is to retry three times with an exponential delay of one second between each retry.
  2. Note also that the @retryable annotation can be applied on interfaces

I see that ConsulOperations.readValues method has @retryable annotation:

    @Get(uri = "/kv/{+key}?recurse=true{&dc}{&raw}{&seperator}", single = true)
    @Retryable(
        attempts = AbstractConsulClient.EXPR_CONSUL_CONFIG_RETRY_COUNT,
        delay = AbstractConsulClient.EXPR_CONSUL_CONFIG_RETRY_DELAY
    )
    Publisher<List<KeyValue>> readValues(
        String key,
        @Nullable @QueryValue("dc") String datacenter,
        @Nullable Boolean raw,
        @Nullable String seperator);

This method is used in ConsulConfigurationClient to fetch configuration values from Consul so I assume that retry pattern should be used here (3 attempts by default). However if HTTP client error happened (for example, "Connection refused") retry is not invoked (and DefaultRetryInterceptor is not called). It doesn't happen either if I add explicit retry configuration in bootstrap.yml:

consul:
  client:
    config:
      retry-count: 4
      retry-delay: 10s

Expected Behaviour

If an operation to fetch configuration values from Consul failed it should be retried

Actual Behaviour

The operation to fetch configuration values from Consul is executed only once in any case.

Environment Information

  • Operating System: Windows 10
  • Micronaut Version: 2.5.0
  • JDK Version: 1.16.01

Need authorization support for Spring Cloud Config

Original implementation from spring has ability to add properties for authorization like username and password

Example bootstrap.yml

spring:
  cloud:
    config:
     uri: https://myconfig.mycompany.com
     username: user
     password: secret

doc

I tried to add the same properties to my micronaut bootstrap.yml config but got fail

22:34:45.037 [main] DEBUG io.micronaut.discovery.client.config.DistributedPropertySourceLocator - Resolving configuration sources from client: compositeConfigurationClient(spring-cloud-config-client)
22:34:45.038 [main] DEBUG io.micronaut.discovery.spring.config.SpringCloudConfigurationClient - Spring Cloud Config Active: Optional[http://awesome-config-service:8888/awesome-micronaut-service]
22:34:45.040 [main] DEBUG io.micronaut.discovery.spring.config.SpringCloudConfigurationClient - Application Name: awesome-micronaut-service, Application Profiles: null, label: null

22:34:46.154 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Error reading distributed configuration from Spring Cloud: Unauthorized
io.micronaut.context.exceptions.ConfigurationException: Error reading distributed configuration from Spring Cloud: Unauthorized
	at io.micronaut.discovery.spring.config.SpringCloudConfigurationClient.lambda$getPropertySources$0(SpringCloudConfigurationClient.java:119)
	at io.reactivex.internal.operators.flowable.FlowableOnErrorNext$OnErrorNextSubscriber.onError(FlowableOnErrorNext.java:103)
	at io.micronaut.core.async.publisher.Publishers$1.doOnError(Publishers.java:216)
	at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onError(CompletionAwareSubscriber.java:63)
	at io.reactivex.internal.util.HalfSerializer.onError(HalfSerializer.java:70)
	at io.reactivex.internal.subscribers.StrictSubscriber.onError(StrictSubscriber.java:103)
	at io.reactivex.internal.operators.flowable.FlowableSwitchMap$SwitchMapSubscriber.drain(FlowableSwitchMap.java:221)
	at io.reactivex.internal.operators.flowable.FlowableSwitchMap$SwitchMapInnerSubscriber.onError(FlowableSwitchMap.java:403)
	at io.reactivex.internal.operators.flowable.FlowableOnErrorNext$OnErrorNextSubscriber.onError(FlowableOnErrorNext.java:90)
	at io.reactivex.internal.subscriptions.EmptySubscription.error(EmptySubscription.java:55)
	at io.reactivex.internal.operators.flowable.FlowableError.subscribeActual(FlowableError.java:40)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.Flowable.subscribe(Flowable.java:14865)
	at io.reactivex.internal.operators.flowable.FlowableOnErrorNext$OnErrorNextSubscriber.onError(FlowableOnErrorNext.java:115)
	at io.reactivex.internal.operators.flowable.FlowableTimeoutTimed$TimeoutSubscriber.onError(FlowableTimeoutTimed.java:115)
	at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.error(FlowableCreate.java:292)
	at io.reactivex.internal.operators.flowable.FlowableCreate$BaseEmitter.tryOnError(FlowableCreate.java:281)
	at io.micronaut.http.client.netty.DefaultHttpClient$11.channelRead0(DefaultHttpClient.java:2051)
	at io.micronaut.http.client.netty.DefaultHttpClient$11.channelRead0(DefaultHttpClient.java:1964)
	at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:190)
	at io.micronaut.http.netty.stream.HttpStreamsClientHandler.channelRead(HttpStreamsClientHandler.java:185)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321)
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295)
	at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: io.micronaut.http.client.exceptions.HttpClientResponseException: Unauthorized
	at io.micronaut.http.client.netty.DefaultHttpClient$11.channelRead0(DefaultHttpClient.java:2046)
	... 42 common frames omitted

I've checked SpringCloudConfigurationClient sources and I didn't find any username, password mention.

Add native test

We removed the Graal native test from our gitlab suite as it required a custom test runner.

We will move it in to here

graalvm native image does not report health checks

Expected Behavior

The same behavior that occurs when running the .jar of the application

image

Actual Behaviour

The service does no report health check. The error occurs checking for both ttl and http

image

The error persists both in a local environment and in a kubernetes cluster.

Steps To Reproduce

  1. You can download next guie example https://guides.micronaut.io/latest/micronaut-microservices-services-discover-consul-gradle-kotlin.html
  2. Generate native image for any application
  3. Check health status on Consul

Environment Information

  • Operating System: Ubuntu
  • Consul version: 1.11.4
  • GraalVM version: 22.0.0.2.r11-grl

Example Application

https://guides.micronaut.io/latest/micronaut-microservices-services-discover-consul-gradle-kotlin.html

Version

3.5.0

Cannot use Caffeine's DefaultSyncCache if Service Discovery caching is enabled

Steps to Reproduce

See example application for details.

If an application requires has both Service Discovery cache configuration and Caffeine cache configuration, it fails on DependencyInjectionException since both DefaultCacheConfiguration and DiscoveryClientCacheConfiguration implement CacheConfiguration.

Expected Behaviour

Both Caffeine and Service Discovery cache are configured.

Actual Behaviour

An exception gets thrown:

➜  micronaut-cache-configuration git:(main) ✗ ./gradlew run

> Task :run
10:30:03.763 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Failed to inject value for parameter [cacheConfiguration] of class: io.micronaut.cache.caffeine.DefaultSyncCache

Message: Multiple possible bean candidates found: [io.micronaut.cache.caffeine.DefaultCacheConfiguration, io.micronaut.cache.discovery.DiscoveryClientCacheConfiguration]
Path Taken: new Service(ApplicationContext applicationContext,[DummyClient dummyClient]) --> new DummyClient$Intercepted(BeanContext beanContext,Qualifier qualifier,[Interceptor[] interceptors]) --> new CacheInterceptor([CacheManager cacheManager],CacheErrorHandler errorHandler,AsyncCacheErrorHandler asyncCacheErrorHandler,ExecutorService ioExecutor,BeanContext beanContext) --> new DefaultCacheManager([List caches],Provider dynamicCacheManager) --> new DefaultSyncCache([CacheConfiguration cacheConfiguration],ApplicationContext applicationContext,ConversionService conversionService)
io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [cacheConfiguration] of class: io.micronaut.cache.caffeine.DefaultSyncCache

Message: Multiple possible bean candidates found: [io.micronaut.cache.caffeine.DefaultCacheConfiguration, io.micronaut.cache.discovery.DiscoveryClientCacheConfiguration]
Path Taken: new Service(ApplicationContext applicationContext,[DummyClient dummyClient]) --> new DummyClient$Intercepted(BeanContext beanContext,Qualifier qualifier,[Interceptor[] interceptors]) --> new CacheInterceptor([CacheManager cacheManager],CacheErrorHandler errorHandler,AsyncCacheErrorHandler asyncCacheErrorHandler,ExecutorService ioExecutor,BeanContext beanContext) --> new DefaultCacheManager([List caches],Provider dynamicCacheManager) --> new DefaultSyncCache([CacheConfiguration cacheConfiguration],ApplicationContext applicationContext,ConversionService conversionService)
        at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1035)
        at io.micronaut.cache.caffeine.$DefaultSyncCacheDefinition.build(Unknown Source)
        at io.micronaut.context.BeanDefinitionDelegate.build(BeanDefinitionDelegate.java:143)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
        at io.micronaut.context.DefaultBeanContext.addCandidateToList(DefaultBeanContext.java:2990)
        at io.micronaut.context.DefaultBeanContext.getBeansOfTypeInternal(DefaultBeanContext.java:2891)
        at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:1045)
        at io.micronaut.context.AbstractBeanDefinition.lambda$getBeansOfTypeForConstructorArgument$9(AbstractBeanDefinition.java:1143)
        at io.micronaut.context.AbstractBeanDefinition.resolveBeanWithGenericsFromConstructorArgument(AbstractBeanDefinition.java:1820)
        at io.micronaut.context.AbstractBeanDefinition.getBeansOfTypeForConstructorArgument(AbstractBeanDefinition.java:1138)
        at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:990)
        at io.micronaut.cache.$DefaultCacheManagerDefinition.build(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
        at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2647)
        at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2633)
        at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2305)
        at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2279)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
        at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1013)
        at io.micronaut.cache.interceptor.$CacheInterceptorDefinition.build(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
        at io.micronaut.context.DefaultBeanContext.addCandidateToList(DefaultBeanContext.java:2990)
        at io.micronaut.context.DefaultBeanContext.getBeansOfTypeInternal(DefaultBeanContext.java:2865)
        at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:1045)
        at io.micronaut.context.AbstractBeanDefinition.lambda$getBeansOfTypeForConstructorArgument$9(AbstractBeanDefinition.java:1143)
        at io.micronaut.context.AbstractBeanDefinition.resolveBeanWithGenericsFromConstructorArgument(AbstractBeanDefinition.java:1820)
        at io.micronaut.context.AbstractBeanDefinition.getBeansOfTypeForConstructorArgument(AbstractBeanDefinition.java:1138)
        at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:987)
        at example.micronaut.$DummyClient$InterceptedDefinition.build(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
        at io.micronaut.context.DefaultBeanContext.createAndRegisterSingletonInternal(DefaultBeanContext.java:2647)
        at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2633)
        at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:2305)
        at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2279)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
        at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1013)
        at example.micronaut.$ServiceDefinition.build(Unknown Source)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1898)
        at io.micronaut.context.DefaultBeanContext.addCandidateToList(DefaultBeanContext.java:2990)
        at io.micronaut.context.DefaultBeanContext.getBeansOfTypeInternal(DefaultBeanContext.java:2865)
        at io.micronaut.context.DefaultBeanContext.getBeansOfType(DefaultBeanContext.java:754)
        at io.micronaut.context.DefaultBeanContext.publishEvent(DefaultBeanContext.java:1288)
        at io.micronaut.http.server.netty.NettyHttpServer.fireStartupEvents(NettyHttpServer.java:495)
        at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:341)
        at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:110)
        at io.micronaut.runtime.Micronaut.lambda$start$2(Micronaut.java:70)
        at java.base/java.util.Optional.ifPresent(Optional.java:183)
        at io.micronaut.runtime.Micronaut.start(Micronaut.java:68)
        at io.micronaut.runtime.Micronaut.run(Micronaut.java:299)
        at io.micronaut.runtime.Micronaut.run(Micronaut.java:285)
        at example.micronaut.Application.main(Application.groovy:11)
Caused by: io.micronaut.context.exceptions.NonUniqueBeanException: Multiple possible bean candidates found: [io.micronaut.cache.caffeine.DefaultCacheConfiguration, io.micronaut.cache.discovery.DiscoveryClientCacheConfiguration]
        at io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:1987)
        at io.micronaut.context.DefaultApplicationContext.findConcreteCandidate(DefaultApplicationContext.java:434)
        at io.micronaut.context.DefaultBeanContext.lastChanceResolve(DefaultBeanContext.java:2624)
        at io.micronaut.context.DefaultBeanContext.findConcreteCandidateNoCache(DefaultBeanContext.java:2535)
        at io.micronaut.context.DefaultBeanContext.findConcreteCandidate(DefaultBeanContext.java:2478)
        at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:2259)
        at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1245)
        at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:1013)
        ... 50 common frames omitted

> Task :run FAILED

Environment Information

  • Operating System: MacOS 10.14.6
  • Micronaut Version: 2.1.2
  • JDK Version: openjdk 11.0.6 2020-01-14 LTS

Example Application

Error occurred during service registration with Consul, app throw UnimplementedAdviceException

Expected Behavior

The app should register themself in the consul server

Actual Behaviour

When i run the app , the app throw UnimplementedAdviceException

03:46:11.732 [main] ERROR i.m.d.registration.AutoRegistration - Error occurred during service registration with Consul: All possible Introduction advise exhausted and no implementation found for method: Publisher register(NewServiceEntry entry)
io.micronaut.aop.exceptions.UnimplementedAdviceException: All possible Introduction advise exhausted and no implementation found for method: Publisher register(NewServiceEntry entry)
	at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:126)
	at io.micronaut.aop.chain.AbstractInterceptorChain.proceed(AbstractInterceptorChain.java:171)
	at io.micronaut.aop.chain.InterceptorChain.proceed(InterceptorChain.java:46)
	at io.micronaut.aop.internal.intercepted.PublisherInterceptedMethod.interceptResultAsPublisher(PublisherInterceptedMethod.java:70)
	at io.micronaut.aop.internal.intercepted.PublisherInterceptedMethod.interceptResult(PublisherInterceptedMethod.java:87)
	at io.micronaut.aop.internal.intercepted.PublisherInterceptedMethod.interceptResult(PublisherInterceptedMethod.java:39)
	at io.micronaut.retry.intercept.DefaultRetryInterceptor.retrySync(DefaultRetryInterceptor.java:228)
	at io.micronaut.retry.intercept.DefaultRetryInterceptor.intercept(DefaultRetryInterceptor.java:129)
	at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)
	at io.micronaut.aop.internal.intercepted.PublisherInterceptedMethod.interceptResultAsPublisher(PublisherInterceptedMethod.java:65)
	at io.micronaut.validation.ValidatingInterceptor.intercept(ValidatingInterceptor.java:129)
	at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)
	at io.micronaut.discovery.consul.client.v1.AbstractConsulClient$Intercepted.register(Unknown Source)
	at io.micronaut.discovery.consul.registration.ConsulAutoRegistration.register(ConsulAutoRegistration.java:263)
	at io.micronaut.discovery.registration.AutoRegistration.onApplicationEvent(AutoRegistration.java:58)
	at io.micronaut.discovery.registration.AutoRegistration.onApplicationEvent(AutoRegistration.java:38)
	at io.micronaut.context.event.ApplicationEventPublisherFactory.notifyEventListeners(ApplicationEventPublisherFactory.java:266)
	at io.micronaut.context.event.ApplicationEventPublisherFactory$2.publishEvent(ApplicationEventPublisherFactory.java:226)
	at io.micronaut.http.server.netty.discovery.NettyServiceDiscovery.onStart(NettyServiceDiscovery.java:51)
	at io.micronaut.http.server.netty.discovery.$NettyServiceDiscovery$Definition$Exec.dispatch(Unknown Source)
	at io.micronaut.context.AbstractExecutableMethodsDefinition$DispatchedExecutableMethod.invoke(AbstractExecutableMethodsDefinition.java:442)
	at io.micronaut.context.DefaultBeanContext$BeanExecutionHandle.invoke(DefaultBeanContext.java:3858)
	at io.micronaut.aop.chain.AdapterIntroduction.intercept(AdapterIntroduction.java:84)
	at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)
	at io.micronaut.http.server.netty.discovery.NettyServiceDiscovery$ApplicationEventListener$onStart1$Intercepted.onApplicationEvent(Unknown Source)
	at io.micronaut.context.event.ApplicationEventPublisherFactory.notifyEventListeners(ApplicationEventPublisherFactory.java:266)
	at io.micronaut.context.event.ApplicationEventPublisherFactory$2.publishEvent(ApplicationEventPublisherFactory.java:226)
	at io.micronaut.http.server.netty.NettyHttpServer.fireStartupEvents(NettyHttpServer.java:603)
	at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:304)
	at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:104)
	at io.micronaut.runtime.Micronaut.start(Micronaut.java:79)
	at io.micronaut.runtime.Micronaut.run(Micronaut.java:322)
	at io.micronaut.runtime.Micronaut.run(Micronaut.java:297)

Steps To Reproduce

This is my application.properties

micronaut.application.name=chatService
micronaut.application.instance.id=${random.shortuuid}
micronaut.server.port=8086
#consul
consul.client.defaultZone=${CONSUL_HOST:localhost}:${CONSUL_PORT:8500}
consul.client.registration.enabled=true

My dependencies

`

io.micronaut
micronaut-http-server-netty
compile

    <dependency>
        <groupId>io.micronaut</groupId>
        <artifactId>micronaut-websocket</artifactId>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>io.micronaut.kotlin</groupId>
        <artifactId>micronaut-kotlin-runtime</artifactId>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>io.micronaut.serde</groupId>
        <artifactId>micronaut-serde-jackson</artifactId>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-reflect</artifactId>
        <version>${kotlinVersion}</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
        <version>${kotlinVersion}</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>io.micronaut</groupId>
        <artifactId>micronaut-http-client</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>io.micronaut.test</groupId>
        <artifactId>micronaut-test-junit5</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.jetbrains.kotlinx</groupId>
        <artifactId>kotlinx-coroutines-reactor</artifactId>
    </dependency>

    <dependency>
        <groupId>io.projectreactor.kotlin</groupId>
        <artifactId>reactor-kotlin-extensions</artifactId>
    </dependency>


    <dependency>
        <groupId>io.micronaut.redis</groupId>
        <artifactId>micronaut-redis-lettuce</artifactId>
    </dependency>

    <dependency>
        <groupId>com.google.protobuf</groupId>
        <artifactId>protobuf-java</artifactId>
        <version>${protoc.version}</version>
    </dependency>

    <dependency>
        <groupId>io.micronaut.data</groupId>
        <artifactId>micronaut-data-mongodb</artifactId>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver-reactivestreams</artifactId>
        <scope>runtime</scope>
    </dependency>

    <dependency>
        <groupId>io.micronaut.discovery</groupId>
        <artifactId>micronaut-discovery-client</artifactId>
    </dependency>

`

Environment Information

jdk : 17
kotlin version : 1.8.21
consul server version : 1.15.4

Example Application

No response

Version

4.0.1

Note : When i try to use spring boot with consul server with same configuration , is working fine .

Microanut service registration for consul client will resutle in a failure even if the service is registered

Expected Behavior

I followed the directions on how to get a consul client, but I'm getting an exception:

Caused by: io.micronaut.http.client.exceptions.HttpClientResponseException: Client 'consul': Error decoding HTTP response body: No bean introspection available for type [class java.net.InetAddress]. Ensure the class is annotated with io.micronaut.core.annotation.Introspected
	at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.makeNormalBodyParseError(DefaultHttpClient.java:2254)
	at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.forwardResponseToPromise(DefaultHttpClient.java:2184)

I'm almost positive this is related to #524 and #517 -

Actual Behaviour

InetAddress bean injection failure with exception above

Steps To Reproduce

  1. setup consul client for grpc
  2. inject the stub
  3. make a call
  4. client fiails but service discovery does return a non-null client object

Environment Information

No response

Example Application

No response

Version

mn -V: Micronaut Version: 4.1.3

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.