You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分布式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为例:
    metrics.reporters=io.prometheus.client.exporter.MetricsServlet
    prometheus.metrics.reporter.port=8080
    prometheus.metrics.reporter.path=/metrics
    
    配置完成后重启Connect,/metrics端点将正常返回指标数据,不再出现404错误。

内容的提问来源于stack exchange,提问作者Gopal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:23:12