Как извлечь данные из массива в сообщении JSON с помощью CloudWatch Logs Insights?

#amazon-cloudwatch #aws-cloudwatch-log-insights

Вопрос:

Я регистрирую сообщения, которые являются объектами JSON. В JSON есть массив, содержащий пары ключ/значение:

 {
   ...
   "arr": [{"key": "foo", "value": "bar"}, ...],
   ...
}
 

Теперь я хочу отфильтровать результаты, содержащие определенный ключ, и извлечь значения для определенного ключа в массиве.

Я пробовал использовать регулярное выражение, что-то вроде parse @message /.*"key":"my_specific_key","value":(?<value>.*}).*/ того, что извлекает значение, но также возвращает остальную часть сообщения. Кроме того, он не фильтрует результаты.

Как я могу фильтровать результаты и извлекать значения для определенного ключа?

Ответ №1:

Если в вашей записи журнала в группе журналов cloudwatch они на самом деле отображаются как json, вы можете просто указать ключ непосредственно в любом месте поля.

(не нужно @, cloudwatch автоматически добавляет его ко всем значениям по умолчанию)

Если вы используете python, вы также можете использовать aws_lambda_powertools для этого очень простым способом (и это настоящий продукт aws).

Если они отображаются в вашем журнале в виде строки, то это может быть экранированная строка, и вам придется точно сопоставить ее, включая пробелы и все остальное. когда вы проанализируете, вам захочется сделать что-то вроде этого:

если это строка вашего сообщения журнала ‘{«aKey» : «AValue», «Ключ2» : «Значение 2»}

 parse @message "{"*" : "*","*" : "*"} akey, akey_value, key2, key2_value
 

затем вы можете фильтровать, подсчитывать или что-то еще в отношении этих переменных. синтаксический анализ-это, в частности, инструкция, которая соответствует шаблону и присваивает подстановочный знак переменной по одному за раз в порядке

хотя со сложным json, если ваше приведенное выше регулярное выражение работает, все, что вам нужно, — это оператор фильтра

 field @message
 | pares @message ... your regex as value_var
 | filer value_var /some more regex/
 
 

если это не строка в записи журнала, а фактический json, вы можете просто сослаться на ключ:

 filter a_key ~="some value" (or regex here)
 

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html

для получения дополнительной информации