Logstash Kafka Output with Azure Managed Identity Failing with ClassNotFoundException

Hello everyone,

I'm trying to configure Logstash to send data to an Azure Event Hub using Kafka output with Azure Managed Identity authentication. I'm using a custom Kafka OAuthBearer class for Azure authentication, which I've found on GitHub (GitHub - ssijbabu/azure-kafka-oauthbearer: Kafka `CallbackHandler` implementation to support Azure Managed Identity).

Here's my setup:
logstash.conf:

input {
    generator {
        lines => [
            "Hello to the world!"
        ]
        count => 1
    }
}

filter {

}

output {
    stdout {
    }
    kafka {
        codec => json
        enable_metric => "false"
        topic_id => "<eventhub-name>"
        bootstrap_servers => "<eventhub-namespace>.servicebus.windows.net:9093"
        max_request_size => 10240000

        security_protocol        => "SASL_SSL"
        sasl_mechanism          => "OAUTHBEARER"

        sasl.login.callback.handler.class => "io.conduktor.kafka.security.oauthbearer.azure.AzureManagedIdentityCallbackHandler"
        sasl.jaas.config => "org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required scope=\"https://<eventhub host name>/.default\";"
    }
}

Dockerfile:

FROM artifactory.shbmain.shb.biz/docker-docker.elastic.co/logstash/logstash:8.18.0-a7f60a3d-SNAPSHOT

ENV AZURE_CLIENT_ID = ""
ENV AZURE_CLIENT_SECRET = ""
ENV AZURE_TENANT_ID = ""

COPY target/azure-kafka-oauthbearer-1.0.0.jar /usr/share/logstash/logstash-core/lib/jars/azure-kafka-oauthbearer-0.1.0.jar

COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf

I've built the Docker image with the custom JAR and configuration files. However, when I run the container, I'm getting the following error:

