Kafka Broker宕机时邮件告警不触发的技术求助
解决Kafka Broker宕机告警判断逻辑错误的问题
问题根源
当Kafka Broker宕机或网络不可达时,调用controller.get()会直接抛出ExecutionException(底层连接失败引发),代码直接进入catch块,根本不会执行到if(controllerId == null)的判断逻辑;而Broker正常运行时,controllerId必然不为null,所以切换判断条件为controllerId != null会错误触发告警。
修复方案
将告警逻辑移至catch块中(Broker不可用时必然抛出异常),正常获取到Controller节点时不做操作,避免误告警。
修复后的代码
import java.util.Properties; import java.util.concurrent.TimeUnit; import org.apache.kafka.clients.admin.AdminClient; import org.apache.kafka.clients.admin.AdminClientConfig; import org.apache.kafka.clients.admin.DescribeClusterResult; import org.apache.kafka.common.Node; public void checkKafkaBrokerStatus() { Properties props = new Properties(); props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); try (AdminClient adminClient = AdminClient.create(props)) { DescribeClusterResult describeClusterResult = adminClient.describeCluster(); // 添加超时时间,避免因网络问题无限阻塞 Node controller = describeClusterResult.controller().get(10, TimeUnit.SECONDS); System.out.println("Kafka Broker is online, controller node ID: " + controller.id()); } catch (Exception e) { // 捕获到异常即判定Broker不可用,触发告警 System.err.println("Kafka Broker is down or unreachable! Sending alert email..."); mailService.sendMailAlert(); // 打印异常信息用于排查问题 e.printStackTrace(); } }
优化建议
- 超时控制:通过
get(timeout, timeUnit)设置合理超时时间,避免方法因网络延迟长期阻塞 - 异常细分:针对
TimeoutException、AuthenticationException等不同异常类型,发送不同内容的告警,便于快速定位问题
内容的提问来源于stack exchange,提问作者Revansiddu Revani
相关产品推荐
相关产品推荐

