Prometheus入门教程之Relabel使用(五)

99次阅读

共计 6990 个字符,预计需要花费 18 分钟才能阅读完成。

1 relabel简介

为了更好的识别监控指标,便于后期调用数据绘图、告警等需求,Prometheus支持对发现的目标进行label修改,可以在目标被抓取之前动态重写目标的标签集。每个抓取配置可以配置多个重新标记步骤。它们按照它们在配置文件中出现的顺序应用于每个目标的标签集。

除了配置的每个目标标签之外,Prometheus还会自动添加几个标签:

job标签:设置为job_name相应的抓取配置的值。
instance标签:__address__设置为目标的地址:。重新标记后,如果在重新标记期间未设置标签,则默认将__address__标签值赋值给instance。
schema:协议类型
__metrics_path:抓取指标数的url
scrape_interval:scrape抓取数据时间间隔(秒)
scrape_timeout:scrape超时时间(秒)

meta_在重新标记阶段可能会提供带有前缀的附加标签。它们由提供目标的服务发现机制设置,并且因机制而异。

__目标重新标记完成后,将从标签集中删除以开头的标签。

如果重新标记步骤只需要临时存储标签值(作为后续重新标记步骤的输入),可以使用__tmp标签名称前缀。这个前缀保证不会被 Prometheus 本身使用。

常用的在以下两个阶段可以重新标记:

  • relabel_configs:在采集之前(比如在采集数据之前重新定义元标签),可以使用relabel_configs添加一些标签、也可以只采集特定目标或过滤目标

  • metric_relabel_configs:如果是已经抓取到指标数据时,可以使用metric_relabel_configs做最后的重新标记和过滤

2 relabel_configs配置

然后是一段relabel_configs配置,其作用主要是用于匹配最终要抓取的 endpoint,构造抓取的地址,甚至给最终的时序指标加上一些 label

source_labels:源标签,没有经过relabel处理之前的标签名字

target_labels:通过relabel处理之后的标签名字

separator:源标签的值的连接分隔符。默认是";"

module:取源标签值散列的模数

regex:正则表达式,匹配源标签的值。默认是(.*)

replacement:通过分组替换后标签(target_label)对应的值。默认是$1

action:根据正则表达式匹配执行的动作。默认是replace

replace:替换标签值,根据regex正则匹配到原标签值,使用replacement来引用表达式匹配的分组
keep:满足regex正则条件的实例进行采集,把source_labels中没有匹配到regex正则内容的target实例丢掉,即只采集匹配成功的实例

drop:满足regex正则条件的实例不采集,把source_labels中没有匹配到regex正则内容的target实例丢掉,即只采集没有匹配成功的实例
hashmod: 使用hashmod计算source_labels的hash值并进行对比,基于自定义的模数取模,以实现对目标进行分类、重新赋值等功能
labelmap: 匹配regex所有标签名称,然后复制匹配标签的值进行分组,通过replacement分组引用($1,$2,…)替代
labeldrop: 匹配regex所有标签名称,对匹配到的实例标签进行删除
labelkeep: 匹配regex所有标签名称,对匹配到的实例标签进行保留

3 常用的action案例

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['localhost:9090']
        labels:
          instance: prometheus
  - job_name: node_exporter
    static_configs:
      - targets: ['172.16.1.37:9100']
        labels:
          instance: localhost
          __hostname__: node01
          __region_id__: "ap-shanghai"
      - targets: ['172.16.1.14:9100']
        labels:
          instance: localhost
          __hostname__: node02
          __region_id__: "ap-shanghai"

查看target

Prometheus入门教程之Relabel使用(五)

因为我们的label都是以__开头的,目标重新标签之后,以__开头的标签将从标签集中删除的。

3.1 replace

将labels中的hostname替换为node_name

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['localhost:9090']
        labels:
          instance: prometheus
  - job_name: node_exporter
    static_configs:
      - targets: ['172.16.1.37:9100']
        labels:
          instance: localhost
          __hostname__: node01
          __region_id__: "ap-shanghai"
      - targets: ['172.16.1.14:9100']
        labels:
          instance: localhost
          __hostname__: node02
          __region_id__: "ap-shanghai"
      relabel_configs:
    - source_labels:
      - "__hostname__"
      regex: "(.*)"
      target_label: "node_name"
      action: replace
      replacement: $1

重启服务查看target信息如下

Prometheus入门教程之Relabel使用(五)

说下上面的配置: source_labels指定我们需要处理的源标签, target_labels指定了我们要replace后的标签名字, action指定relabel动作,这里使用replace替换动作。 regex去匹配源标签(hostname)的值,"(.*)"代表hostname这个标签是什么值都匹配的,然后replacement指定的替换后的标签(target_label)对应的数值。采用正则引用方式获取的

3.2 keep

只要source_labels的值匹配node01的实例才会被采集数据,其他实例不会采集

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['localhost:9090']
        labels:
          instance: prometheus
  - job_name: node_exporter
    static_configs:
      - targets: ['172.16.1.37:9100']
        labels:
          instance: localhost
          __hostname__: node01
          __region_id__: "ap-shanghai"
      - targets: ['172.16.1.14:9100']
        labels:
          instance: localhost
          __hostname__: node02
          __region_id__: "ap-shanghai"
    relabel_configs:
    - source_labels:
      - "__hostname__"
      regex: "node01"
      action: keep

