1

使用 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
        }
      }]
  }
  ]

4

1 回答 1

1

avg如果该函数接收到任何不是由一个或多个数字组成的列表且仅由数字组成的列表,则该函数将生成错误。您可能需要处理三种特殊情况:

  1. 该列表为空。例如,没有指标或指标中没有点。
  2. 该列表包含非数字。例如,在某个点中或某个点上有null值。valuevalue.doubleValue
  3. 没有清单。例如,整个响应是null

为简单起见,我将假设案例 1 是其中唯一一个被认为是正常的,但如果需要,您也可以扩展此方法以涵盖其他案例。

null这是一个查询,当列表中没有项目时应该导致而不是错误:

[].points[].value.doubleValue | (@ != `[]`) && avg(@) || `null`

一般来说,我们可以用表达式A && B || C来表示“如果A为真,则使用 的值B,否则使用”的值C,只要是类真值时B不会是A值。(请注意,与其他一些语言不同,在 JMESPath 中,零不被视为假值。)在我们的表达式中,@ != `[]`当列表有值时为真,当列表为空时为假。&&因此,当它为真时,将评估右侧以计算平均值,而当它为假时,&&将短路并且根本false不尝试计算平均值。最后|| `null`将保留平均计算的值,但替换falsenull

于 2020-09-01T10:47:47.167 回答