Назад | Перейти на главную страницу

CloudWatch InSights: как извлечь / запросить все элементы массива JSON сразу в виде списка

Моя компания начала использовать ведение журнала JSON, чтобы лучше поддерживать запросы CloudWatch InSights на AWS. С запросами довольно легко работать, за исключением случаев, когда мы имеем дело с данными массива.

Например, если у нас есть следующие записи журнала:

{
  "id": 123,
  "method": "getRelatedPolicies",
  "policiesRetrieved": [
    "333g",
    "444q"
  ]
}
{
  "id": 222,
  "method": "getRelatedPolicies",
  "policiesRetrieved": [
    "123q",
    "234w",
    "345e",
    "456r"
  ]
}
{
  "id": 432,
  "method": "getRelatedPolicies",
  "policiesRetrieved": [
    "345e"
  ]
}

В 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

Но что я могу сделать для поиска любой записи журнала, в которой массив policyRetrieved содержит значение 345e? В массиве может быть любое количество записей, поэтому я не могу просто начать добавлять строки фильтра, например or policiesRetrieved.0 = "345e" or policiesRetrieved.1 = "345e"....

Если бы я мог свернуть все значения в строку с разделителями, тогда я мог бы искать совпадение в строке PLUS, я также мог бы легко использовать этот список, если бы пользователь экспортировал данные в CSV или какой-либо другой формат, отличный от AWS, для дальнейшего анализ.

Могу ли я каким-то образом преобразовать значения массива в строку? Я просмотрел все доступные вспомогательные функции, доступные в запросах, и ничего не показалось мне жизнеспособным.

Любые решения будут оценены.

Таким образом, решение для моего конкретного случая было достаточно простым, поскольку рассматриваемый массив содержал только строки. Я просто проанализировал содержимое массива внутри [ и ] как одна строка. Это работает для массива строк, чисел или логических значений. Было бы не так красиво, если бы я хотел извлечь идентификаторы массива объектов.

В любом случае, вот пример запроса, анализирующего строки в массиве:

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

Это проанализирует следующую строку:

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

С участием id будучи 222, method будучи getRelatedPolicies, и policyNumbers имеющий ценность "123q", "234w", "345e", "456r"