如何通过Prometheus获取特定时间段内服务的总停机时长?
计算特定时间段内服务总停机时长的正确方法
你的思路方向是对的,但需要调整查询逻辑来纳入时间维度,而且count_over_time完全可以和by子句搭配使用,可能是之前的用法有误。下面提供两种可靠的实现方案:
方案一:通过平均不可用率计算总停机时长
这种方法更精准,尤其适用于采样间隔不固定的场景:
- 先计算时间段内的平均可用性(
up=1的时间占比):
这里的avg_over_time(up{namespace="my-namespace"}[1d]) by (service)[1d]替换成你需要的时间段,比如[4h]、[7d]。 - 用总时间段长度乘以(1 - 平均可用性),得到总停机时长:
注意:(1 - avg_over_time(up{namespace="my-namespace"}[1d]) by (service)) * 8640086400是1天的秒数,要和时间段对应——比如4h对应14400,7d对应604800。
方案二:直接统计停机样本对应的时长
如果你确认采样间隔固定(比如15秒),可以直接统计停机状态的样本数,再乘以采样间隔:
sum_over_time((1 - up{namespace="my-namespace"})[1d]) by (service) * 15
(1 - up)会把up=0(停机)转换为1,up=1(正常)转换为0sum_over_time统计时间段内所有停机状态的样本数- 最后乘以采样间隔(这里是15秒)得到总停机时长(单位:秒)
纠正你之前的误解
count_over_time和by子句是兼容的,比如统计每个服务在时间段内的总样本数:
count_over_time(up{namespace="my-namespace"}[1d]) by (service)
这个结果可以用来验证样本总量,和方案二中的停机样本数做对比。
内容的提问来源于stack exchange,提问作者peni4142
相关产品推荐
相关产品推荐

