Kinesis Agent上报Python流数据错误 求技术排查
排查Kinesis Agent处理Python流式日志的报错问题
这种链路卡在上游Agent的情况我之前折腾过好多次,咱们一步步拆解排查,先从最核心的错误日志入手:
1. 先揪出Agent的具体错误细节
Kinesis Agent自己的日志是排查的关键,先去看它的日志文件(默认路径是/var/log/aws-kinesis-agent/aws-kinesis-agent.log,如果是自定义配置的路径就找你设置的位置)。重点找和你Python生成的日志文件相关的报错,常见的坑有这些:
Permission denied:Agent进程没权限读你的日志文件Invalid data format:日志格式和Agent配置里的log_format不匹配File not found:Agent配置里的文件路径和Python实际写的路径对不上(比如相对路径/绝对路径搞混了)Checkpoint write failed:Agent没法写入 checkpoint 文件(用来记录已经读到哪一行),大概率是权限或者磁盘满了
2. 验证日志文件的权限与可访问性
- 先搞清楚Python写日志用的用户,和Kinesis Agent运行的用户(一般是
kinesisagent或者root)是不是有权限交叉访问:比如Python用ubuntu用户写了/home/ubuntu/app/logs/stream.log,那Agent用户得有这个文件的读权限,还有父目录的执行权限(才能进到目录里) - 可以用
ls -l /path/to/your/logfile看权限,再用sudo -u kinesisagent cat /path/to/your/logfile测试Agent用户能不能正常读取文件
3. 核对Agent配置文件的正确性
Agent的配置(默认是/etc/aws-kinesis/agent.json)必须和你的日志格式严丝合缝:
- 如果你的Python日志是每行一条JSON,那配置里要设
"log_format": "JSON" - 如果是自定义文本格式,比如
2024-05-20 10:00:00 [INFO] data: xxx,那得把对应的正则表达式写到"log_format"里,比如"log_format": "%Y-%m-%d %H:%M:%S \\[%LEVEL%\\] data: %DATA%" - 还要确认
"file_pattern"是不是准确指向你的日志文件,如果是滚动日志(比如stream.log.1、stream.log.2),得写成"file_pattern": "/path/to/stream.log*" - 注意Firehose流的名称和Agent配置里的
"delivery_stream"是大小写敏感的,必须完全一致!
4. 测试Agent对单条日志的兼容性
可以手动在日志文件末尾加一条符合格式的测试数据,看看Agent能不能正常处理:
echo '{"timestamp": "2024-05-20T10:00:00Z", "data": "test"}' >> /path/to/your/logfile
然后去Agent日志里找有没有Successfully delivered record to Firehose stream这类成功信息。如果这条测试数据能推送成功,那大概率是Python生成的某些日志有格式问题(比如特殊字符、未闭合的JSON)
5. 检查Agent的AWS权限
虽然你说Agent已经启动,但还是要确认它的IAM身份(角色/用户)有没有足够的权限:
- 必须要有
firehose:PutRecordBatch权限,而且目标是你的Firehose流 - 如果用的是EC2实例角色,要确认实例已经关联了正确的IAM角色,并且角色的信任关系配置没问题
- 可以用Agent的权限身份跑个测试命令,直接推数据到Firehose:
aws firehose put-record-batch --delivery-stream-name YOUR_STREAM_NAME --records '[{"Data": "dGVzdA=="}]'
如果这个命令能成功,说明权限没问题;如果失败,就针对性调整IAM策略
6. 排查Python日志写入的特殊情况
- 确认Python是用追加模式写日志的(比如
open("stream.log", "a")),别用覆盖模式,不然Agent可能会重复读或者漏读 - 检查Python写日志有没有缓冲问题:默认的
print或者logging模块可能会攒一批再刷到磁盘,导致Agent实时读不到。可以在Python代码里加flush=True,比如logging.info(data, flush=True)或者print(data, file=f, flush=True)
内容的提问来源于stack exchange,提问作者Yuva
相关产品推荐
相关产品推荐

