Shell 脚本 - 根据 ISO 8601 UTC 格式的“时间戳”属性值对“AWS cloudwatch 指标”json 数组进行排序

use*_*177 2 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"
    }
 ]
Run Code Online (Sandbox Code Playgroud)

}

我正在 shell 脚本中运行 'awscli' 以获取此信息,但数据未按时间顺序返回,时间戳采用 ISO 8601 UTC 格式。我需要根据时间戳对这个数组进行排序,以按时间顺序获取数据。

我的目标: 我有一个ELB更CloudWatch的指标数据RequestCount指标如下喜欢。

{
"Datapoints": [
    {
        "Timestamp": "2016-10-18T12:11:00Z",
        "Sum": 217732.0,
        "Unit": "Count"
    },
    {
        "Timestamp": "2016-10-18T12:15:00Z",
        "Sum": 227120.0,
        "Unit": "Count"
    },
  ]
Run Code Online (Sandbox Code Playgroud)

}

我希望根据时间戳对这些指标进行排序,并在每个时间戳的延迟和请求数量之间建立匹配。此外,我必须计算开始时间和结束时间之间的时间差,这可能无法从此处接收的格式中获得。

我正在使用 shell 脚本,但无法找到解决此问题的方法。任何帮助将非常感激。TIA

Fré*_*nri 6

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,&Timestamp)[*]'
Run Code Online (Sandbox Code Playgroud)

如果想使用 jq 代替,您将使用 jq 的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> \
| jq -r '.Datapoints | sort_by(.Timestamp)[]'
Run Code Online (Sandbox Code Playgroud)

如果你更喜欢 bash ,你可以使用 linux sort 命令

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
Run Code Online (Sandbox Code Playgroud)

日期在第 3 列中,因此您将对此列进行排序 ( -k 3)

  • 令人难以置信的解决方案! (2认同)