用于检查 JSON 键的 CloudWatch 指标过滤器是否存在

CloudWatch Metric Filter for checking JSON key exists

我正在尝试提出一个指标过滤器表达式,在存在特殊 JSON 键属性时过滤 CloudWatch Logs。

用例如下:应用程序执行各种日志记录(以 JSON 格式)并且每当它有一个特殊的 JSON 键(来自第三方的嵌套 JSON 响应部分服务), 我想过滤它。

示例日志:

{"severity":"INFO","msg":"EVENT","event":{"key1":"value1"}}
{"severity":"INFO","msg":"FooService responded","response":{"response_code":800}}

我尝试过但不起作用的过滤模式:

{ $.response }
{ $.response = *}
{ $.response = "*"}
{ $.response EXISTS }
{ $.response IS TRUE }
{ $.response NOT NULL }
{ $.response != NULL }

预期过滤结果:

{"severity":"INFO","msg":"FooService responded","response":{"response_code":800}}

{ $.response EXISTS } 与我的预期相反(returns 第一行而不是第二行)但我不确定如何否定它。

参考material:Filter and pattern syntax @ CloudWatch User Guide

还没找到好的解决办法

不过我至少找到了一个

如果您搜索 != 特定值的键,它似乎会对其进行空检查。

所以如果你说:

{$.response != "something_no_one_should_have_ever_saved_this_response_as"}

然后你会得到所有条目,其中 response 存在于你的 json 中,而不是你的字符串(希望所有有效条目)

绝对不是一个干净的解决方案,但它似乎很实用

对于查找存在字段的记录这一任务,我没有解决方案。实际上,问题中的 linked document 明确指出不受支持。

但是

如果我们简单地反转我们的逻辑,这将成为一个更容易处理的问题。查看您的数据,您想要 All records where there's a response key 但也可以表示为 All records where there isn't an events key.

这意味着您可以用 {$.event NOT EXISTS} 完成任务。当然,您获得的日志消息类型越多,这就变得越复杂(我不得不为我的用例链接三个不同的 NOT EXISTS 查询),但它确实解决了问题。