You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为带多标签的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.0
  • sum(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:20:34