Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Error connecting to Confluent Kafka when running as native image #264

Closed
joost-lambregts opened this issue Nov 5, 2020 · 9 comments · Fixed by #375
Closed

Error connecting to Confluent Kafka when running as native image #264

joost-lambregts opened this issue Nov 5, 2020 · 9 comments · Fixed by #375
Labels
relates-to: graal type: improvement A minor improvement to an existing feature

Comments

@joost-lambregts
Copy link

I am trying to post a message to a Kafka topic on Confluent Cloud using micronaut-kafka. When I don't build my application as a native image, everything works fine. When I do build a native image (using gradle dockerBuildNative) the application runs into an error while trying to authenticate at Confluent Cloud. I'm using plain SASL/JAAS as an authentication mechanism.

While googling the error I came across an issue in the quarkus github that looks very similar: quarkusio/quarkus#5254. Perhaps looking into this issue will help in resolving the issue for Micronaut as well.

I tried to resolve the issue by adding a TypeHint annotation. This seemed to resolve the original error but I ran into a new one and got stuck. I will share both stacktraces.

Steps to Reproduce:

  1. Register a free trial with Confluent Cloud. Generate a key / secret for plain SASL authentication, create a topic.
  2. Use the following kafka configuration in application.yml:
kafka:
  bootstrap.servers: [confluent-bootstrap-server]
  security.protocol: SASL_SSL
  sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="[my-key]" password="[my-password]";
  sasl.mechanism: PLAIN
  1. make a kafka producer as you would normally with micronaut-kafka.
  2. build a native image of the application. (I used gradle dockerBuildNative), have it post a mesage to Kafka.

Expected Behaviour

Message get's posted to Confluent Kafka

Actual Behaviour

I get the following stacktrace as soon as I try to post a message to my Kafka topic:

11:14:26.910 [nioEventLoopGroup-1-3] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: Error instantiating bean of type [org.apache.kafka.clients.producer.KafkaProducer]: Failed to construct kafka producer
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [org.apache.kafka.clients.producer.KafkaProducer]: Failed to construct kafka producer
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1918)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:903)
        at io.micronaut.context.DefaultBeanContext.createBean(DefaultBeanContext.java:830)
        at io.micronaut.context.BeanContext.createBean(BeanContext.java:130)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.lambda$getProducer$13(KafkaClientIntroductionAdvice.java:663)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.getProducer(KafkaClientIntroductionAdvice.java:585)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.intercept(KafkaClientIntroductionAdvice.java:227)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at io.micronaut.retry.intercept.RecoveryInterceptor.intercept(RecoveryInterceptor.java:80)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at nl.amis.kafkaclient.TransactionProducer$Intercepted.sendTransaction(Unknown Source)
        at nl.amis.kafkaclient.TransactionProducer.sendTransaction(TransactionProducer.java:11)
        at nl.amis.controller.TransactionController.postMethod(TransactionController.java:25)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted.$$access0(Unknown Source)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted$$proxy0.invokeInternal(Unknown Source)
        at io.micronaut.context.AbstractExecutableMethod.invoke(AbstractExecutableMethod.java:146)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:60)
        at io.micronaut.validation.ValidatingInterceptor.intercept(ValidatingInterceptor.java:106)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted.postMethod(Unknown Source)
        at nl.amis.controller.$$TransactionControllerDefinition$InterceptedDefinition$$exec1.invokeInternal(Unknown Source)
        at io.micronaut.context.AbstractExecutableMethod.invoke(AbstractExecutableMethod.java:146)
        at io.micronaut.context.DefaultBeanContext$4.invoke(DefaultBeanContext.java:469)
        at io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:312)
        at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:118)
        at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildResultEmitter$9(RoutingInBoundHandler.java:1352)
        at io.reactivex.internal.operators.flowable.FlowableDefer.subscribeActual(FlowableDefer.java:35)
        at io.reactivex.Flowable.subscribe(Flowable.java:14918)
        at io.reactivex.Flowable.subscribe(Flowable.java:14865)
        at io.micronaut.http.server.context.ServerRequestContextFilter.lambda$doFilter$0(ServerRequestContextFilter.java:62)
        at io.reactivex.internal.operators.flowable.FlowableFromPublisher.subscribeActual(FlowableFromPublisher.java:29)
        at io.reactivex.Flowable.subscribe(Flowable.java:14918)
        at io.reactivex.Flowable.subscribe(Flowable.java:14868)
        at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildExecutableRoute$5(RoutingInBoundHandler.java:1056)
        at io.micronaut.web.router.DefaultUriRouteMatch$1.execute(DefaultUriRouteMatch.java:80)
        at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:118)
        at io.micronaut.http.server.netty.RoutingInBoundHandler$2.doOnComplete(RoutingInBoundHandler.java:987)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at io.micronaut.http.server.netty.jackson.JsonContentProcessor$1.doOnComplete(JsonContentProcessor.java:140)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at java.util.Optional.ifPresent(Optional.java:183)
        at io.micronaut.core.async.processor.SingleThreadedBufferingProcessor.doOnComplete(SingleThreadedBufferingProcessor.java:48)
        at io.micronaut.jackson.parser.JacksonProcessor.doOnComplete(JacksonProcessor.java:139)
        at io.micronaut.core.async.subscriber.SingleThreadedBufferingSubscriber.onComplete(SingleThreadedBufferingSubscriber.java:70)
        at io.micronaut.http.server.netty.jackson.JsonContentProcessor.doOnComplete(JsonContentProcessor.java:165)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at io.micronaut.http.netty.reactive.HandlerPublisher.complete(HandlerPublisher.java:416)
        at io.micronaut.http.netty.reactive.HandlerPublisher.handlerRemoved(HandlerPublisher.java:403)
        at io.netty.channel.AbstractChannelHandlerContext.callHandlerRemoved(AbstractChannelHandlerContext.java:979)
        at io.netty.channel.DefaultChannelPipeline.callHandlerRemoved0(DefaultChannelPipeline.java:637)
        at io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:477)
        at io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:423)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.removeHandlerIfActive(HttpStreamsHandler.java:388)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.handleReadHttpContent(HttpStreamsHandler.java:253)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:228)
        at io.micronaut.http.netty.stream.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:121)
        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.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
        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.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
        at io.netty.handler.codec.http.HttpServerKeepAliveHandler.channelRead(HttpServerKeepAliveHandler.java:64)
        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.flow.FlowControlHandler.dequeue(FlowControlHandler.java:191)
        at io.netty.handler.flow.FlowControlHandler.read(FlowControlHandler.java:130)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.micronaut.http.netty.reactive.HandlerPublisher.requestDemand(HandlerPublisher.java:163)
        at io.micronaut.http.netty.stream.HttpStreamsHandler$1.requestDemand(HttpStreamsHandler.java:220)
        at io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.receivedDemand(HandlerPublisher.java:547)
        at io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.lambda$request$0(HandlerPublisher.java:474)
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:497)
        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:834)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
Caused by: org.apache.kafka.common.KafkaException: Failed to construct kafka producer
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:434)
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:313)
        at io.micronaut.configuration.kafka.KafkaProducerFactory.createProducer(KafkaProducerFactory.java:59)
        at io.micronaut.configuration.kafka.$KafkaProducerFactory$CreateProducer0Definition.doBuild(Unknown Source)
        at io.micronaut.context.AbstractParametrizedBeanDefinition.build(AbstractParametrizedBeanDefinition.java:118)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1876)
        ... 99 common frames omitted
Caused by: org.apache.kafka.common.KafkaException: org.apache.kafka.common.KafkaException: Could not find a public no-argument constructor for org.apache.kafka.common.security.authenticator.SaslClientCallbackHandler
        at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:172)
        at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:157)
        at org.apache.kafka.common.network.ChannelBuilders.clientChannelBuilder(ChannelBuilders.java:73)
        at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:105)
        at org.apache.kafka.clients.producer.KafkaProducer.newSender(KafkaProducer.java:442)
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:423)
        ... 104 common frames omitted
Caused by: org.apache.kafka.common.KafkaException: Could not find a public no-argument constructor for org.apache.kafka.common.security.authenticator.SaslClientCallbackHandler
        at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:310)
        at org.apache.kafka.common.network.SaslChannelBuilder.createClientCallbackHandler(SaslChannelBuilder.java:293)
        at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:136)
        ... 109 common frames omitted