[2025-03-23T10:43:17,223][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600, :ssl_enabled=>false}
[2025-03-23T10:43:17,558][INFO ][org.reflections.Reflections] Reflections took 114 ms to scan 1 urls, producing 150 keys and 528 values
[2025-03-23T10:43:17,769][INFO ][logstash.codecs.json     ] ECS compatibility is enabled but `target` option was not specified. This may cause fields to be set at the top-level of the event where they are likely to clash with the Elastic Common Schema. It is recommended to set the `target` option to avoid potential schema conflicts (if your data is ECS compliant or non-conflicting, feel free to ignore this message)
[2025-03-23T10:43:17,792][INFO ][logstash.javapipeline    ] Pipeline `main` is configured with `pipeline.ecs_compatibility: v8` setting. All plugins in this pipeline will default to `ecs_compatibility => v8` unless explicitly configured otherwise.
[2025-03-23T10:43:17,859][INFO ][logstash.javapipeline    ][main] Pipeline terminated {"pipeline.id"=>"main"}
[2025-03-23T10:43:17,868][ERROR][logstash.agent           ] Failed to execute action {:id=>:main, :action_type=>LogStash::ConvergeResult::FailedAction, :message=>"Could not execute action: PipelineAction::Create<main>, action_result: false", :backtrace=>nil}
[2025-03-23T10:43:17,860][FATAL][org.logstash.Logstash    ][main] uncaught error (in thread [main]-pipeline-manager)
java.lang.NoClassDefFoundError: org/apache/kafka/common/security/auth/AuthenticateCallbackHandler
        at java.lang.ClassLoader.defineClass1(Native Method) ~[?:?]
        at java.lang.ClassLoader.defineClass(java/lang/ClassLoader.java:1027) ~[?:?]
        at java.security.SecureClassLoader.defineClass(java/security/SecureClassLoader.java:150) ~[?:?]
        at jdk.internal.loader.BuiltinClassLoader.defineClass(jdk/internal/loader/BuiltinClassLoader.java:862) ~[?:?]
        at jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(jdk/internal/loader/BuiltinClassLoader.java:760) ~[?:?]
        at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(jdk/internal/loader/BuiltinClassLoader.java:681) ~[?:?]
        at jdk.internal.loader.BuiltinClassLoader.loadClass(jdk/internal/loader/BuiltinClassLoader.java:639) ~[?:?]
        at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(jdk/internal/loader/ClassLoaders.java:188) ~[?:?]
        at java.lang.ClassLoader.loadClass(java/lang/ClassLoader.java:580) ~[?:?]
        at java.lang.ClassLoader.loadClass(java/lang/ClassLoader.java:526) ~[?:?]
        at org.apache.kafka.common.utils.Utils.loadClass(org/apache/kafka/common/utils/Utils.java:430) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.ConfigDef.parseType(org/apache/kafka/common/config/ConfigDef.java:769) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.ConfigDef.parseValue(org/apache/kafka/common/config/ConfigDef.java:531) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.ConfigDef.parse(org/apache/kafka/common/config/ConfigDef.java:524) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.AbstractConfig.<init>(org/apache/kafka/common/config/AbstractConfig.java:114) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.AbstractConfig.<init>(org/apache/kafka/common/config/AbstractConfig.java:134) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.clients.producer.ProducerConfig.<init>(org/apache/kafka/clients/producer/ProducerConfig.java:643) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(org/apache/kafka/clients/producer/KafkaProducer.java:295) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(org/apache/kafka/clients/producer/KafkaProducer.java:322) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(org/apache/kafka/clients/producer/KafkaProducer.java:307) ~[kafka-clients-3.8.1.jar:?]
        at jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(jdk/internal/reflect/DirectConstructorHandleAccessor.java:62) ~[?:?]
        at java.lang.reflect.Constructor.newInstanceWithCaller(java/lang/reflect/Constructor.java:502) ~[?:?]
        at java.lang.reflect.Constructor.newInstance(java/lang/reflect/Constructor.java:486) ~[?:?]
        at org.jruby.javasupport.JavaConstructor.newInstanceDirect(org/jruby/javasupport/JavaConstructor.java:165) ~[jruby.jar:?]
        at org.jruby.RubyClass.new(org/jruby/RubyClass.java:922) ~[jruby.jar:?]
        at org.jruby.RubyClass$INVOKER$i$newInstance.call(org/jruby/RubyClass$INVOKER$i$newInstance.gen) ~[jruby.jar:?]
        at RUBY.create_producer(/usr/share/logstash/vendor/bundle/jruby/3.1.0/gems/logstash-integration-kafka-11.6.0-java/lib/logstash/outputs/kafka.rb:390) ~[?:?]
        at RUBY.register(/usr/share/logstash/vendor/bundle/jruby/3.1.0/gems/logstash-integration-kafka-11.6.0-java/lib/logstash/outputs/kafka.rb:230) ~[?:?]
        at org.jruby.RubyClass.finvoke(org/jruby/RubyClass.java:598) ~[jruby.jar:?]
        at org.jruby.RubyBasicObject.callMethod(org/jruby/RubyBasicObject.java:349) ~[jruby.jar:?]
        at org.logstash.config.ir.compiler.OutputStrategyExt$SimpleAbstractOutputStrategyExt.reg(org/logstash/config/ir/compiler/OutputStrategyExt.java:275) ~[logstash-core.jar:?]
        at org.logstash.config.ir.compiler.OutputStrategyExt$AbstractOutputStrategyExt.register(org/logstash/config/ir/compiler/OutputStrategyExt.java:131) ~[logstash-core.jar:?]
        at org.logstash.config.ir.compiler.OutputDelegatorExt.doRegister(org/logstash/config/ir/compiler/OutputDelegatorExt.java:126) ~[logstash-core.jar:?]
        at org.logstash.config.ir.compiler.AbstractOutputDelegatorExt.register(org/logstash/config/ir/compiler/AbstractOutputDelegatorExt.java:69) ~[logstash-core.jar:?]
        at org.logstash.config.ir.compiler.AbstractOutputDelegatorExt$INVOKER$i$0$0$register.call(org/logstash/config/ir/compiler/AbstractOutputDelegatorExt$INVOKER$i$0$0$register.gen) ~[jruby.jar:?]
        at RUBY.register_plugins(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:245) ~[?:?]
        at org.jruby.RubyArray.each(org/jruby/RubyArray.java:1981) ~[jruby.jar:?]
        at org.jruby.RubyArray$INVOKER$i$0$0$each.call(org/jruby/RubyArray$INVOKER$i$0$0$each.gen) ~[jruby.jar:?]
        at RUBY.register_plugins(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:244) ~[?:?]
        at RUBY.maybe_setup_out_plugins(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:622) ~[?:?]
        at RUBY.start_workers(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:257) ~[?:?]
        at RUBY.run(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:198) ~[?:?]
        at RUBY.start(/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:150) ~[?:?]
        at org.jruby.RubyProc.call(org/jruby/RubyProc.java:354) ~[jruby.jar:?]
        at java.lang.Thread.run(java/lang/Thread.java:1583) ~[?:?]
