如何为EKS日志创建带AND条件的CloudWatch指标过滤器?
解决CloudWatch指标过滤器匹配EKS JSON日志的复合条件问题
正确的过滤表达式写法
针对你的需求,需要同时匹配kubernetes.namespace_name等于production,且log字段包含] Failed:,正确的CloudWatch JSON过滤表达式如下:
$.kubernetes.namespace_name == "production" && contains($.log, "] Failed:")
配置步骤
- 打开AWS CloudWatch控制台,找到目标EKS应用的日志组
- 切换到指标过滤器选项卡,点击创建指标过滤器
- 在过滤模式区域,选择JSON类型,将上面的表达式粘贴到输入框
- 点击测试模式,粘贴你的示例日志条目验证是否只匹配符合条件的记录
- 测试通过后,配置指标详情:设置指标命名空间(比如
EKS/ProductionErrors)、指标名称(比如FailedRequestCount),指标值选1(每条匹配日志计数+1) - 完成配置并保存
常见问题排查
- 之前AND逻辑不生效的原因:CloudWatch过滤语法中逻辑与使用
&&而非大写AND,且必须通过$.前缀正确引用JSON字段,否则会把整个日志当作纯字符串处理,导致条件判断失效 - 误捕获staging环境的原因:如果只写
"] Failed:"的字符串匹配,会忽略JSON结构,直接匹配所有包含该字符串的日志,不管所属命名空间 - 字符串匹配注意事项:使用
contains()函数实现“包含”匹配,若直接用==则只会匹配完全等于目标字符串的日志,无法满足需求
示例日志测试
符合条件的日志(会被匹配):
{
"kubernetes": {
"namespace_name": "production",
"pod_name": "payment-service-7f9d6c8b9c-2xqzk"
},
"log": "2024-05-20T14:30:00Z [ORDER_PROCESS] Failed: insufficient funds"
}
不符合条件的日志(不会被匹配):
{
"kubernetes": {
"namespace_name": "staging",
"pod_name": "payment-service-7f9d6c8b9c-5rtds"
},
"log": "2024-05-20T14:31:00Z [ORDER_PROCESS] Failed: invalid request"
}
内容的提问来源于stack exchange,提问作者OpenBSDNinja
相关产品推荐
相关产品推荐

