分布式Kafka Connector禁用JMX后/metrics端点404报错求助
Kafka Connect分布式模式下/metrics端点404错误排查
问题描述
在分布式模式运行Kafka Connector时,已通过-Dcom.sun.management.jmxremote=false显式禁用JMX指标暴露,但/metrics端点仍每隔45.12秒被调用一次,返回404资源未找到错误,相关堆栈日志如下:
ERROR Uncaught exception in REST call to /metrics (org.apache.kafka.connect.runtime.rest.errors.ConnectExceptionMapper:61) javax.ws.rs.NotFoundException: HTTP 404 Not Found at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:252) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244) at org.glassfish.jersey.internal.Errors.process(Errors.java:292) at org.glassfish.jersey.internal.Errors.process(Errors.java:274) at org.glassfish.jersey.internal.Errors.process(Errors.java:244) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265) at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:234) at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:680) at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394) at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:366) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:319) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:205) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799) at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:554) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624) at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505) at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594) at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355) at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:234) at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:181) at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) at org.eclipse.jetty.server.Server.handle(Server.java:516) at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487) at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732) at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479) at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277) at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173) at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131) at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409) at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883) at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034) at java.base/java.lang.Thread.run(Thread.java:829)
当前使用的启动命令:
java -Xms256M -Xmx2G -server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+ExplicitGCInvokesConcurrent -XX:MaxInlineLevel=15 -Djava.awt.headless=true -Dcom.sun.management.jmxremote=false -Dkafka.logs.dir=/home/kafka_2.13-3.2.3/bin/../logs -Dlog4j.configuration=file:/home/kafka_2.13-3.2.3/bin/../config/connect-log4j.properties -cp /home/kafka_2.13-3.2.3/bin/../libs/activation-1.1.1.jar
问题根源
- 禁用JMX(
-Dcom.sun.management.jmxremote=false)不会关闭Kafka Connect的REST/metrics端点,该端点依赖Kafka内置的Metrics系统,与JMX是独立组件。 - 定时调用的触发源通常是两类:Connect集群内部节点的健康检查,或是外部监控工具(如Prometheus)的定时采集请求。
解决方案
1. 定位调用来源
- 启用Connect的访问日志(修改Jetty配置或使用反向代理日志),查看请求
/metrics的客户端IP:- 集群内部节点:检查
connect-distributed.properties中的rest.healthcheck.path配置,默认应为/或/healthcheck,若被误设为/metrics,改回默认值即可停止内部节点的错误请求。 - 外部监控工具:找到对应监控的配置项,将采集路径修改为正确的端点(如需保留监控),或直接停止对该路径的请求。
- 集群内部节点:检查
2. 彻底关闭Metrics端点(若无需指标)
在connect-distributed.properties中添加以下配置,禁用Metrics报告:
metrics.reporters= metrics.num.samples=1 metrics.sample.window.ms=30000
同时确保没有启用第三方Metrics Reporter(如Prometheus)的相关配置。
3. 修复404错误(若需保留Metrics)
若需要Metrics功能,需正确配置Metrics端点:
- 确保Connect类路径包含Metrics相关依赖(Kafka 3.x版本默认已包含)。
- 在
connect-distributed.properties中配置Metrics Reporter,以Prometheus为例:
配置完成后重启Connect,metrics.reporters=io.prometheus.client.exporter.MetricsServlet prometheus.metrics.reporter.port=8080 prometheus.metrics.reporter.path=/metrics/metrics端点将正常返回指标数据,不再出现404错误。
内容的提问来源于stack exchange,提问作者Gopal
相关产品推荐
相关产品推荐

