如何使用Prometheus Counter指标测量周期性事件并实现异常告警?
问题解答
1. 使用Counter指标是否合适?
完全合适。Counter是Prometheus中专门用于单调递增数值的指标类型,完美匹配消息处理成功/失败次数的统计场景:
- 每个Kubernetes Pod实例会独立累计自身处理的消息数,Counter天然支持多实例部署,后续通过
sum()聚合所有Pod的指标就能得到全局总处理量。 - Counter会自动适配实例重启后的数值重置(PromQL的
increase/rate函数能识别重置逻辑并正确计算增量),不会导致统计数据失真。
2. sum_over_time(mycount[1hr])能否满足需求?
不能直接使用这个函数,它的逻辑不符合Counter的特性:
sum_over_time是将1小时内采集到的所有Counter样本值直接相加,但Counter是累计值(比如11点时为20,11:30时为40,12点时为60),相加后得到的是无业务意义的累计值总和,并非你需要的每小时处理增量。
正确的PromQL写法
要获取每小时成功/失败的消息总数,应该使用:
sum(increase(mycount{job="你的后台服务标识"}[1h]))
increase(mycount[1h]):计算单个Pod在1小时内的Counter增量(即该Pod处理的消息数)。sum(...):聚合所有Pod的增量,得到全局每小时总处理量,正好匹配你示例中的20、20、1、20这类数据。
若要计算每秒处理速率(可转换为每小时总量),也可以用rate函数,结果与increase写法完全一致:
sum(rate(mycount{job="你的后台服务标识"}[1h])) * 3600
3. 波动告警与Grafana图表实现
波动告警配置
针对13-14点这类异常低峰场景,可通过对比当前小时处理量与历史平均值设置告警规则,示例PromQL:
sum(increase(mycount[1h])) < avg_over_time(sum(increase(mycount[1h]))[6h:1h]) * 0.2
- 逻辑:如果当前小时处理量低于过去6小时每小时平均处理量的20%,触发告警(阈值可根据业务实际调整)。
Grafana图表实现
- 小时级波动图表:
指标使用sum(increase(mycount[1h])),时间范围选择「最近24小时」,步长设置为「1小时」,即可展示每小时的处理量波动曲线。 - 日级每小时平均处理量图表:
指标使用avg_over_time(sum(increase(mycount[1h]))[1d:1h]),逻辑是统计过去1天内,每个小时区间的处理量平均值(比如每天11点的平均处理量、12点的平均处理量),完全符合你要的「日级每小时平均」需求。
内容的提问来源于stack exchange,提问作者Mohanraja
相关产品推荐
相关产品推荐

