Сценарий оболочки — сортировка массива json «AWS cloudwatch metrics» на основе значения свойства «Timestamp», которое входит в формат ISO 8601 UTC

#bash #sed #aws-cli #jq

#bash #sed #aws-cli #jq

Вопрос:

У меня есть показатели задержки Amazon cloudwatch ELB, как показано ниже.

 {
"Datapoints": [
    {
        "Timestamp": "2016-10-18T12:11:00Z",
        "Average": 0.25880099632013942,
        "Minimum": 0.00071811676025390625,
        "Maximum": 3.2039437294006352,
        "Unit": "Seconds"
    },
    {
        "Timestamp": "2016-10-18T12:10:00Z",
        "Average": 0.25197337517680762,
        "Minimum": 0.00063610076904296875,
        "Maximum": 2.839790821075439,
        "Unit": "Seconds"
    },
    {
        "Timestamp": "2016-10-18T12:19:00Z",
        "Average": 0.2287127116954388,
        "Minimum": 0.00061678886413574219,
        "Maximum": 1.416410446166992,
        "Unit": "Seconds"
    }
 ]
  

}

для получения этого я запускаю ‘awscli’ внутри сценария оболочки, но данные не возвращаются в хронологическом порядке, а временная метка находится в формате ISO 8601 UTC. Мне нужно отсортировать этот массив на основе метки времени, чтобы получить данные в хронологическом порядке.

Моя цель: у меня есть еще один показатель cloudwatch из ELB-метрик RequestCount, как показано ниже.

 {
"Datapoints": [
    {
        "Timestamp": "2016-10-18T12:11:00Z",
        "Sum": 217732.0,
        "Unit": "Count"
    },
    {
        "Timestamp": "2016-10-18T12:15:00Z",
        "Sum": 227120.0,
        "Unit": "Count"
    },
  ]
  

}

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

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

Ответ №1:

В JMESPATH есть метод sort_by, который можно использовать для этого — вот только пример

 aws cloudwatch get-metric-statistics 
  --metric-name CPUUtilization 
  --start-time 2016-10-01T23:18:00 --end-time 2016-10-19T23:18:00 --period 3600 
  --namespace AWS/EC2 --statistics Maximum 
  --dimensions Name=InstanceId,Value=<YOURINSTANCE> 
  --query 'sort_by(Datapoints,amp;Timestamp)[*]'
  

Если вместо этого вы хотите использовать jq, вы будете использовать sort_by метод jq следующим образом

 aws cloudwatch get-metric-statistics 
  --metric-name CPUUtilization 
  --start-time 2016-10-01T23:18:00 --end-time 2016-10-19T23:18:00 --period 3600 
  --namespace AWS/EC2 --statistics Maximum 
  --dimensions Name=InstanceId,Value=<YOURINSTANCE> 
| jq -r '.Datapoints | sort_by(.Timestamp)[]'
  

Если вы больше любите bash, вы можете использовать команду сортировки Linux

 aws cloudwatch get-metric-statistics 
  --metric-name CPUUtilization 
  --start-time 2016-10-01T23:18:00 --end-time 2016-10-19T23:18:00 --period 3600 
  --namespace AWS/EC2 --statistics Maximum 
  --dimensions Name=InstanceId,Value=<YOURINSTANCE> 
  --output text 
| sort -k 3
  

даты указаны в 3-м столбце, поэтому вы будете сортировать этот столбец ( -k 3 )

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

1. Невероятное решение!!