Caused by: java.lang.NoSuchMethodException: org.apache.kafka.common.security.authenticator.SaslClientCallbackHandler.<init>()
        at java.lang.Class.getConstructor0(DynamicHub.java:3349)
        at java.lang.Class.getDeclaredConstructor(DynamicHub.java:2553)
        at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:308)
        ... 111 common frames omitted

After this, I tried to add the following TypeHInt annotation (inspired by some comment in the quarkus issue):
@TypeHint({org.apache.kafka.common.security.plain.PlainLoginModule.class, ProducerKafkaMetricsReporter.class, SaslClientCallbackHandler.class,SaslClientCallbackHandler.class, DefaultLogin.class, AbstractLogin.DefaultLoginCallbackHandler.class})
With this typehint, I get the following stacktrace instead:

10:56:31.501 [nioEventLoopGroup-1-3] ERROR i.m.r.intercept.RecoveryInterceptor - Type [nl.amis.kafkaclient.TransactionProducer$Intercepted] executed with error: Error instantiating bean of type [org.apache.kafka.clients.producer.KafkaProducer]: Failed to construct kafka producer
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [org.apache.kafka.clients.producer.KafkaProducer]: Failed to construct kafka producer
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1918)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:903)
        at io.micronaut.context.DefaultBeanContext.createBean(DefaultBeanContext.java:830)
        at io.micronaut.context.BeanContext.createBean(BeanContext.java:130)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.lambda$getProducer$13(KafkaClientIntroductionAdvice.java:663)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.getProducer(KafkaClientIntroductionAdvice.java:585)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.intercept(KafkaClientIntroductionAdvice.java:227)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at io.micronaut.retry.intercept.RecoveryInterceptor.intercept(RecoveryInterceptor.java:80)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at nl.amis.kafkaclient.TransactionProducer$Intercepted.sendTransaction(Unknown Source)
        at nl.amis.kafkaclient.TransactionProducer.sendTransaction(TransactionProducer.java:11)
        at nl.amis.controller.TransactionController.postMethod(TransactionController.java:25)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted.$$access0(Unknown Source)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted$$proxy0.invokeInternal(Unknown Source)
        at io.micronaut.context.AbstractExecutableMethod.invoke(AbstractExecutableMethod.java:146)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:60)
        at io.micronaut.validation.ValidatingInterceptor.intercept(ValidatingInterceptor.java:106)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted.postMethod(Unknown Source)
        at nl.amis.controller.$$TransactionControllerDefinition$InterceptedDefinition$$exec1.invokeInternal(Unknown Source)
        at io.micronaut.context.AbstractExecutableMethod.invoke(AbstractExecutableMethod.java:146)
        at io.micronaut.context.DefaultBeanContext$4.invoke(DefaultBeanContext.java:469)
        at io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:312)
        at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:118)
        at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildResultEmitter$9(RoutingInBoundHandler.java:1352)
        at io.reactivex.internal.operators.flowable.FlowableDefer.subscribeActual(FlowableDefer.java:35)
        at io.reactivex.Flowable.subscribe(Flowable.java:14918)
        at io.reactivex.Flowable.subscribe(Flowable.java:14865)
        at io.micronaut.http.server.context.ServerRequestContextFilter.lambda$doFilter$0(ServerRequestContextFilter.java:62)
        at io.reactivex.internal.operators.flowable.FlowableFromPublisher.subscribeActual(FlowableFromPublisher.java:29)
        at io.reactivex.Flowable.subscribe(Flowable.java:14918)
        at io.reactivex.Flowable.subscribe(Flowable.java:14868)
        at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildExecutableRoute$5(RoutingInBoundHandler.java:1056)
        at io.micronaut.web.router.DefaultUriRouteMatch$1.execute(DefaultUriRouteMatch.java:80)
        at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:118)
        at io.micronaut.http.server.netty.RoutingInBoundHandler$2.doOnComplete(RoutingInBoundHandler.java:987)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at io.micronaut.http.server.netty.jackson.JsonContentProcessor$1.doOnComplete(JsonContentProcessor.java:140)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at java.util.Optional.ifPresent(Optional.java:183)
        at io.micronaut.core.async.processor.SingleThreadedBufferingProcessor.doOnComplete(SingleThreadedBufferingProcessor.java:48)
        at io.micronaut.jackson.parser.JacksonProcessor.doOnComplete(JacksonProcessor.java:139)
        at io.micronaut.core.async.subscriber.SingleThreadedBufferingSubscriber.onComplete(SingleThreadedBufferingSubscriber.java:70)
        at io.micronaut.http.server.netty.jackson.JsonContentProcessor.doOnComplete(JsonContentProcessor.java:165)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at io.micronaut.http.netty.reactive.HandlerPublisher.complete(HandlerPublisher.java:416)
        at io.micronaut.http.netty.reactive.HandlerPublisher.handlerRemoved(HandlerPublisher.java:403)
        at io.netty.channel.AbstractChannelHandlerContext.callHandlerRemoved(AbstractChannelHandlerContext.java:979)
        at io.netty.channel.DefaultChannelPipeline.callHandlerRemoved0(DefaultChannelPipeline.java:637)
        at io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:477)
        at io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:423)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.removeHandlerIfActive(HttpStreamsHandler.java:388)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.handleReadHttpContent(HttpStreamsHandler.java:253)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:228)
        at io.micronaut.http.netty.stream.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:121)
        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.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
        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.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
        at io.netty.handler.codec.http.HttpServerKeepAliveHandler.channelRead(HttpServerKeepAliveHandler.java:64)
        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.flow.FlowControlHandler.dequeue(FlowControlHandler.java:191)
        at io.netty.handler.flow.FlowControlHandler.read(FlowControlHandler.java:130)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.micronaut.http.netty.reactive.HandlerPublisher.requestDemand(HandlerPublisher.java:163)
        at io.micronaut.http.netty.stream.HttpStreamsHandler$1.requestDemand(HttpStreamsHandler.java:220)
        at io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.receivedDemand(HandlerPublisher.java:547)
        at io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.lambda$request$0(HandlerPublisher.java:474)
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:497)
        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:834)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
