如何统计Prometheus唯一指标总数及监控Histogram时间序列数量
问题1:如何获知Prometheus中唯一指标的总数?
要统计Prometheus里所有唯一指标名称的数量,你可以直接用这个PromQL查询:
count(count by (__name__) ({__name__=~".+"}))
拆解一下这个查询的逻辑:
{__name__=~".+"}匹配所有存在的时间序列(__name__是Prometheus为每个指标自动添加的内置标签,专门存储指标名称)count by (__name__)按指标名称对序列分组,这里我们其实只需要分组后的唯一指标名称,分组后的计数值并不重要- 外层的
count会统计这些分组后的唯一指标名称的总数,也就是你要的唯一指标总数
如果想排除Prometheus自身的内置指标(比如以__开头的系统标签对应的指标),可以把查询调整为:
count(count by (__name__) ({__name__=~"[^_].+"}))
问题2:监控Histogram指标的动态时间序列数量
针对你提到的http_api_end_point_latency_seconds这个Histogram指标,我分两种常见场景给你解决方案:
场景1:统计该指标所有存在的时间序列总数(包含自动生成的le标签)
Histogram类型的指标会为每个le分桶生成单独的时间序列,如果你要统计当前所有这些序列的总数量,直接用:
count(http_api_end_point_latency_seconds)
这个查询会返回当前时刻该指标下所有时间序列的总数,涵盖不同uri、status、authStatus和le组合的所有情况。
场景2:统计业务维度的唯一序列数(排除自动生成的le标签)
如果你更关注业务层面的标签组合(uri、status、authStatus)数量,不想被le分桶的自动标签干扰,可以用两种方式实现:
- 方式一:用
without关键字忽略le标签count without (le) (http_api_end_point_latency_seconds) - 方式二:用
by关键字明确指定要保留的业务标签count by (uri, status, authStatus) (http_api_end_point_latency_seconds)
如果要把这些业务标签组合的数量汇总成一个总数,就在外层再套一个count:
count(count by (uri, status, authStatus) (http_api_end_point_latency_seconds))
这样就能得到当前时刻不同业务标签组合的唯一序列数量,完全不受le分桶的影响。
内容的提问来源于stack exchange,提问作者sb2k18
相关产品推荐
相关产品推荐

