0

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

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

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

最近 2 分钟内的样本数据

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

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

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

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

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

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

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

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

上午 7:02:00 - 0(上)

谢谢

4

1 回答 1

0

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

max_over_time(up[1m])

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

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 函数来计算它切换了多少次。然后用一点逻辑,它是多少次

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

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

于 2020-02-04T22:32:46.363 回答