Caused by: org.apache.kafka.common.KafkaException: Failed to construct kafka producer
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:434)
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:313)
        at io.micronaut.configuration.kafka.KafkaProducerFactory.createProducer(KafkaProducerFactory.java:59)
        at io.micronaut.configuration.kafka.$KafkaProducerFactory$CreateProducer0Definition.doBuild(Unknown Source)
        at io.micronaut.context.AbstractParametrizedBeanDefinition.build(AbstractParametrizedBeanDefinition.java:118)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1876)
        ... 99 common frames omitted
Caused by: org.apache.kafka.common.KafkaException: java.util.MissingResourceException: Resource bundle not found sun.security.util.Resources. Register the resource bundle using the option -H:IncludeResourceBundles=sun.security.util.Resources.
        at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:172)
        at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:157)
        at org.apache.kafka.common.network.ChannelBuilders.clientChannelBuilder(ChannelBuilders.java:73)
        at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:105)
        at org.apache.kafka.clients.producer.KafkaProducer.newSender(KafkaProducer.java:442)
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:423)
        ... 104 common frames omitted
Caused by: java.util.MissingResourceException: Resource bundle not found sun.security.util.Resources. Register the resource bundle using the option -H:IncludeResourceBundles=sun.security.util.Resources.
        at com.oracle.svm.core.jdk.LocalizationSupport.getCached(LocalizationSupport.java:66)
        at java.util.ResourceBundle.getBundle(ResourceBundle.java:53)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
        at sun.security.util.ResourcesMgr.getBundle(ResourcesMgr.java:54)
        at sun.security.util.ResourcesMgr.getString(ResourcesMgr.java:40)
        at javax.security.auth.login.LoginContext.invoke(LoginContext.java:871)
        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:665)
        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:663)
        at java.security.AccessController.doPrivileged(AccessController.java:146)
        at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:663)
        at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
        at org.apache.kafka.common.security.authenticator.AbstractLogin.login(AbstractLogin.java:60)
        at org.apache.kafka.common.security.authenticator.LoginManager.<init>(LoginManager.java:62)
        at org.apache.kafka.common.security.authenticator.LoginManager.acquireLoginManager(LoginManager.java:105)
        at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:158)
        ... 109 common frames omitted
