Моя компания начала использовать ведение журнала 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"