prometheus中relabel_configs深度解析

SRE技术栈  ·  2020-12-06

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"

# 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来表述该条数据是谁的.

经过以上的解读, 应该差不多明白了吧?

嗯!还有问题的话, 那就下方留言吧.

对了, 还有微信群, 相信你能找得到!

 
评论
Glab. All Rights Reserved. Theme Jasmine by Kent Liao.