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
相关产品推荐
相关产品推荐