10:56:31.502 [nioEventLoopGroup-1-3] ERROR i.m.h.s.netty.RoutingInBoundHandler - Unexpected error occurred: Error instantiating bean of type [org.apache.kafka.clients.producer.KafkaProducer]: Failed to construct kafka producer
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type [org.apache.kafka.clients.producer.KafkaProducer]: Failed to construct kafka producer
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1918)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:903)
        at io.micronaut.context.DefaultBeanContext.createBean(DefaultBeanContext.java:830)
        at io.micronaut.context.BeanContext.createBean(BeanContext.java:130)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.lambda$getProducer$13(KafkaClientIntroductionAdvice.java:663)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.getProducer(KafkaClientIntroductionAdvice.java:585)
        at io.micronaut.configuration.kafka.intercept.KafkaClientIntroductionAdvice.intercept(KafkaClientIntroductionAdvice.java:227)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at io.micronaut.retry.intercept.RecoveryInterceptor.intercept(RecoveryInterceptor.java:80)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at nl.amis.kafkaclient.TransactionProducer$Intercepted.sendTransaction(Unknown Source)
        at nl.amis.kafkaclient.TransactionProducer.sendTransaction(TransactionProducer.java:11)
        at nl.amis.controller.TransactionController.postMethod(TransactionController.java:25)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted.$$access0(Unknown Source)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted$$proxy0.invokeInternal(Unknown Source)
        at io.micronaut.context.AbstractExecutableMethod.invoke(AbstractExecutableMethod.java:146)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:60)
        at io.micronaut.validation.ValidatingInterceptor.intercept(ValidatingInterceptor.java:106)
        at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:69)
        at nl.amis.controller.$TransactionControllerDefinition$Intercepted.postMethod(Unknown Source)
        at nl.amis.controller.$$TransactionControllerDefinition$InterceptedDefinition$$exec1.invokeInternal(Unknown Source)
        at io.micronaut.context.AbstractExecutableMethod.invoke(AbstractExecutableMethod.java:146)
        at io.micronaut.context.DefaultBeanContext$4.invoke(DefaultBeanContext.java:469)
        at io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:312)
        at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:118)
        at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildResultEmitter$9(RoutingInBoundHandler.java:1352)
        at io.reactivex.internal.operators.flowable.FlowableDefer.subscribeActual(FlowableDefer.java:35)
        at io.reactivex.Flowable.subscribe(Flowable.java:14918)
        at io.reactivex.Flowable.subscribe(Flowable.java:14865)
        at io.micronaut.http.server.context.ServerRequestContextFilter.lambda$doFilter$0(ServerRequestContextFilter.java:62)
        at io.reactivex.internal.operators.flowable.FlowableFromPublisher.subscribeActual(FlowableFromPublisher.java:29)
        at io.reactivex.Flowable.subscribe(Flowable.java:14918)
        at io.reactivex.Flowable.subscribe(Flowable.java:14868)
        at io.micronaut.http.server.netty.RoutingInBoundHandler.lambda$buildExecutableRoute$5(RoutingInBoundHandler.java:1056)
        at io.micronaut.web.router.DefaultUriRouteMatch$1.execute(DefaultUriRouteMatch.java:80)
        at io.micronaut.web.router.RouteMatch.execute(RouteMatch.java:118)
        at io.micronaut.http.server.netty.RoutingInBoundHandler$2.doOnComplete(RoutingInBoundHandler.java:987)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at io.micronaut.http.server.netty.jackson.JsonContentProcessor$1.doOnComplete(JsonContentProcessor.java:140)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at java.util.Optional.ifPresent(Optional.java:183)
        at io.micronaut.core.async.processor.SingleThreadedBufferingProcessor.doOnComplete(SingleThreadedBufferingProcessor.java:48)
        at io.micronaut.jackson.parser.JacksonProcessor.doOnComplete(JacksonProcessor.java:139)
        at io.micronaut.core.async.subscriber.SingleThreadedBufferingSubscriber.onComplete(SingleThreadedBufferingSubscriber.java:70)
        at io.micronaut.http.server.netty.jackson.JsonContentProcessor.doOnComplete(JsonContentProcessor.java:165)
        at io.micronaut.core.async.subscriber.CompletionAwareSubscriber.onComplete(CompletionAwareSubscriber.java:71)
        at io.micronaut.http.netty.reactive.HandlerPublisher.complete(HandlerPublisher.java:416)
        at io.micronaut.http.netty.reactive.HandlerPublisher.handlerRemoved(HandlerPublisher.java:403)
        at io.netty.channel.AbstractChannelHandlerContext.callHandlerRemoved(AbstractChannelHandlerContext.java:979)
        at io.netty.channel.DefaultChannelPipeline.callHandlerRemoved0(DefaultChannelPipeline.java:637)
        at io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:477)
        at io.netty.channel.DefaultChannelPipeline.remove(DefaultChannelPipeline.java:423)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.removeHandlerIfActive(HttpStreamsHandler.java:388)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.handleReadHttpContent(HttpStreamsHandler.java:253)
        at io.micronaut.http.netty.stream.HttpStreamsHandler.channelRead(HttpStreamsHandler.java:228)
        at io.micronaut.http.netty.stream.HttpStreamsServerHandler.channelRead(HttpStreamsServerHandler.java:121)
        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.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
        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.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
        at io.netty.handler.codec.http.HttpServerKeepAliveHandler.channelRead(HttpServerKeepAliveHandler.java:64)
        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.flow.FlowControlHandler.dequeue(FlowControlHandler.java:191)
        at io.netty.handler.flow.FlowControlHandler.read(FlowControlHandler.java:130)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.netty.channel.ChannelDuplexHandler.read(ChannelDuplexHandler.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeRead(AbstractChannelHandlerContext.java:686)
        at io.netty.channel.AbstractChannelHandlerContext.read(AbstractChannelHandlerContext.java:671)
        at io.micronaut.http.netty.reactive.HandlerPublisher.requestDemand(HandlerPublisher.java:163)
        at io.micronaut.http.netty.stream.HttpStreamsHandler$1.requestDemand(HttpStreamsHandler.java:220)
        at io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.receivedDemand(HandlerPublisher.java:547)
        at io.micronaut.http.netty.reactive.HandlerPublisher$ChannelSubscription.lambda$request$0(HandlerPublisher.java:474)
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:497)
        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:834)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
