从源码彻底理解 Prometheus/VictoriaMetrics 中的 relabel_configs/metric_relabel_configs 配置

背景
最近接手维护了公司的指标监控系统,之后踩到坑就没站起来过。。

本次问题的起因是我们配置了一些指标的删除策略没有生效:
- action: drop_metrics
regex: "^envoy_.*|^url\_\_\_\_.*|istio_request_bytes_sum"
与这两个容易引起误解的配置relabel_configs/metric_relabel_configs有关。
他们都是对抓取的数据进行重命名、过滤、新增、删除等操作,但应用场景却完全不同。
我们使用了 VictoriaMetrics 替换了 Prometheus,VM 完全兼容 Prometheus ,所以本文也对 Prometheus 同样适用。
理解错误1

但这里其实是有一个错误理解的,我是通过 VM 的服务发现页面的指标响应页面查询指标的,打开之后确实能搜到需要被删除的相关指标。
但其实即便是真的删除了数据这个页面也会有数据存在,删除的数据只是不会写入 VM 的时序数据库中。
这一点是在后续查源码时才发现;后面我配置对了依然在这里查看数据,发现还是没有删除,这个错误理解浪费了不少时间。
理解错误2
为了解决问题,通过 drop metrics 这类关键字在 VM 的官方文档中查询,最终找到一篇文章。
https://www.robustperception.io/dropping-metrics-at-scrape-time-with-prometheus/

按照这里的介绍,将删除的配置加入到 metric_relabel_configs 配置下,经过测试确实有效。
不过为啥将同样的配置:
relabel_configs:
- action: drop_metrics
regex: "^envoy_.*|^url\_\_\_\_.*|istio_request_bytes_sum"
加入到 relabel_configs 未能生效呢?
估计确实容易令人误导,在文档中也找到了相关的解释:
https://www.robustperception.io/relabel_configs-vs-metric_relabel_configs/

这篇文章主要是表达几个重点:
relabel_configs用于配置哪个目标需要被抓取,发生在指标抓取之前。metric_relabel_configs发生在指标抓取之后,写入存储之前。- 如果其中一个没生效,就换一个(这句话很容易让人犯迷糊)
但说实话当时我看到这里还是一脸懵,为了彻底了解两则的区别还是看源码来的直接。
阅读源码理解本质原因
metric_relabel_configs
metric_relabel_configs:
- action: drop_metrics
regex: "^envoy_.*|^url\_\_\_\_.*|istio_request_bytes_sum"
首先看下metric_relabel_configs配置生效的原因。

metric_relabel_configs 配置的整体流程如上图:
- 启动 VM 时加载配置到内存
- 根据配置的抓取间隔时间(
scrape_interval)抓取数据,拿到的每一条数据都需要通过metric_relabel_configs的应用。 - 针对于这里的
drop_metrics来说,就是判断是否需要删除掉所有的Label。 - 如果可以匹配删除,那就不会写入存储。
其中的关键代码如下:

这里还有一个小细节,源码里判断的 action 是 drop,而我们配置的是 drop_metrics,其实 drop_metrics 也是 drop 的一个封装而已。

在解析配置的时候会进行转换。
与这个写法是等价的:
- source_labels: [ __name__ ]
regex: "^envoy_.*|^url\_\_\_\_.*|istio_request_bytes_sum"
action: drop
relabel_configs
然后来看看 relabel_configs 没有按照预期生效的原因。

其实核心的应用配置就是同一份代码,只是触发点不一样。
relabel_configs 是在应用启动的时候根据我们配置的抓取目标的数据当做数据源,所以这里的 action: drop 删除的是抓取目标,而不是真正的抓取数据。

而且它的目的是在应用启动的时候,用于生成抓取目标的任务,只会运行一次。
假设我这里改写为:
relabel_configs:
- source_labels: [ __address__ ]
regex: '192.xx.xx.xx:443'
action: drop

那么我这个抓取任务就会被删除掉,而不是删除这个指标了。
因此之前我在这里配置的是一些业务指标 regex: "^envoy_.*|^url\_\_\_\_.*|istio_request_bytes_sum",在所有元数据里自然是没有任何一个可以匹配了,所以也就无事发生。
元数据都是以
__开头。
其实 VM 也有提供一个 Debug 页面用于调试 relabel_configs,但如果知道怎么用这个调试页面其实也理解了他的运行原理

