关于Prometheus按值丢弃零值指标的配置方法咨询
关于Prometheus按值丢弃零值指标的配置方法咨询
背景
- 我最近刚开始使用Istio + Envoy
- Envoy会生成一堆指标,其中不少错误类指标99.999%的时间数值都是0(比如带
error关键字的指标)- 注:我个人觉得这种指标设计不太合理,用标签或者统一的错误计数器引导用户去查日志会更好,但这是Envoy的内置逻辑,我们没法修改源码,所以“直接改源头指标”这种建议就不用提啦
我的问题
- 为了降低时序数据的基数,我想把这些指标转成稀疏时序——也就是只保留数值非零的指标
- 有没有办法配置Prometheus,在采集或者存储阶段丢弃所有零值的指标?
嗨,我来帮你梳理下可行的方案~
Prometheus本身没法在采集阶段直接基于指标值过滤,但可以通过metric_relabel_configs实现这个需求,这是最直接的原生解决方案。
具体配置方法
你可以在Prometheus的scrape_configs里,针对Envoy的抓取任务添加metric重标记规则,精准过滤掉零值的错误指标:
scrape_configs: - job_name: 'envoy' # 这里是你原本的Envoy抓取配置,比如targets、metrics_path等 targets: ['your-envoy-target:9090'] metrics_path: '/stats/prometheus' # 添加以下metric重标记规则 metric_relabel_configs: # 第一步:先筛选出你要处理的Envoy错误指标(比如带error关键字的) - source_labels: [__name__] regex: 'envoy_.*error.*' action: keep # 第二步:丢弃数值为0的指标 - source_labels: [__value__] regex: '^0$' action: drop
配置说明
__name__是Prometheus内置的标签,代表指标名称,用regex匹配你要处理的错误指标前缀/关键字,action: keep表示只保留符合这个规则的指标__value__是内置标签,代表指标的当前数值,用regex: '^0$'匹配精确为0的值,action: drop表示丢弃这些零值指标
额外提醒
- 当指标从非零变回0后,Prometheus会停止继续采集该指标,直到它再次变为非零,这样就实现了你想要的稀疏时序,有效降低基数
- 如果你的Prometheus对接了远程存储(比如Thanos、Mimir),部分远程存储也支持在写入阶段配置过滤零值,但原生Prometheus用metric重标记是最省心的方案
备注:内容来源于stack exchange,提问作者Derek Brown
相关产品推荐
相关产品推荐

