如何识别CloudWatch中触发告警的具体logstream日志流来源
CloudWatch告警无法定位对应容器的解决办法
下面是三种可直接落地的解决方案,你可以根据自己的场景选择:
方案1:给现有过滤指标新增元数据维度
你可以直接修改已有的日志过滤指标配置,添加K8s元数据或log stream作为维度,这样告警触发时会直接携带对应维度值:
- 进入CloudWatch日志组的「指标过滤器」页面,编辑你需要调整的过滤规则
- 在维度配置项中新增维度:
- 如果你需要直接识别容器,可以将维度键设为
container_name,维度值选择日志中已有的kubernetes.container_name字段 - 如果你需要关联log stream,可以将维度键设为
log_stream,维度值选择@logStream内置字段
- 如果你需要直接识别容器,可以将维度键设为
- 保存后新产生的告警通知就会自动携带对应维度的取值,直接就能看到是哪个容器产生的错误
方案2:告警触发后通过CloudWatch Logs Insights快速查询
如果不想修改现有指标配置,你可以在收到告警后直接用日志查询语句定位来源,示例查询语句如下,将匹配关键词替换为你实际的告警规则即可:
fields @logStream, kubernetes.namespace_name, kubernetes.pod_name, kubernetes.container_name, @message, @timestamp | filter @message like /xxx connection error/ | sort @timestamp desc | limit 50
查询结果会直接展示所有匹配日志对应的log stream、所属命名空间、Pod名、容器名,一目了然。
方案3:优化fluentd配置的log stream命名规则
默认很多fluentd配置的log stream命名没有附带足够的元数据,你可以直接修改fluentd的cloudwatch输出配置,将K8s元数据直接拼入log stream名称,后续只要拿到log stream名称就能直接拆分出容器信息,配置示例如下:
<match kubernetes.**> @type cloudwatch_logs log_group_name /k8s/cluster/prod # 替换为你实际使用的日志组名称 log_stream_name ${record['kubernetes']['namespace_name']}/${record['kubernetes']['pod_name']}/${record['kubernetes']['container_name']} auto_create_stream true # 其余原有配置保持不变即可 </match>
配置更新后新产生的log stream都会按照「命名空间/ Pod名 / 容器名」的规则命名,不需要额外查询就能直接识别对应容器。
内容的提问来源于stack exchange,提问作者laocius
相关产品推荐
相关产品推荐

