如何按指标名称对Prometheus中应用的所有指标分组?
解决方案:按指标名称分组并获取Prometheus应用指标列表
当然可以实现你的需求!针对你遇到的问题,我整理了几个实用的方法:
1. 按指标名称分组查询应用的所有指标
Prometheus中,所有指标的名称都存储在__name__这个内置标签里,你可以通过count by (__name__)来按指标名称分组,同时统计每个指标下的时间序列数量:
count by (__name__) ({app="bar"})
这个查询会返回类似这样的结果:
{__name__="bar_requests_total"} 12 {__name__="bar_memory_usage"} 4 ...
既完成了分组,也能直观看到该应用下的所有指标名称。
2. 直接获取所有可用指标名称列表
如果你只需要指标名称的列表,用label_values()函数更直接:
label_values({app="bar"}, __name__)
执行后会返回一个纯指标名称的数组,比如:
["bar_requests_total", "bar_memory_usage", "bar_db_connection_count", ...]
3. 关于指标名通配符的正确用法
你之前尝试用通配符报错,大概率是语法不对。Prometheus不支持直接在指标名位置写通配符(比如*{app="bar"}),正确的方式是通过__name__标签的正则匹配来实现:
- 匹配所有包含某前缀的指标:
{__name__=~"bar_.+", app="bar"} - 匹配包含特定关键词的指标:
{__name__=~".*request.*", app="bar"}
这里的=~表示正则匹配,.+匹配任意字符(至少一个),.*匹配任意字符(包括零个)。
4. 处理Dropwizard生成的动态指标
Dropwizard生成的动态指标虽然名称看起来不固定,但它们依然会被Prometheus打上__name__标签,所以上面的所有方法都完全适用。这类指标通常还会附带其他业务标签(比如endpoint、status等),你可以在查询时额外过滤,比如:
count by (__name__) ({app="bar", endpoint="/api/v1/users"})
内容的提问来源于stack exchange,提问作者naimdjon




