如何为带多标签的Histogram指标配置Prometheus执行时间告警?
基于Prometheus Histogram配置方法耗时超限告警
问题场景
已通过Java代码实现Histogram指标,用于监控控制器方法的执行耗时:
static final Histogram duration = Histogram.build() .name("controller_method_duration") .help("Execution time of methods") .labelNames("controller", "method") .exponentialBuckets(0.005, 4, 8) .register(); // 方法执行前启动计时 Timer timer = duration.labels("c1","m2").startTimer(); // 方法执行完成后记录耗时 timer.observeDuration();
需要配置Prometheus告警,检测方法执行时间是否超过300毫秒,请问告警规则如何定义?能否明确看到哪些方法触发了超限?
告警规则定义
在Prometheus的告警规则配置文件(如alerting_rules.yml)中添加以下规则即可实现需求:
groups: - name: controller_method_performance_alerts rules: - alert: MethodExecutionTimeExceeded expr: histogram_quantile(0.99, sum(rate(controller_method_duration_bucket[5m])) by (le, controller, method)) > 0.3 for: 1m labels: severity: warning annotations: summary: "方法执行耗时超出阈值" description: "控制器【{{ $labels.controller }}】的【{{ $labels.method }}】方法执行耗时超过300ms,当前99分位耗时:{{ $value | humanizeDuration }}"
关键参数说明
histogram_quantile(0.99, ...):计算99分位的耗时,用于过滤偶发的极端峰值;若需监控最大值,可将0.99改为1.0sum(rate(controller_method_duration_bucket[5m])) by (le, controller, method):按控制器、方法和桶标签,聚合最近5分钟的指标速率,作为分位数计算的基础数据> 0.3:对应300毫秒(指标单位为秒,0.3秒=300ms)for: 1m:要求条件持续满足1分钟才触发告警,减少误报概率{{ $value | humanizeDuration }}:Prometheus内置函数,将秒数格式化为更易读的时长(如0.3s自动显示为300ms)
查看超限方法详情
告警触发后,可通过多种方式获取具体的超限方法信息:
- Prometheus UI告警页面:点击触发的
MethodExecutionTimeExceeded告警,在Labels区域直接查看controller和method标签值,明确是哪个方法超限 - Alertmanager通知:如果配置了Alertmanager,告警通知(邮件、即时通讯工具等)会包含
annotations中定义的描述内容,直接显示对应的控制器、方法及耗时 - PromQL查询验证:执行
histogram_quantile(0.99, sum(rate(controller_method_duration_bucket[5m])) by (le, controller, method)) > 0.3,查询结果会列出所有满足条件的controller、method标签及对应耗时
内容的提问来源于stack exchange,提问作者M-Razavi
相关产品推荐
相关产品推荐

