如何用Prometheus计算月度所有实体集体宕机时长?
用Prometheus计算所有实体全宕机的总时长
不需要自定义exporter,仅用Prometheus内置函数就能实现需求,核心思路是先构造表示“所有实体都宕机”的状态序列,再基于该序列计算累计宕机时长。
实现步骤与表达式
构造全宕机状态序列
使用bool修饰符将求和结果转换为布尔状态:sum(a_metric_name{some_label="some_value"}) bool == 0这个表达式会返回值为
1(所有实体都宕机)或0(至少一个实体正常)的gauge序列,对应每个采集时刻的状态。计算累计宕机时长
基于上述状态序列,结合avg_over_time计算过去30天的总宕机分钟数,逻辑和你提供的示例一致:avg_over_time( (sum(a_metric_name{some_label="some_value"}) bool == 0)[30d:] ) * 30 * 24 * 60avg_over_time(...[30d:]):计算过去30天内全宕机状态的时间占比- 乘以
30*24*60:将占比转换为总分钟数(如果需要秒数,替换为30*24*3600即可)
补充说明
- 若采集间隔(scrape_interval)稳定,这个表达式的精度足够满足需求;若间隔波动较大,
avg_over_time会自动基于时间加权计算占比,结果依然准确。 - 若想直接获取秒级的准确时长,也可以用
sum_over_time结合采集间隔计算:sum_over_time( (sum(a_metric_name{some_label="some_value"}) bool == 0)[30d:] ) * <你的采集间隔秒数>
内容的提问来源于stack exchange,提问作者Koy Gwaewion
相关产品推荐
相关产品推荐

