Jmespath计算平均值
Jmespath calculate average value
我想使用 jmespath 从响应中找到平均值。首先我需要检查响应是否为空。如果响应不为空,则计算点的平均值。我正在尝试使用此表达式 "[].points[].value.doubleValue | avg(@)" 但当响应为空时表达式失败。
[
{
"metric": {
"labels": {
"instance_name": "crpsmokes-f4a35bd07"
},
"type": "compute.googleapis.com/instance/cpu/utilization"
},
"resource": {
"type": "gce_instance",
"labels": {
"instance_id": "1507883580111256528",
"project_id": "rightscale.com:resat-prem",
"zone": "asia-east1-a"
}
},
"metricKind": "GAUGE",
"valueType": "DOUBLE",
"points": [
{
"interval": {
"startTime": "2020-08-24T22:44:00Z",
"endTime": "2020-08-24T22:44:00Z"
},
"value": {
"doubleValue": 0.00096042153551181288
}
},
{
"interval": {
"startTime": "2020-08-24T22:43:00Z",
"endTime": "2020-08-24T22:43:00Z"
},
"value": {
"doubleValue": 0.0019398753629962092
}
},
{
"interval": {
"startTime": "2020-08-24T22:42:00Z",
"endTime": "2020-08-24T22:42:00Z"
},
"value": {
"doubleValue": 0.0019628626377153086
}
},
{
"interval": {
"startTime": "2020-08-24T22:41:00Z",
"endTime": "2020-08-24T22:41:00Z"
},
"value": {
"doubleValue": 0.0019210491946092627
}
},
{
"interval": {
"startTime": "2020-08-24T22:40:00Z",
"endTime": "2020-08-24T22:40:00Z"
},
"value": {
"doubleValue": 0.0018963341116292535
}
},
{
"interval": {
"startTime": "2020-08-24T22:39:00Z",
"endTime": "2020-08-24T22:39:00Z"
},
"value": {
"doubleValue": 0.0019406727388149156
}
},
{
"interval": {
"startTime": "2020-08-24T22:38:00Z",
"endTime": "2020-08-24T22:38:00Z"
},
"value": {
"doubleValue": 0.0019643314070845481
}
},
{
"interval": {
"startTime": "2020-08-24T22:37:00Z",
"endTime": "2020-08-24T22:37:00Z"
},
"value": {
"doubleValue": 0.0019477523878447774
}
},
{
"interval": {
"startTime": "2020-08-24T22:36:00Z",
"endTime": "2020-08-24T22:36:00Z"
},
"value": {
"doubleValue": 0.0019031642638339008
}
},
{
"interval": {
"startTime": "2020-08-24T22:35:00Z",
"endTime": "2020-08-24T22:35:00Z"
},
"value": {
"doubleValue": 0.0019058478564064766
}
},
{
"interval": {
"startTime": "2020-08-24T22:34:00Z",
"endTime": "2020-08-24T22:34:00Z"
},
"value": {
"doubleValue": 0.0019202072242573347
}
},
{
"interval": {
"startTime": "2020-08-24T22:33:00Z",
"endTime": "2020-08-24T22:33:00Z"
},
"value": {
"doubleValue": 0.0019225147371779864
}
},
{
"interval": {
"startTime": "2020-08-24T22:32:00Z",
"endTime": "2020-08-24T22:32:00Z"
},
"value": {
"doubleValue": 0.0019468938226940699
}
},
{
"interval": {
"startTime": "2020-08-24T22:31:00Z",
"endTime": "2020-08-24T22:31:00Z"
},
"value": {
"doubleValue": 0.0018969617509197196
}
},
{
"interval": {
"startTime": "2020-08-24T22:30:00Z",
"endTime": "2020-08-24T22:30:00Z"
},
"value": {
"doubleValue": 0.0019062680485175084
}
},
{
"interval": {
"startTime": "2020-08-24T22:29:00Z",
"endTime": "2020-08-24T22:29:00Z"
},
"value": {
"doubleValue": 0.0019370667695042699
}
},
{
"interval": {
"startTime": "2020-08-24T22:28:00Z",
"endTime": "2020-08-24T22:28:00Z"
},
"value": {
"doubleValue": 0.0020045164017271112
}
},
{
"interval": {
"startTime": "2020-08-24T22:27:00Z",
"endTime": "2020-08-24T22:27:00Z"
},
"value": {
"doubleValue": 0.0020103660806600012
}
},
{
"interval": {
"startTime": "2020-08-24T22:26:00Z",
"endTime": "2020-08-24T22:26:00Z"
},
"value": {
"doubleValue": 0.0019040336136034359
}
},
{
"interval": {
"startTime": "2020-08-24T22:25:00Z",
"endTime": "2020-08-24T22:25:00Z"
},
"value": {
"doubleValue": 0.0019056174446023513
}
},
{
"interval": {
"startTime": "2020-08-24T22:24:00Z",
"endTime": "2020-08-24T22:24:00Z"
},
"value": {
"doubleValue": 0.0019463043436514244
}
},
{
"interval": {
"startTime": "2020-08-24T22:23:00Z",
"endTime": "2020-08-24T22:23:00Z"
},
"value": {
"doubleValue": 0.0019467681385854972
}
},
{
"interval": {
"startTime": "2020-08-24T22:22:00Z",
"endTime": "2020-08-24T22:22:00Z"
},
"value": {
"doubleValue": 0.0019057447090541284
}
},
{
"interval": {
"startTime": "2020-08-24T22:21:00Z",
"endTime": "2020-08-24T22:21:00Z"
},
"value": {
"doubleValue": 0.0018988823662930087
}
}]
}
]
如果 avg
函数接收到任何不是由一个或多个数字组成的列表且仅由数字组成的列表,则会生成错误。您可能需要处理三种特殊情况:
- 列表为空。例如。没有指标或指标中没有分数。
- 列表包含 non-numbers。例如。一个点的
value
或 value.doubleValue
中有 null
个值。
- 没有列表。例如。整个回复是
null
.
为简单起见,我假设情况 1 是其中唯一被认为是正常的情况,但如果需要,您也可以扩展此方法以涵盖其他情况。
这是一个查询,当列表中没有任何项目时,它应该会导致 null
而不是错误:
[].points[].value.doubleValue | (@ != `[]`) && avg(@) || `null`
一般来说,我们可以使用表达式A && B || C
表示“如果A
为真,则使用B
的值,否则使用[=20=的值” ]",只要当 A
是 truth-like 值时 B
不会是 false value。 (请注意,与某些其他语言不同,在 JMESPath 中,零不被视为假值。)在我们的表达式中,当列表有值时 @ != `[]`
为真,当列表为空时为假。因此,当它为真时 &&
的右侧将被评估以计算平均值,而当它为假时 &&
将 short-circuit 并且只是 false
而不尝试计算平均值。最后 || `null`
将保留平均计算的值,但将 false
替换为 null
.
我想使用 jmespath 从响应中找到平均值。首先我需要检查响应是否为空。如果响应不为空,则计算点的平均值。我正在尝试使用此表达式 "[].points[].value.doubleValue | avg(@)" 但当响应为空时表达式失败。
[
{
"metric": {
"labels": {
"instance_name": "crpsmokes-f4a35bd07"
},
"type": "compute.googleapis.com/instance/cpu/utilization"
},
"resource": {
"type": "gce_instance",
"labels": {
"instance_id": "1507883580111256528",
"project_id": "rightscale.com:resat-prem",
"zone": "asia-east1-a"
}
},
"metricKind": "GAUGE",
"valueType": "DOUBLE",
"points": [
{
"interval": {
"startTime": "2020-08-24T22:44:00Z",
"endTime": "2020-08-24T22:44:00Z"
},
"value": {
"doubleValue": 0.00096042153551181288
}
},
{
"interval": {
"startTime": "2020-08-24T22:43:00Z",
"endTime": "2020-08-24T22:43:00Z"
},
"value": {
"doubleValue": 0.0019398753629962092
}
},
{
"interval": {
"startTime": "2020-08-24T22:42:00Z",
"endTime": "2020-08-24T22:42:00Z"
},
"value": {
"doubleValue": 0.0019628626377153086
}
},
{
"interval": {
"startTime": "2020-08-24T22:41:00Z",
"endTime": "2020-08-24T22:41:00Z"
},
"value": {
"doubleValue": 0.0019210491946092627
}
},
{
"interval": {
"startTime": "2020-08-24T22:40:00Z",
"endTime": "2020-08-24T22:40:00Z"
},
"value": {
"doubleValue": 0.0018963341116292535
}
},
{
"interval": {
"startTime": "2020-08-24T22:39:00Z",
"endTime": "2020-08-24T22:39:00Z"
},
"value": {
"doubleValue": 0.0019406727388149156
}
},
{
"interval": {
"startTime": "2020-08-24T22:38:00Z",
"endTime": "2020-08-24T22:38:00Z"
},
"value": {
"doubleValue": 0.0019643314070845481
}
},
{
"interval": {
"startTime": "2020-08-24T22:37:00Z",
"endTime": "2020-08-24T22:37:00Z"
},
"value": {
"doubleValue": 0.0019477523878447774
}
},
{
"interval": {
"startTime": "2020-08-24T22:36:00Z",
"endTime": "2020-08-24T22:36:00Z"
},
"value": {
"doubleValue": 0.0019031642638339008
}
},
{
"interval": {
"startTime": "2020-08-24T22:35:00Z",
"endTime": "2020-08-24T22:35:00Z"
},
"value": {
"doubleValue": 0.0019058478564064766
}
},
{
"interval": {
"startTime": "2020-08-24T22:34:00Z",
"endTime": "2020-08-24T22:34:00Z"
},
"value": {
"doubleValue": 0.0019202072242573347
}
},
{
"interval": {
"startTime": "2020-08-24T22:33:00Z",
"endTime": "2020-08-24T22:33:00Z"
},
"value": {
"doubleValue": 0.0019225147371779864
}
},
{
"interval": {
"startTime": "2020-08-24T22:32:00Z",
"endTime": "2020-08-24T22:32:00Z"
},
"value": {
"doubleValue": 0.0019468938226940699
}
},
{
"interval": {
"startTime": "2020-08-24T22:31:00Z",
"endTime": "2020-08-24T22:31:00Z"
},
"value": {
"doubleValue": 0.0018969617509197196
}
},
{
"interval": {
"startTime": "2020-08-24T22:30:00Z",
"endTime": "2020-08-24T22:30:00Z"
},
"value": {
"doubleValue": 0.0019062680485175084
}
},
{
"interval": {
"startTime": "2020-08-24T22:29:00Z",
"endTime": "2020-08-24T22:29:00Z"
},
"value": {
"doubleValue": 0.0019370667695042699
}
},
{
"interval": {
"startTime": "2020-08-24T22:28:00Z",
"endTime": "2020-08-24T22:28:00Z"
},
"value": {
"doubleValue": 0.0020045164017271112
}
},
{
"interval": {
"startTime": "2020-08-24T22:27:00Z",
"endTime": "2020-08-24T22:27:00Z"
},
"value": {
"doubleValue": 0.0020103660806600012
}
},
{
"interval": {
"startTime": "2020-08-24T22:26:00Z",
"endTime": "2020-08-24T22:26:00Z"
},
"value": {
"doubleValue": 0.0019040336136034359
}
},
{
"interval": {
"startTime": "2020-08-24T22:25:00Z",
"endTime": "2020-08-24T22:25:00Z"
},
"value": {
"doubleValue": 0.0019056174446023513
}
},
{
"interval": {
"startTime": "2020-08-24T22:24:00Z",
"endTime": "2020-08-24T22:24:00Z"
},
"value": {
"doubleValue": 0.0019463043436514244
}
},
{
"interval": {
"startTime": "2020-08-24T22:23:00Z",
"endTime": "2020-08-24T22:23:00Z"
},
"value": {
"doubleValue": 0.0019467681385854972
}
},
{
"interval": {
"startTime": "2020-08-24T22:22:00Z",
"endTime": "2020-08-24T22:22:00Z"
},
"value": {
"doubleValue": 0.0019057447090541284
}
},
{
"interval": {
"startTime": "2020-08-24T22:21:00Z",
"endTime": "2020-08-24T22:21:00Z"
},
"value": {
"doubleValue": 0.0018988823662930087
}
}]
}
]
如果 avg
函数接收到任何不是由一个或多个数字组成的列表且仅由数字组成的列表,则会生成错误。您可能需要处理三种特殊情况:
- 列表为空。例如。没有指标或指标中没有分数。
- 列表包含 non-numbers。例如。一个点的
value
或value.doubleValue
中有null
个值。 - 没有列表。例如。整个回复是
null
.
为简单起见,我假设情况 1 是其中唯一被认为是正常的情况,但如果需要,您也可以扩展此方法以涵盖其他情况。
这是一个查询,当列表中没有任何项目时,它应该会导致 null
而不是错误:
[].points[].value.doubleValue | (@ != `[]`) && avg(@) || `null`
一般来说,我们可以使用表达式A && B || C
表示“如果A
为真,则使用B
的值,否则使用[=20=的值” ]",只要当 A
是 truth-like 值时 B
不会是 false value。 (请注意,与某些其他语言不同,在 JMESPath 中,零不被视为假值。)在我们的表达式中,当列表有值时 @ != `[]`
为真,当列表为空时为假。因此,当它为真时 &&
的右侧将被评估以计算平均值,而当它为假时 &&
将 short-circuit 并且只是 false
而不尝试计算平均值。最后 || `null`
将保留平均计算的值,但将 false
替换为 null
.