Grafana Prometheus 计算不成功的 probe_success 响应的总停机时间,但不包括一分钟的停机时间

Posted

技术标签:

【中文标题】Grafana Prometheus 计算不成功的 probe_success 响应的总停机时间,但不包括一分钟的停机时间【英文标题】:Grafana Prometheus to calculate total downtime on unsuccessful probe_success response, but excluding a one minute downtime 【发布时间】:2020-05-18 19:20:48 【问题描述】:

我有一个查询说 (1-probe_successinstance="https://www.google.com") - 我基本上是在尝试获取实例关闭的总次数。目前,当我将其设置为在 Grafana 上显示“总”值的“Singlestat”时,它运行良好。

但是,如果我想排除少于一分钟的停机时间怎么办? Prometheus 是否允许子查询/条件来实现这一点?

我的 Prometheus 当前设置为每 15 秒抓取一次数据。理想情况下,我希望在以下场景中看到我的总价值为 5

最近 2 分钟内的样本数据

7:00:00AM - 1(下)

上午 7:00:15 - 1(下)

上午 7:00:30 - 1(下)

上午 7:00:45 - 1(下)

7:01:00AM - 1(下)

上午 7:01:15 - 0(向上)

上午 7:01:30 - 1(下)

上午 7:01:45 - 0(向上)

7:02:00AM - 0(向上)

谢谢

【问题讨论】:

【参考方案1】:

停机时间超过一分钟的表达方式是:

max_over_time(up[1m])

它将显示服务中断超过 1 分钟的次数。例如,对于间隔为 15 秒的输入序列(0 表示向下),仅当 0 持续 1 分钟(连续 4 个零)时,输出序列才会为 0

input : '1 1 1 1 0 1 0 0 1 0 0 0 0 0 0'
output: '1 1 1 1 1 1 1 1 1 1 1 1 0 0 0'

如果您想计算系统宕机的次数(即从 1 切换到 0 的次数),您可以使用changes function 来计算它切换的次数。然后用一点逻辑,它是多少次了

floor(changes(max_over_time(up[1m])[1d:])/2) + (up == bool 0)

如果你想计算在停机状态所花费的时间,这变得更加复杂,因为你必须检测从 1 到 0 的切换,计数 1 分钟以及随后的停机状态,直到第一次从 0 切换回 1。

可能是这样的:

(max_over_time(up[60s]) == bool 0) * ((up offset 61s == bool 1) * count(up[60s]) OR vector(1))

当切换超过 1 分钟然后 1 时会给出前面 0 的个数

input : '1 1 1 1 0 1 0 0 1 0 0 0 0 0 0'
output: '0 0 0 0 0 0 0 0 0 0 0 0 4 1 1'

最后,计算窗口中这个值的平均值,然后乘以窗口中的秒数:

 # downtime for more than 1min other the previous day
 average((...)[1d:]) * 86400

注意:我没有测试表达式,它们可能需要一些修补

【讨论】:

以上是关于Grafana Prometheus 计算不成功的 probe_success 响应的总停机时间,但不包括一分钟的停机时间的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Prometheus/Grafana 中不指定标签的情况下通过唯一标签计算指标数量?

计算多个 prometheus 指标的百分比并在 Grafana 中显示

如何使用 grafana singlestat 和 prometheus 计算正常运行时间百分比

prometheus(或grafana)查询来评估grafana loki使用的存储?

prometheus-operator结合grafana展示k8s监控

如何在 Prometheus Grafana 中计算正常运行时间百分比或停机时间百分比