Доступ к значениям в массиве JSON

#amazon-cloudwatch #amazon-cloudwatchlogs

#amazon-cloudwatch #amazon-cloudwatchlog

Вопрос:

Я следую инструкциям в документации о том, как получить доступ к значениям JSON в CloudWatch Insights, где рекомендация заключается в следующем

 JSON arrays are flattened into a list of field names and values. For example, to specify the value of instanceId for the first item in requestParameters.instancesSet, use requestParameters.instancesSet.items.0.instanceId.
  

ссылка
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html

Я пытаюсь выполнить следующее и ничего не получаю взамен. Intellisense автоматически заполняет до processList.0 , но не более

 fields processList.0.vss
| sort @timestamp desc
| limit 1
  

JSON, с которым я работаю, является

 "processList": [
        {
            "vss": xxxxx,
            "name": "aurora",
            "tgid": xxxx,
            "vmlimit": "unlimited",
            "parentID": 1,
            "memoryUsedPc": 16.01,
            "cpuUsedPc": 0.01,
            "id": xxxxx,
            "rss": xxxxx
        },
        {
            "vss": xxxx,
            "name": "aurora",
            "tgid": xxxxxx,
            "vmlimit": "unlimited",
            "parentID": 1,
            "memoryUsedPc": 16.01,
            "cpuUsedPc": 0.06,
            "id": xxxxx,
            "rss": xxxxx
        }]
  

Ответ №1:

Вы пробовали следующее?

 fields @@timestamp, @processList.0.vss
| sort @@timestamp desc
| limit 5
  

Возможно, это синтаксическая ошибка. Если нет, пожалуйста, опубликуйте пару записей, составляющих общую структуру, с включением @timestamp.

Комментарии:

1. Для отображения этого значения вам, возможно, придется добавить это: | display 0.vss

Ответ №2:

В опубликованной вами справочной ссылке также указано следующее.

CloudWatch Logs Insights может извлекать максимум 100 полей событий журнала из журнала JSON. Для дополнительных полей, которые не извлекаются, вы можете использовать команду parse для анализа этих полей из необработанного события журнала unparsed в поле сообщения.

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

Для очень больших сообщений JSON Insights intellisense может не разбивать все поля на именованные поля. Итак, решение состоит в том, чтобы использовать parse для полной строки JSON в поле, где, как вы ожидаете, должно присутствовать ваше поле данных. В вашем примере и моем это processList.

Я смог извлечь значение конкретного cpuUsedPc из списка процессов, используя запрос, подобный следующему.

 fields @timestamp, cpuUtilization.total, processList
| parse processList /"name":"RDS processes","tgid":.*?,"parentID":.*?,"memoryUsedPc":.*?,"cpuUsedPc":(?<RDSProcessesCPUUsedPc>.*?),/
| sort @timestamp asc
| display @timestamp, cpuUtilization.total, RDSProcessesCPUUsedPc