值数组中每个元素的 PromQL 增量

PromQL delta for each elment in values array

我正在使用 PromQL 获取过去 5 百万分钟的计数器值,但我想获取每个返回值的计数器增量值。我可以使用 delta(http_requests[5m]) 进行查询,但它仅 returns 第一个和最后一个元素的增量。有没有办法将所有值作为增量值取回?我查看了普罗米修斯函数 here 但找不到执行此操作的方法。

http_requests[5m]

{
    "data": {
        "result": [
            {
                "metric": {
                    "__name__": "http_requests",
                    "app": "cloud_engine",
                    "app_instance": "instance_01",
                },
                "values": [
                    [
                        "2021-10-26T02:33:07Z",
                        "36446"
                    ],
                    [
                        "2021-10-26T02:34:07Z",
                        "36447"
                    ],
                    [
                        "2021-10-26T02:35:07Z",
                        "36448"
                    ],
                    [
                        "2021-10-26T02:36:07Z",
                        "36450"
                    ],
                    [
                        "2021-10-26T02:37:07Z",
                        "36450"
                    ]
                ]
            }
        ],
        "resultType": "matrix"
    },
    "status": "success"
}

显示每个值的增量的期望结果:

        "values": [
            [
                "2021-10-26T02:33:07Z",
                "0"
            ],
            [
                "2021-10-26T02:34:07Z",
                "1"
            ],
            [
                "2021-10-26T02:35:07Z",
                "1"
            ],
            [
                "2021-10-26T02:36:07Z",
                "2"
            ],
            [
                "2021-10-26T02:37:07Z",
                "0"
            ]

使用“delta(http_requests[1m])”,您将根据需要获得每个元素与其前身之间的增量。

如果您知道样本之间的间隔(例如上例中的一分钟),则可以使用以下 subquery

delta(http_requests[1m])[5m:1m]

此即时查询应该 return 1 分钟间隔的最后 5 个增量。不幸的是,Prometheus 很可能会 return 清空结果,因为它需要至少两个方括号 window 后方样本进行 delta 计算,例如它没有考虑回顾 window 之前的最后一个点和回顾 window 中的第一个点之间的差异。所以查询必须重写为:

delta(http_requests[2m])[5m:1m]

不幸的是,由于同样的问题,此查询可能会产生意外结果 - Prometheus 跳过回顾前的最后一个样本 window 和回顾中的第一个样本 window [2m].

P.S。另一种解决方案是尝试 VictoriaMetrics 中的第一个查询。它考虑了上面提到的增量,因此它必须 return 预期结果。在 MetricsQL docs. Take a look also at rollup_delta 函数中查看更多详细信息 - 它计算给定 lookbehind window 的连续样本之间的增量,然后是 returns maxminavg 来自计算增量的值。