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

Posted

技术标签:

【中文标题】值数组中每个元素的 PromQL 增量【英文标题】:PromQL delta for each elment in values array 【发布时间】:2021-12-11 11:05:56 【问题描述】:

我正在使用 PromQL 获取最后 5m 分钟的计数器值,但我想获取每个返回值的计数器增量值。我可以使用delta(http_requests[5m]) 进行查询,但它只返回第一个和最后一个元素的增量。有没有办法将所有值恢复为增量值?我查看了普罗米修斯函数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"
            ]

【问题讨论】:

【参考方案1】:

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

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

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

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

不幸的是,由于相同的问题,此查询可能会产生意外结果 - Prometheus 会跳过后视窗口之前的最后一个样本与后视窗口中的第一个样本[2m] 之间的增量。

附:另一种解决方案是尝试 VictoriaMetrics 中的第一个查询。它考虑了上面提到的增量,所以它必须返回预期的结果。在MetricsQL docs 上查看更多详细信息。还可以查看rollup_delta 函数 - 它计算给定后视窗口上连续样本之间的增量,然后从计算的增量中返回 maxminavg 值。

【讨论】:

这就是我要找的东西,谢谢!【参考方案2】:

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

【讨论】:

我尝试使用 delta 函数 delta(http_requests[5m]) 但我只从返回的数组中获取单个值,而不是每个元素的 delta。该系列是每分钟,我正在寻找所有值作为增量。 [5m] 表示增量将在每个元素与其 5m 前任之间。您将收到指标中所有元素的此结果。 好的,谢谢。我希望获得最后 X 时间范围的一系列数据,但获得 delta 值。例如,计数器的最后 5 分钟,但将 5 个值作为增量值。如果我的问题没有传达,我很抱歉。这可能吗?

以上是关于值数组中每个元素的 PromQL 增量的主要内容,如果未能解决你的问题,请参考以下文章

PromQL:查找低于平均水平的向量元素

LeetCode——使数组唯一的最小增量

plist中的增量编号

如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中

什么是希尔排序呢?

LeetCode~945.使数组唯一的最小增量