Prometheus入门教程之Relabel使用(五)

3.3 drop

keep的基础上把action修改为drop

Prometheus入门教程之Relabel使用(五)

action为drop,其实和keep是相似的, 不过是相反的, 只要source_labels的值匹配regex(node01)的实例不会被采集。 其他的实例会被采集。

3.4 labelmap

所有被regex __(.*)__匹配到的标签名,复制匹配到的标签的值,通过replacement分组引用$1,然后创建匹配到的标签集

修改配置如下:

4 relabel_config 举例

__address__="192.168.65.3:9100"
__meta_kubernetes_endpoint_address_target_kind="Pod"
__meta_kubernetes_endpoint_address_target_name="prometheus-node-exporter-89tcq"
__meta_kubernetes_endpoint_port_name="metrics"
__meta_kubernetes_endpoint_port_protocol="TCP"
__meta_kubernetes_endpoint_ready="true"
__meta_kubernetes_endpoints_name="prometheus-node-exporter"
__meta_kubernetes_namespace="default"
__meta_kubernetes_pod_container_name="prometheus-node-exporter"
__meta_kubernetes_pod_container_port_name="metrics"
__meta_kubernetes_pod_container_port_number="9100"
__meta_kubernetes_pod_container_port_protocol="TCP"
__meta_kubernetes_pod_controller_kind="DaemonSet"
__meta_kubernetes_pod_controller_name="prometheus-node-exporter"
__meta_kubernetes_pod_host_ip="192.168.65.3"
__meta_kubernetes_pod_ip="192.168.65.3"
__meta_kubernetes_pod_label_app="prometheus"
__meta_kubernetes_pod_label_component="node-exporter"
__meta_kubernetes_pod_label_controller_revision_hash="1203132889"
__meta_kubernetes_pod_label_pod_template_generation="1"
__meta_kubernetes_pod_label_release="prometheus"
__meta_kubernetes_pod_name="prometheus-node-exporter-89tcq"
__meta_kubernetes_pod_node_name="docker-for-desktop"
__meta_kubernetes_pod_ready="true"
__meta_kubernetes_pod_uid="62b53ba7-eae3-11e8-b0a6-025000000001"
__meta_kubernetes_service_annotation_prometheus_io_scrape="true"
__meta_kubernetes_service_label_app="prometheus"
__meta_kubernetes_service_label_chart="prometheus-7.4.1"
__meta_kubernetes_service_label_component="node-exporter"
__meta_kubernetes_service_label_heritage="Tiller"
__meta_kubernetes_service_label_release="prometheus"
__meta_kubernetes_service_name="prometheus-node-exporter"
__metrics_path__="/metrics"
__scheme__="http"
job="kubernetes-service-endpoints"

通过kubernetes_sd_configs发现机制,通过apiserver的接口列出当前k8s集群中endpoints列表

经过下面的relabel规则后:

- job_name: kubernetes-service-endpoints
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - action: keep
        regex: true
        source_labels:
        - __meta_kubernetes_service_annotation_prometheus_io_scrape
# 只匹配__meta_kubernetes_service_annotation_prometheus_io_scrape=true的endpoint
# 然后进行下一步
# 如果有__meta_kubernetes_service_annotation_prometheus_io_scheme,且正则匹配(https?),则将__scheme__修改为__meta_kubernetes_service_annotation_prometheus_io_scheme指定的值
      - action: replace
        regex: (https?)
        source_labels:
        - __meta_kubernetes_service_annotation_prometheus_io_scheme
        target_label: __scheme__
# 如果有__meta_kubernetes_service_annotation_prometheus_io_path,且正则匹配(.+),则将__metrics_path__修改为__meta_kubernetes_service_annotation_prometheus_io_path指定的值
      - action: replace
        regex: (.+)
        source_labels:
        - __meta_kubernetes_service_annotation_prometheus_io_path
        target_label: __metrics_path__
 # 如果有__address__;__meta_kubernetes_service_annotation_prometheus_io_port,且正则匹配([^:]+)(?::\d+)?;(\d+),则将__address__修改为$1:$2指定的值
      - action: replace
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
        source_labels:
        - __address__
        - __meta_kubernetes_service_annotation_prometheus_io_port
        target_label: __address__
# 如果label名称正则匹配__meta_kubernetes_service_label_(.+),则设置相应的label
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
 # 设置kubernetes_namespace为__meta_kubernetes_namespace的值
      - action: replace
        source_labels:
        - __meta_kubernetes_namespace
        target_label: kubernetes_namespace
# 设置kubernetes_name为__meta_kubernetes_service_name的值
      - action: replace
        source_labels:
        - __meta_kubernetes_service_name
        target_label: kubernetes_name

最终形成的抓取endpoint信息如下:

__address__="192.168.65.3:9100"
app="prometheus"
chart="prometheus-7.4.1"
component="node-exporter"
heritage="Tiller"
release="prometheus"
kubernetes_namespace="default"
kubernetes_service_name="prometheus-node-exporter"
__metrics_path__="/metrics"
__scheme__="http"
job="kubernetes-service-endpoints"

上述的endpoint信息交由prometheus,prometheus就可以得到抓取地址了,为__scheme__://__address____metrics_path__,也即http://192.168.65.3:9100/metrics

正文完
 
mervinwang
版权声明:本站原创文章,由 mervinwang 2023-07-26发表,共计6990字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
文章搜索