07. Prometheus - 标签重写

默认标签

默认情况下,Prometheus 加载 targets 后,都会包含一些默认的标签,其中以 __ 作为前缀的标签是在系统内部使用的,因此这些标签不会写入到样本数据中。

image

这些标签将会告诉 Prometheus 如何从该目标实例中获取监控数据。

自定义标签

除了系统给定的标签,用户其实可以自己自定义一些标签,以提升数据的可操作性。

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
      - targets:
          - "192.168.200.101:9100"
        labels:
          __server_node_name__: "node-01"
          __server_idc__: "aliyun"
      - targets:
          - "192.168.200.102:9100"
        labels:
          __server_node_name__: "node-02"
          __server_idc__: "tengxunyun"

调用接口重载 Prometheus 配置:

curl -X POST http://192.168.200.101:9090/-/reload

结果如图所示:

image

标签重写

标签重写(Relabeling)是 Prometheus 一个非常有用的功能,它可以在任务拉取(scraping)阶段前,修改 target 和它的 labels。prometheus 自身其实也做了标签重写工作,比如 instance 标签其实质是由 __address__ 标签重写而来。

通过 Service Discovery 就能直接的看到每个 target 所具有的标签:

image

标签重写的配置参数为 relabel_config,测试将原有的标签重写成新的标签:

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
      ...
    # 将标签 __address__ 的值重写给新的标签 address
    relabel_configs:
      - source_labels:
          - __address__
        target_label: "address"

调用接口重载 Prometheus 配置,结果如图所示:

image

重写覆盖(replacement)

该方法其实相当于重新自定义了一个标签,原始获取到的值已经被覆盖为了自定义的值:

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
      ...
    # 将标签 __address__ 的值重写给新的标签 address,然后再用指定的值去覆盖它
    relabel_configs:
      - source_labels:
          - __address__
        target_label: "address"
        replacement: "helloworld"

调用接口重载 Prometheus 配置,结果如图所示:

image

多标签拼接(separator)

重写标签的值不但能是一个标签的值,也可能是多个标签的值拼接而来:

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
      ...
    # 标签重写
    relabel_configs:
      - source_labels:
          - __scheme__
          - __address__
        # 指定多个标签拼接的分隔符
        separator: "://"
        target_label: "api"

调用接口重载 Prometheus 配置,结果如图所示:

image

正则重写

有时候标签的值并不能直接使用,可能需要进行处理:

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
      ...
    # 标签重写
    relabel_configs:
      - source_labels:
          - __address__
        target_label: "address"
        regex: "(.*):(.*)"
        replacement: "$1-$2"

调用接口重载 Prometheus 配置,结果如图所示:

image

重写丢弃(drop / keep)

如果有些 target 不希望保留,则可以使用正则去匹配标签的值,如果匹配则 drop:

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
      ...
    # 标签重写
    relabel_configs:
      - source_labels:
          - __address__
        target_label: "address"
        regex: "(.*):(.*)"
        replacement: "$1-$2"
      # 对重写的标签再次进行处理,如果匹配正则则删除 target
      - source_labels:
          - address
        regex: "(.*)101(.*)"
        action: drop

调用接口重载 Prometheus 配置,结果如图所示:

image

如果你想实现相反的功能,则只需要将 drop 换成 keep 即可。

标签名称替换(labelmap)

前面我们自定义了两个标签,如果想让这两个标签都暴露出来,则可以使用 labelmap 实现:

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
      ...
    # 标签重写
    relabel_configs:
      - regex: "__server_(.+)__"
        action: labelmap

调用接口重载 Prometheus 配置,结果如图所示:

image

其原理和标签重写很像,labelmap 是去正则匹配所有标签名,将匹配部分作为新的标签名,然后指向本来的值。

标签删除(labeldrop / labelkeep)

通过 labeldrop 能够实现删除匹配的所有标签:

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
      ...
    # 将匹配的标签名删除
    relabel_configs:
      - regex: "(job)"
        action: labeldrop

调用接口重载 Prometheus 配置,结果如图所示:

image

同样,如果想实现相反的功能,则换成 labelkeep 即可。

但是问题却出来了,换成 labelkeep 之后,整个 target 都消失了:

image

metric_relabel_configs

metric_relabel_configs 的使用方法和 relabel_config 类似,但是它确实用来重写指标名称的。常用于丢弃不需要的指标数据:

# 指标采集配置
scrape_configs:
  ...
  # 自己打标签
  - job_name: "node-exporter-relabel"
    static_configs:
     ...
    # 删除 exporter 带的 go 指标
    metric_relabel_configs:
      - source_labels:
          - "__name__"
        regex: "(go_.*)"
        action: drop

调用接口重载 Prometheus 配置,结果如图所示:

image

此时 exporter 自带的 go 指标就被清理了,其实质也是用了标签丢弃的原理。

posted @ 2022-08-23 19:16  不知名换皮工程师  阅读(1137)  评论(1)    收藏  举报