CloudWatch InSights:如何以列表形式一次性提取/查询所有 JSON 数组元素

Mic*_*ryl 5 amazon-web-services amazon-cloudwatch

我的公司已开始使用 JSON 日志记录,以便更好地支持 AWS 上的 CloudWatch InSights 查询。查询非常容易使用,除非我们处理数组数据。

例如,如果我们有如下所示的日志条目:

{
  "id": 123,
  "method": "getRelatedPolicies",
  "policiesRetrieved": [
    "333g",
    "444q"
  ]
}
{
  "id": 222,
  "method": "getRelatedPolicies",
  "policiesRetrieved": [
    "123q",
    "234w",
    "345e",
    "456r"
  ]
}
{
  "id": 432,
  "method": "getRelatedPolicies",
  "policiesRetrieved": [
    "345e"
  ]
}
Run Code Online (Sandbox Code Playgroud)

它们在 CloudWatch Insights 中展平,如下所示:

  id                    123,
  method                getRelatedPolicies
  policiesRetrieved.0   333g
  policiesRetrieved.1   444q


  id                    222,
  method                getRelatedPolicies
  policiesRetrieved.0   123q
  policiesRetrieved.1   234w
  policiesRetrieved.2   345e
  policiesRetrieved.3   456r


  id                    432,
  method                getRelatedPolicies
  policiesRetrieved.0   345e
Run Code Online (Sandbox Code Playgroud)

但是我该怎么做才能搜索policiesRetrieved 数组包含该值的任何日志条目呢345e?数组中可能有任意数量的条目,所以我不能只是开始添加像or policiesRetrieved.0 = "345e" or policiesRetrieved.1 = "345e"....

如果我可以将所有值折叠成一个分隔字符串,那么我就可以在字符串中搜索匹配项,此外,如果用户将数据导出为 CSV 或其他非 AWS 格式以进行进一步的操作,我还可以轻松使用该列表分析。

我可以以某种方式将数组值解析为字符串吗?我已经浏览了查询中所有可用的辅助函数,但没有任何一个让我觉得可行。

任何解决方案将不胜感激。

Mic*_*ryl 6

因此,我的特定情况的解决方案非常简单,因为相关数组仅包含字符串。[我只是将and内的数组内容解析]为单个字符串。这适用于字符串、数字或布尔值的数组。如果我想提取一组对象的 ID,那就不太好了。

无论如何,下面是一个解析数组中字符串的示例查询:

fields @timestamp, id, method # you don't need to put the 'policyNumbers' up here - it is added automatically
| parse @message '"policyNumbers":[*]' as policyNumbers
#| filter policyNumbers like '234w' # Uncomment to show only entries that mention a specific policy
Run Code Online (Sandbox Code Playgroud)

这将解析以下行:

{"timestamp":"2020-07-21T12:03:46.970Z","id":222,"method": "getRelatedPolicies","dataAccess":{"policyNumbers":["123q", "234w", "345e", "456r"]}}}
Run Code Online (Sandbox Code Playgroud)

存在id222存在methodgetRelatedPoliciespolicyNumbers具有价值"123q", "234w", "345e", "456r"