1、前言
在配置redis、mongdb等exporter监控时,经常会见到relabel_configs的配置.到底是什么意思呢?
我们为什么要配置这些呢? 不配置这一段配置会有什么问题呢?
那下面我们就以redis配置来讲解下, 或许能解释你的所有疑惑.
2、以redis配置prometheus为例
先来看一下配置文件是如何写的, 最让人不明觉厉的就是relabel_configs这一段了吧
# vim /etc/prometheus/prometheus.yml
...
scrape_configs:
## 抓取exporter本身的数据
- job_name: 'redis_exporter'
static_configs:
- targets:
- redis_exporter:9121
# - redis_exporter2:9121 #配置多个exporter
# 多个exporter时,需要配置多个不同的job
- job_name: 'redis_exporter_targets'
static_configs:
- targets:
- redis://redis6379:6379
- redis://redis6380:6379
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: redis_exporter:9121 #这里写的是exporter的地址
...
3、解析配置
首先,为什么配置了两个job: redis_exporter 和 redis_exporter_targets? 分别是什么?
job: redis_exporter,是可选的, 它抓取的信息是exporter自身的数据,不是含redis的. 所以这个job是可以不配置的.
job: redis_exporter_targets是真正采集redis的job; 由于redis是要通过redis-exporter来采集的, redis-exporter相当于一个代理
虽说,job:redis_exporter不是必须的,但是添加后prometheus的redis dashboard上也会自动识别出这个exporter本身的监控的, 所以建议留着, 也可以让我们了解exporter本身的运行情况
正是应为是"代理"的形式,所以数据要先经过一番"修饰"才行,所以才需要引入relabel_configs来
为什么要引入relabel_configs?
对于prometheus来说,采集其实就是对应这个一条metric url,所以正确找到url才是目的.
默认情况下(没有relabel_configs时),
访问地址就是
http://<__address__>/<metrics_path>
,比如上方的job:redis_exporter的metric url 是: http://redis_exporter:9121/metrics
但是对于job:redis_exporter_targets来说,如果我们不配置relabel_configs的情况下,它的metric url将是http://redis://redis6379:6379/scrape, 这明显不是一个正确的地址. 为了解决这个问题所以需要relabel_configs来改写这个url.
所以,现在可以来回答下这个问题了, 引入relabel_configs的目的就是为了改写默认的metric url.
job: redis_exporter_targets对应的<metrics_path>是"scrape", 不是默认的"metrics" (因为配置文件中指定了metrics_path参数)
<\_\_address\_\_> 的默认值来源于target定义, 对于job: redis_exporter, <\_\_address\_\_> 就是"redis_exporter:9121"
relabel_configs怎么工作的?
与其说如何工作,不如说它如何改写metric url: http://redis://redis6379:6379/scrape(很明显,这是个不能访问的地址)
为了便于理解,还是先来说下真正的地址应该多少吧
其实真正的地址是: http://redis_exporter:9121/scrape?target=redis://redis6379:6379ps: 真正的地址是由redis-exporter程序决定的
# replacement,顾名思义替换的意思,
# 默认情况下, job:redis_exporter_targets的 __address__的值是redis://redis6379:6379,
# 所以他需要替换为redis_exporter:9121
- target_label: __address__
replacement: redis_exporter:9121
# 经过replacement后,地址将变为: http://redis_exporter:9121/scrape
# 此时依然不符合,还缺少后面的?target=redis://redis6379:6379
# 那后面的部分是怎么来的呢?
- source_labels: [__address__]
target_label: __param_target
# 上面两行的意思是, 添加参数target(即__param_target),参数的值等于 [__address__]
# 对于job: redis_exporter_targets, target=redis://redis6379:6379
# 经过上面的4行,真正的metric url就已经被拼接出来了
# http://redis_exporter:9121/scrape + ?target=redis://redis6379:6379
# 那为什么还需要下面两行呢?
- source_labels: [__param_target]
target_label: instance
#因为上面使用replacement替换了__address__, 默认情况instance的值从__address__来的,所以replacement后instance的值也被更改了, 所以要修改回来.
# 那为什么要改回来呢? prometheus采集的数据需要根据instance来表述该条数据是谁的.
经过以上的解读, 应该差不多明白了吧?
嗯!还有问题的话, 那就下方留言吧.
对了, 还有微信群, 相信你能找得到!
评论