现象描述

用别人构建好的prometheus-kafka-adapter二进制文件,在服务器上按照文档提示配置KAFKA_BROKER_LIST环境变量,启动提示"client has run out of available brokers to talk to"。


排查过程

  1. prometheus-kafka-adapter所在的服务器上运行kafka-console-producer.sh,确认不存在网络隔离;
  2. 执行kafka-console-producer.sh的过程中发现命令不支持"–bootstrap-server"参数,只支持"–broker-list",说明kafka版本较低,经验证为0.10.2(2.5.0版本开始支持"–bootstrap-server");
  3. prometheus-kafka-adapter依赖的kafka库叫做"confluentinc/confluent-kafka-go",这个库的api文档里提到了如果要创建producer,需要支持"bootstrap.servers"属性(翻译的时候粗心大意,伏笔了),猜想会不会是因为用到的kafka版本不支持这个参数导致producer创建失败的;
  4. 找的过程中发现之前有同事成功启动过prometheus-kafka-adapter,并且用的kafka版本是1.1.0,也不支持"–bootstrap-server",所以应该不是producer参数导致的问题,再看api文档发现正确的翻译应该是newProducer()方法会创建一个至少包含bootstrap.servers属性的producer,换方向思考;
  5. 编译源码的过程中发现项目依赖了"Shopify/sarama",想到之前看到过相关问题,排查后发现所用的二进制文件是用旧版本代码构建的,最新的prometheus-kafka-adapter连接kafka用的库是"confluentinc/confluent-kafka-go",而不是"Shopify/sarama",用最新版本的代码编译后问题解决。

踩坑总结

  1. kafka-console-producer.sh从2.5.0版本开始支持通过"–bootstrap-server"参数描述broker列表,并将"–broker-list"参数标记为过时 (但仍然可以继续使用);
  2. “confluentinc/confluent-kafka-go"的newProducer()方法会创建一个至少包含bootstrap.servers属性的producer,能否创建成功只与kafka能否解析bootstrap.servers属性有关(至少从0.8.2版本就已经支持了),而与kafka-console-producer.sh到底支不支持”–bootstrap-servers"参数无关(kafka-console-producer.sh会调用core/src/main/scala/kafka/tools/ConsoleProducer.scala,这个文件是从0.8.2版本开始存在的);
  3. 1.27.1版本的"Shopify/sarama"库会导致"client has run out of available brokers to talk to"错误,参考issue
  1. 看文档的时候认真点!!!

参考

  1. Kafka常用命令之kafka-console-producer.sh
  2. confluentinc/confluent-kafka-go api文档
  3. 你真的了解bootstrap.servers这个参数么?
  4. go连接Kafka报错kafka: client has run out of available brokers to talk to
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