使用Paramiko获取Kafka消费组延迟总和始终为0,手动执行正常
问题排查与解决方案
核心问题:消费组名称含多余换行符
你用stdout.readlines()获取的消费组列表,每个元素末尾都带有换行符(\n),直接代入命令后,--group参数会变成"消费组名\n",Kafka找不到这个不存在的组,所以awk计算的延迟总和自然是0。
修复步骤
- 清理消费组名称
遍历列表时,用strip()去掉每个名称的首尾空白(包括换行、空格),同时跳过空行:
for consumer in list_consumers: consumer = consumer.strip() if not consumer: continue # 后续命令执行逻辑
- 验证拼接后的命令
先打印拼接好的命令,确认消费组名称没有多余字符:
cmd = f"/home/prduser/kafka_2.12-2.1.0/bin/kafka-consumer-groups.sh --bootstrap-server localhost:19092,localhost:29092,localhost:39092 --describe --group {consumer} | awk '{{sum+=$5}} END {{print sum}}'" print(cmd) # 检查命令格式是否正确 stdin, stdout, stderr = ssh.exec_command(cmd)
- 检查错误输出
不要忽略stderr的内容,执行后打印错误信息,排查其他潜在问题:
err_msg = stderr.read().decode('utf-8') if err_msg: print(f"命令执行错误: {err_msg}")
额外排查方向
- 环境变量差异:手动执行时的shell环境和Paramiko的执行环境可能不同,可尝试用
bash -lc加载用户配置后执行命令:
cmd = f'bash -lc "/home/prduser/kafka_2.12-2.1.0/bin/kafka-consumer-groups.sh --bootstrap-server localhost:19092,localhost:29092,localhost:39092 --describe --group {consumer} | awk \'{{sum+=$5}} END {{print sum}}\'"' stdin, stdout, stderr = ssh.exec_command(cmd)
- 确认awk字段位置:不同Kafka版本的
--describe输出列顺序可能变化,手动执行该命令确认第5列确实是延迟数值。
内容的提问来源于stack exchange,提问作者Ashok Developer
相关产品推荐
相关产品推荐

