在AWS Cloudwatch日志指标过滤器中匹配数组条目

33

我现在有一些 JSON 字符串上传到 AWS Cloudwatch 日志,现在正在尝试编写一个过滤器,从这些日志中生成指标。

假设我有以下类似的 JSON:

{"test_results": [{"result": "success", "name": "foo", "nr_failed": 0}, {"result": "failure", "name": "bar", "nr_failed": 3}]}
AWS CloudWatch 日志指标过滤器可以让我指定以下模式:

The AWS Cloudwatch log metrics filter allows me to specify a pattern like the following:

{ $.test_results[0].result = "failure" }

以上意味着,“如果'test_results'的值的第零个条目的'result'字段的值为'failure',则匹配整行”。在这种特定情况下,第零个条目的'result'字段值为“success”,因此不会匹配。但下一行将匹配:

{ $.test_results[1].result = "failure" }

现在假设我想要匹配整行,如果任何一个条目的值为“failure”,则进行匹配。

{ $.test_results[*].result = "failure" }

但是模式语法似乎不允许在数组索引中使用通配符。 如何匹配任何结果值为“failure”的行?

或者,我如何挑选出“test_results”数组中所有“nr_failed”字段的数字值,并从中创建指标?


4
你有没有找到解决方案? - Tomas
这个问题有已知的解决方案吗? - Gaim
还没有解决方案吗? - Akshay
2个回答

1

实际上,根据官方AWS文档,没有明确的语法来解决您的问题。

数组中的元素遵循从零开始的编号系统,这意味着数组中的第一个元素是元素0,第二个元素是元素1,依此类推。将元素放在方括号("[]")中。

然而,有一个小技巧可能对寻找解决方案的人有所帮助。 您可以使用OR (||)运算符构建查询来检查列表中的每个项:

{$.test_results[0].result = failure || $.test_results[1].result = failure}

此外,即使实际列表长度小于条件参数的数量,它也能正常工作。 因此,我们必须为test_results的长度设置上限,并生成相应的查询。
假设test_results的长度小于10个元素,那么让我们用Bash生成查询:
#!/bin/bash
echo -n "{"; for i in {0..10}; do echo -n "$.test_results[$i].result = failure"; test "$i" -ne "10" && echo -n " || "; done; echo "}"

但是要让你知道:查询的长度应小于或等于1024个字符才能正常工作。

-2
我发现只使用“失败”作为度量过滤器就可以了,虽然不是特别优雅,但可能适合你。

enter image description here


这只是在任何地方寻找failure字符串。 - Paolo
根据提供的信息,它确实如此,但可能已经足够了。 - Baza86
你误解了问题。Op正在寻找任何结果条目中的“failure”值。 - Paolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接