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

Grafana加载动态Prometheus指标问题:如何将动态生成的app_{endpoint}_{function}_calls_total指标加载为时间序列

解决Grafana加载动态API指标为时间序列的方法

这种把动态参数嵌在指标名里的情况确实挺头疼的,不过我们可以通过拆分指标名为标签的方式让Grafana轻松识别这些动态维度,下面给你两种可行的方案,按需选择:

方案一:在Prometheus里预处理指标(推荐,性能更优)

如果能修改Prometheus的配置,最好先把指标名里的endpoint和function提取成标签,这样后续Grafana查询会更高效。

找到你配置里对应OpenTelemetry的scrape job,添加metric_relabel_configs规则:

scrape_configs:
  - job_name: 'your-otel-job' # 替换成你的job名称
    # 其他原有配置...
    metric_relabel_configs:
      # 从指标名提取endpoint标签
      - source_labels: [__name__]
        regex: 'app_([a-zA-Z0-9_]+)_([a-zA-Z0-9_]+)_calls_total' # 适配你的参数格式,有下划线就加_
        replacement: '$1'
        target_label: endpoint
      # 从指标名提取function标签
      - source_labels: [__name__]
        regex: 'app_([a-zA-Z0-9_]+)_([a-zA-Z0-9_]+)_calls_total'
        replacement: '$2'
        target_label: function
      # 统一指标名为app_calls_total
      - source_labels: [__name__]
        regex: 'app_.*_calls_total'
        replacement: 'app_calls_total'
        target_label: __name__

配置生效后,原来的app_BillingController_getVAT_calls_total会变成指标名app_calls_total + 标签endpoint=BillingController + function=getVAT,这样Grafana就能像处理普通带标签的指标一样操作了。

方案二:直接在Grafana查询中动态提取标签

如果没法改Prometheus配置,就用PromQL的label_replace函数在查询时临时提取标签:

在Grafana面板的查询框里输入:

label_replace(
  label_replace(
    app_*_calls_total,
    "endpoint", "$1", "__name__", "app_([a-zA-Z0-9_]+)_([a-zA-Z0-9_]+)_calls_total"
  ),
  "function", "$2", "__name__", "app_([a-zA-Z0-9_]+)_([a-zA-Z0-9_]+)_calls_total"
)

后续Grafana面板配置

不管用哪种方案,接下来都要调整Grafana的显示设置:

  • Legend格式化:在面板的「Panel options」→「Legend」里,把Format改成{{endpoint}} - {{function}},这样每个时间序列都会清晰显示对应的端点和函数名。
  • 添加动态过滤变量(可选):如果需要让用户筛选特定的endpoint/function,可以在Dashboard的「Settings」→「Variables」里新建Query类型变量:
    • 比如创建endpoint变量,查询语句用label_values(app_calls_total, endpoint)(方案一)或者label_values(label_replace(app_*_calls_total, "endpoint", "$1", "__name__", "app_([a-zA-Z0-9_]+)_.*_calls_total"), endpoint)(方案二)。
    • 之后在查询里可以用app_calls_total{endpoint=~"$endpoint"}来实现动态过滤。

注意事项

  • 正则表达式要匹配你的指标名格式:如果endpoint或function里包含下划线、短横线等特殊字符,记得更新regex里的匹配规则(比如把[a-zA-Z0-9]+改成[a-zA-Z0-9_-]+)。
  • 先确认数据到了Prometheus:在Prometheus的UI里搜索app_*_calls_total,确保能查到对应的指标和数据点,排除数据链路的问题。

内容的提问来源于stack exchange,提问作者ekclone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:53:13