Caused by: org.apache.kafka.common.KafkaException: Failed to construct kafka producer
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:434)
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:313)
        at io.micronaut.configuration.kafka.KafkaProducerFactory.createProducer(KafkaProducerFactory.java:59)
        at io.micronaut.configuration.kafka.$KafkaProducerFactory$CreateProducer0Definition.doBuild(Unknown Source)
        at io.micronaut.context.AbstractParametrizedBeanDefinition.build(AbstractParametrizedBeanDefinition.java:118)
        at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1876)
        ... 99 common frames omitted
Caused by: org.apache.kafka.common.KafkaException: java.util.MissingResourceException: Resource bundle not found sun.security.util.Resources. Register the resource bundle using the option -H:IncludeResourceBundles=sun.security.util.Resources.
        at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:172)
        at org.apache.kafka.common.network.ChannelBuilders.create(ChannelBuilders.java:157)
        at org.apache.kafka.common.network.ChannelBuilders.clientChannelBuilder(ChannelBuilders.java:73)
        at org.apache.kafka.clients.ClientUtils.createChannelBuilder(ClientUtils.java:105)
        at org.apache.kafka.clients.producer.KafkaProducer.newSender(KafkaProducer.java:442)
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:423)
        ... 104 common frames omitted
Caused by: java.util.MissingResourceException: Resource bundle not found sun.security.util.Resources. Register the resource bundle using the option -H:IncludeResourceBundles=sun.security.util.Resources.
        at com.oracle.svm.core.jdk.LocalizationSupport.getCached(LocalizationSupport.java:66)
        at java.util.ResourceBundle.getBundle(ResourceBundle.java:53)
        at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1705)
        at sun.security.util.ResourcesMgr.getBundle(ResourcesMgr.java:54)
        at sun.security.util.ResourcesMgr.getString(ResourcesMgr.java:40)
        at javax.security.auth.login.LoginContext.invoke(LoginContext.java:871)
        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:665)
        at javax.security.auth.login.LoginContext$4.run(LoginContext.java:663)
        at java.security.AccessController.doPrivileged(AccessController.java:146)
        at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:663)
        at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
        at org.apache.kafka.common.security.authenticator.AbstractLogin.login(AbstractLogin.java:60)
        at org.apache.kafka.common.security.authenticator.LoginManager.<init>(LoginManager.java:62)
        at org.apache.kafka.common.security.authenticator.LoginManager.acquireLoginManager(LoginManager.java:105)
        at org.apache.kafka.common.network.SaslChannelBuilder.configure(SaslChannelBuilder.java:158)
        ... 109 common frames omitted