Caused by: java.lang.ClassNotFoundException: org.apache.kafka.common.security.auth.AuthenticateCallbackHandler
        at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[?:?]
        at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]
        at java.lang.ClassLoader.defineClass1(Native Method) ~[?:?]
        at java.lang.ClassLoader.defineClass(ClassLoader.java:1027) ~[?:?]
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) ~[?:?]
        at jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) ~[?:?]
        at jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) ~[?:?]
        at jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) ~[?:?]
        at jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) ~[?:?]
        at jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[?:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:580) ~[?:?]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:526) ~[?:?]
        at org.apache.kafka.common.utils.Utils.loadClass(Utils.java:430) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.ConfigDef.parseType(ConfigDef.java:769) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.ConfigDef.parseValue(ConfigDef.java:531) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.ConfigDef.parse(ConfigDef.java:524) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.java:114) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.common.config.AbstractConfig.<init>(AbstractConfig.java:134) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.clients.producer.ProducerConfig.<init>(ProducerConfig.java:643) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:295) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:322) ~[kafka-clients-3.8.1.jar:?]
        at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:307) ~[kafka-clients-3.8.1.jar:?]
        at jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62) ~[?:?]
        at java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502) ~[?:?]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:486) ~[?:?]
        at org.jruby.javasupport.JavaConstructor.newInstanceDirect(JavaConstructor.java:165) ~[jruby.jar:?]
        at org.jruby.java.invokers.ConstructorInvoker.call(ConstructorInvoker.java:85) ~[jruby.jar:?]
        at org.jruby.java.invokers.ConstructorInvoker.call(ConstructorInvoker.java:174) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:471) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:259) ~[jruby.jar:?]
        at org.jruby.java.proxies.ConcreteJavaProxy$InitializeMethod.call(ConcreteJavaProxy.java:93) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:471) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:259) ~[jruby.jar:?]
        at org.jruby.RubyClass.newInstance(RubyClass.java:922) ~[jruby.jar:?]
        at org.jruby.RubyClass$INVOKER$i$newInstance.call(RubyClass$INVOKER$i$newInstance.gen) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodZeroOrOneOrNBlock.call(JavaMethod.java:355) ~[jruby.jar:?]
        at org.jruby.java.proxies.ConcreteJavaProxy$NewMethod.call(ConcreteJavaProxy.java:188) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:466) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:244) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:314) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.interpret(InterpreterEngine.java:76) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.INTERPRET_METHOD(MixedModeIRMethod.java:164) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.call(MixedModeIRMethod.java:151) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:212) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:456) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:195) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:346) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.interpret(InterpreterEngine.java:76) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.INTERPRET_METHOD(MixedModeIRMethod.java:164) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.call(MixedModeIRMethod.java:151) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:212) ~[jruby.jar:?]
        at org.jruby.RubyClass.finvoke(RubyClass.java:598) ~[jruby.jar:?]
        at org.jruby.runtime.Helpers.invoke(Helpers.java:708) ~[jruby.jar:?]
        at org.jruby.RubyBasicObject.callMethod(RubyBasicObject.java:349) ~[jruby.jar:?]
        at org.logstash.config.ir.compiler.OutputStrategyExt$SimpleAbstractOutputStrategyExt.reg(OutputStrategyExt.java:275) ~[logstash-core.jar:?]
        at org.logstash.config.ir.compiler.OutputStrategyExt$AbstractOutputStrategyExt.register(OutputStrategyExt.java:131) ~[logstash-core.jar:?]
        at org.logstash.config.ir.compiler.OutputDelegatorExt.doRegister(OutputDelegatorExt.java:126) ~[logstash-core.jar:?]
        at org.logstash.config.ir.compiler.AbstractOutputDelegatorExt.register(AbstractOutputDelegatorExt.java:69) ~[logstash-core.jar:?]
        at org.logstash.config.ir.compiler.AbstractOutputDelegatorExt$INVOKER$i$0$0$register.call(AbstractOutputDelegatorExt$INVOKER$i$0$0$register.gen) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:193) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:346) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.Interpreter.INTERPRET_BLOCK(Interpreter.java:118) ~[jruby.jar:?]
        at org.jruby.runtime.MixedModeIRBlockBody.commonYieldPath(MixedModeIRBlockBody.java:136) ~[jruby.jar:?]
        at org.jruby.runtime.IRBlockBody.doYield(IRBlockBody.java:169) ~[jruby.jar:?]
        at org.jruby.runtime.BlockBody.yield(BlockBody.java:108) ~[jruby.jar:?]
        at org.jruby.runtime.Block.yield(Block.java:189) ~[jruby.jar:?]
        at org.jruby.RubyArray.each(RubyArray.java:1981) ~[jruby.jar:?]
        at org.jruby.RubyArray$INVOKER$i$0$0$each.call(RubyArray$INVOKER$i$0$0$each.gen) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.JavaMethod$JavaMethodZeroBlock.call(JavaMethod.java:561) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:446) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:92) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.callIter(CachingCallSite.java:103) ~[jruby.jar:?]
        at org.jruby.ir.instructions.CallBase.interpret(CallBase.java:545) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:363) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.interpret(InterpreterEngine.java:82) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.INTERPRET_METHOD(MixedModeIRMethod.java:201) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.call(MixedModeIRMethod.java:188) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:220) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:466) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:244) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:314) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.interpret(InterpreterEngine.java:76) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.INTERPRET_METHOD(MixedModeIRMethod.java:164) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.call(MixedModeIRMethod.java:151) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:212) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:456) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:195) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:346) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.interpret(InterpreterEngine.java:76) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.INTERPRET_METHOD(MixedModeIRMethod.java:164) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.call(MixedModeIRMethod.java:151) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:212) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:456) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:195) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:346) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.interpret(InterpreterEngine.java:76) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.INTERPRET_METHOD(MixedModeIRMethod.java:164) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.MixedModeIRMethod.call(MixedModeIRMethod.java:151) ~[jruby.jar:?]
        at org.jruby.internal.runtime.methods.DynamicMethod.call(DynamicMethod.java:212) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.cacheAndCall(CachingCallSite.java:456) ~[jruby.jar:?]
        at org.jruby.runtime.callsite.CachingCallSite.call(CachingCallSite.java:195) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.InterpreterEngine.processCall(InterpreterEngine.java:346) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.StartupInterpreterEngine.interpret(StartupInterpreterEngine.java:66) ~[jruby.jar:?]
        at org.jruby.ir.interpreter.Interpreter.INTERPRET_BLOCK(Interpreter.java:118) ~[jruby.jar:?]
        at org.jruby.runtime.MixedModeIRBlockBody.commonYieldPath(MixedModeIRBlockBody.java:136) ~[jruby.jar:?]
        at org.jruby.runtime.IRBlockBody.call(IRBlockBody.java:66) ~[jruby.jar:?]
        at org.jruby.runtime.IRBlockBody.call(IRBlockBody.java:58) ~[jruby.jar:?]
        at org.jruby.runtime.Block.call(Block.java:144) ~[jruby.jar:?]
        at org.jruby.RubyProc.call(RubyProc.java:354) ~[jruby.jar:?]
        at org.jruby.internal.runtime.RubyRunnable.run(RubyRunnable.java:111) ~[jruby.jar:?]
        at java.lang.Thread.run(Thread.java:1583) ~[?:?]
[2025-03-23T10:43:17,907][INFO ][logstash.runner          ] Logstash shut down.

It seems like Logstash is unable to find the AuthenticateCallbackHandler class, which is part of the Kafka client library. I've included the custom JAR containing the Azure Managed Identity callback handler, but it appears the core Kafka libraries are missing or not being loaded correctly.

Has anyone encountered this issue before? Any suggestions on how to resolve this ClassNotFoundException?

Any help or guidance on troubleshooting this issue would be greatly appreciated. If anyone has successfully configured Logstash with Azure Event Hub using Managed Identity, please share your configurations or insights.

Thank you!