总结
https://www.robustperception.io/relabelling-can-discard-targets-timeseries-and-alerts/

后面我查到这篇文章也有相关解释,理解了两者的区别后再看这里的分析会更加容易理解。
总的来说:
relabel_configs用于对抓取目标元数据的增删改;如果删除后连后续的抓取任务也会被取消。metric_relabel_configs用于对抓取到的数据增删改,对于不需要的业务指标可以在这里配置。
也就是前文讲到的 relabel_configs 应用于指标抓取前,metric_relabel_configs 应用于指标抓取后。
从源码彻底理解 Prometheus/VictoriaMetrics 中的 relabel_configs/metric_relabel_configs 配置的更多相关文章
- 曹工说Redis源码(4)-- 通过redis server源码来理解 listen 函数中的 backlog 参数
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...
- storm源码之理解Storm中Worker、Executor、Task关系 + 并发度详解
本文导读: 1 Worker.Executor.task详解 2 配置拓扑的并发度 3 拓扑示例 4 动态配置拓扑并发度 Worker.Executor.Task详解: Storm在集群上运行一个To ...
- React-setState源码的理解
首先举一个最简单的例子: this.state={ a:1 } this.setState({ a:2 }) console.log(this.state.a)//1 可以说setState()操作是 ...
- Android多线程之(一)View.post()源码分析——在子线程中更新UI
提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. ...
- 从源码角度理解Java设计模式——装饰者模式
一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...
- 3D语音天气球(源码分享)——在Unity中使用Android语音服务
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...
- Hbase源码分析:Hbase UI中Requests Per Second的具体含义
Hbase源码分析:Hbase UI中Requests Per Second的具体含义 让运维加监控,被问到Requests Per Second(见下图)的具体含义是什么?我一时竟回答不上来,虽然大 ...
- 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法
注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...
- 第74讲:从Spark源码的角度思考Scala中的模式匹配
今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
随机推荐
- ESP8266-01S 烧录AT固件
首先就是下载官网的下载软件和AT固件 这是下载好了的 然后就是硬件电路了 我是想把ESP8266用于Ardiuno板子的,然后网上有说买的USBTOTTL的3v3供电不够,所以我就用的Ardiuno板 ...
- CF1561D Up the Strip
Up the Strip 题意 你现在在 \(n\) 号格子,你需要跳到 \(1\) 号格子,你可以有两种跳法: 你可以做减法,即选择一个数 \(k\in [1,n)\) ,从 \(n\) 跳到 \( ...
- 如何保证RabbitMQ的消息按照顺序执行???
可以采用单线程的消费保证消息的顺序性.对消息进行编号,1,2,3,4--消费时按照编号的顺序去消费消息.这样就可以保证消息 按照一定顺序执行.
- BZOJ1008 [HNOI2008]越狱 (快速幂,组合)
题目大意 求\(m\)种数字组成的长度为\(n\)的序列的种数,序列中至少有一段连续的数字 分析 用可重排列的种数减去,相邻数字互不相同的序列种数 考虑相邻互不相同,第一个元素有\(m\)种可能,后面 ...
- 48. Rotate Image via java
need to use scratch to find the pattern class Solution { public void rotate(int[][] matrix) { int n= ...
- Windows下Redis安装及自启动
Redis下载 Redis 官方网站没有提供 Windows 版的安装包,可以通过 GitHub 来下载 Windows 版 Redis 安装包,下载地址:点击前往. 打开上述的下载地址链接,Redi ...
- 西瓜书6.2 matlab的libsvm使用
因为python的教程没有找到详细的所以就改用matlab了 使用的是matlab r2016a,libsvm3-24,具体的安装配置教程就直接参考谦恭大大的了: https://blog.csdn. ...
- 第10章 带有依赖注入的服务配置(ASP.NET Core in Action, 2nd Edition)
第2部分 构建完整的应用程序 我们在第一部分中讨论了很多内容.您看到了ASP.NET Core应用程序是如何由中间件组成的,我们主要关注RazorPages框架.您了解了如何使用Razor语法构建传统 ...
- 更多Linux实用命令
更多实用命令 进程相关 当程序运行在系统上时,我们称之为进程(process).想监测这些进程,需要熟悉 ps/top 等命令的用法.ps 命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许 ...
- vue下载图片
async works(obj) { await this.axios({ method: 'get', url: `entryFormControll ...