Environment Information

  • Operating System: Windows (Docker Desktop version 2.5.0.0). Error also occurs when running in Google Cloud Run
  • Micronaut Version: 2.0.1
  • JDK Version: graalvm-ce-java11-20.2.0
@graemerocher
Copy link
Contributor

Have you tried -H:IncludeResourceBundles=sun.security.util.Resources as per the error message

@joost-lambregts
Copy link
Author

Have you tried -H:IncludeResourceBundles=sun.security.util.Resources as per the error message

Where should I put the argument though? I assume I can't just pass it to the buildDockerNative Gradle command?

@graemerocher
Copy link
Contributor

graemerocher commented Nov 5, 2020

Use in build.gradle:

nativeImage {
    args("-H:IncludeResourceBundles=sun.security.util.Resources")
} 

@joost-lambregts
Copy link
Author

Tried it, it doesn't work. I get the same error message.
When I look at the generated DockerFileNative it looks like this:

FROM oracle/graalvm-ce:20.2.0-java11 AS graalvm
RUN gu install native-image
WORKDIR /home/app
COPY build/layers/libs /home/app/libs
COPY build/layers/resources /home/app/resources
COPY build/layers/application.jar /home/app/application.jar
RUN native-image -H:Class=nl.amis.Application -H:Name=application --no-fallback -cp /home/app/libs/*.jar:/home/app/resources:/home/app/application.jar
FROM frolvlad/alpine-glibc
RUN apk update && apk add libstdc++
COPY --from=graalvm /home/app/application /app/application
ENTRYPOINT ["/app/application", "-H:IncludeResourceBundles=sun.security.util.Resources"]

The -H:IncludeResourceBundles argument gets added to the ENTRYPOINT line, but I think I need it to be added as an argument to the RUN native-image line

@joost-lambregts
Copy link
Author

I got a bit further. I copied the generated DockerFileNative and moved the IncludeResource flag to the RUN native-image line. I then ran docker build against that dockerfile. I now get a different SASL exception:

14:40:09.181 [kafka-producer-network-thread | producer-1] INFO  o.a.k.c.network.SaslChannelBuilder - [Producer clientId=producer-1] Failed to create channel due to
org.apache.kafka.common.errors.SaslAuthenticationException: Failed to configure SaslClientAuthenticator
Caused by: org.apache.kafka.common.errors.SaslAuthenticationException: Failed to create SaslClient with mechanism PLAIN
Caused by: javax.security.sasl.SaslException: Cannot get userid/password
        at com.sun.security.sasl.ClientFactoryImpl.getUserInfo(ClientFactoryImpl.java:157)
        at com.sun.security.sasl.ClientFactoryImpl.createSaslClient(ClientFactoryImpl.java:94)
        at javax.security.sasl.Sasl.createSaslClient(Sasl.java:433)
        at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.lambda$createSaslClient$0(SaslClientAuthenticator.java:187)
        at java.security.AccessController.doPrivileged(AccessController.java:146)
        at javax.security.auth.Subject.doAs(Subject.java:423)
        at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.createSaslClient(SaslClientAuthenticator.java:183)
        at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.<init>(SaslClientAuthenticator.java:175)
        at org.apache.kafka.common.network.SaslChannelBuilder.buildClientAuthenticator(SaslChannelBuilder.java:274)
        at org.apache.kafka.common.network.SaslChannelBuilder.lambda$buildChannel$1(SaslChannelBuilder.java:216)
        at org.apache.kafka.common.network.KafkaChannel.<init>(KafkaChannel.java:143)
        at org.apache.kafka.common.network.SaslChannelBuilder.buildChannel(SaslChannelBuilder.java:224)
        at org.apache.kafka.common.network.Selector.buildAndAttachKafkaChannel(Selector.java:338)
        at org.apache.kafka.common.network.Selector.registerChannel(Selector.java:329)
        at org.apache.kafka.common.network.Selector.connect(Selector.java:256)
        at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:957)
        at org.apache.kafka.clients.NetworkClient.access$600(NetworkClient.java:73)
        at org.apache.kafka.clients.NetworkClient$DefaultMetadataUpdater.maybeUpdate(NetworkClient.java:1128)
        at org.apache.kafka.clients.NetworkClient$DefaultMetadataUpdater.maybeUpdate(NetworkClient.java:1016)
        at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:547)
        at org.apache.kafka.clients.producer.internals.Sender.runOnce(Sender.java:324)
        at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:239)
        at java.lang.Thread.run(Thread.java:834)
        at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
        at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
Caused by: javax.security.auth.callback.UnsupportedCallbackException: Could not login: the client is being asked for a password, but the Kafka client code does not currently support obtaining a password from the user.
        at org.apache.kafka.common.security.authenticator.SaslClientCallbackHandler.handle(SaslClientCallbackHandler.java:73)
        at com.sun.security.sasl.ClientFactoryImpl.getUserInfo(ClientFactoryImpl.java:136)
        ... 24 common frames omitted

I think it is noteworthy that I recognize this error from the quarkus issue thread I mentioned earlier:
quarkusio/quarkus#5254 (comment)

@graemerocher
Copy link
Contributor

You could try copy this substitution into your code base to see if it resolves it

https://github.com/quarkusio/quarkus/pull/8817/files#diff-684881d26520d00c62011b100c114e743058debe648a676eff55ef1e4fcbbb05R35

If it does it may make sense to gather all your modifications and turn them into a PR so this works in Micronaut out of the box

@joost-lambregts
Copy link
Author

Yes, this works! Thank you for your swift replies and help :)

@graemerocher
Copy link
Contributor

@joost-lambregts could you post your final native image config settings, so someone can turn these discoveries into a PR

@joost-lambregts
Copy link
Author

To sum up what I did:

I added the following TypeHint to my Application class. I'm not sure if you need all those classes:

@TypeHint({org.apache.kafka.common.security.plain.PlainLoginModule.class, ProducerKafkaMetricsReporter.class, SaslClientCallbackHandler.class,SaslClientCallbackHandler.class, DefaultLogin.class, AbstractLogin.DefaultLoginCallbackHandler.class})

I manually ran the docker build instead of using gradel dockerBuildNative. I used the DockerFileNative generated by gradle dockerBuildNative but added the -H:IncludeResourceBundles=sun.security.util.Resources parameter to the RUN native-image line. My final DockerFile looks like this:

FROM oracle/graalvm-ce:20.2.0-java11 AS graalvm
RUN gu install native-image
WORKDIR /home/app
COPY build/layers/libs /home/app/libs
COPY build/layers/resources /home/app/resources
COPY build/layers/application.jar /home/app/application.jar
RUN native-image -H:IncludeResourceBundles=sun.security.util.Resources -H:Class=nl.amis.Application -H:Name=application --no-fallback -cp /home/app/libs/*.jar:/home/app/resources:/home/app/application.jar
FROM frolvlad/alpine-glibc
RUN apk update && apk add libstdc++
COPY --from=graalvm /home/app/application /app/application
ENTRYPOINT ["/app/application"]

I added this class to my codebase: https://github.com/quarkusio/quarkus/pull/8817/files#diff-684881d26520d00c62011b100c114e743058debe648a676eff55ef1e4fcbbb05R35

For that class to compile I also needed to add the following dependency to my gradle build: compileOnly ("com.oracle.substratevm:svm:19.2.1")

I think that's it. If you have any questions let me know.

@graemerocher graemerocher transferred this issue from micronaut-projects/micronaut-core Nov 6, 2020
@graemerocher graemerocher added relates-to: graal type: improvement A minor improvement to an existing feature labels Nov 6, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
relates-to: graal type: improvement A minor improvement to an existing feature
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants