Prometheus relabel重新打标

对target重新打标是在数据抓取之前动态重写target标签的强大工具,在每个数据抓取配置中,可以定义多个relabel步骤,它们将按照定义的顺序依次执行。
对于发现的每个target,Prometheus默认会执行如下操作:
  1. job的标签设定为其所属job_name的值;
  2. __address__标签的值为该target的套接字地址“:”
  3. instance标签的值为__address__的值
  4. __scheme__标签的值为抓取该target上指标时使用的协议(http或https)
  5. __metrics_path__标签的值为抓取该target指标时使用的URL路径,默认为/metrics
  6. __param_标签的值为传递的URL参数中第一个名称为的参数的值
需要注意:
重新标记期间,还可以使用该target上以"__meta_"开头的元标签,各服务发现机制为其target添加的源标签会有所不同。
重新标记完成后,该target上以"__"开头的所有标签都会被移除,若在relabel的过程中需要临时存储标签值,则要使用__tmp为前缀进行保存,以避免同Prometheus的内建标签冲突。

relabel_config

relabel中几个重要的字段作用:
# source_labels从指定标签中匹配值。并将值串联
# 使用配置的分隔符并与配置的正则表达式匹配
# 用于替换、保留和丢弃操作。
[ source_labels: '[' <labelname> [, ...] ']' ] # 串联源标签值之间的分隔符,默认;
[ separator: <string> | default = ; ] # 在替换操作中将结果值写入的标签。
# 对于替换操作,它是强制性的。Regex捕获组可用。
[ target_label: <labelname> ] # 与提取值匹配的正则表达式。
# 当actions等于replace, keep, drop, labelmap,labeldrop and labelkeep时使用
[ regex: <regex> | default = (.*) ] # 获取源标签值的哈希值的模数。
[ modulus: <int> ] # 如果正则表达式匹配,则对其执行正则表达式替换的替换值。
[ replacement: <string> | default = $1 ] # 基于正则表达式匹配要执行的操作。
[ action: <relabel_action> | default = replace ]

<relabel_action>字段用于定义重新标记的行为,其可用取值有:

1. 替换标签值

  • replace:首先将source_labels中指定的各标签的值进行串联,而后将regex字段中的正则表达式对源标签值进行匹配判定,若匹配,则将target_label字段中指定的标签的值替换为replacement字段中保存的值
    • replacement可按需引用保存regex中的某个“分组模式”匹配到的值;默认保存整个regex匹配到的内容
    • 进行值替换时,replacement字段中指定标签的值也支持以分组格式进行引用
  • hashmod:将target_label的值设置为一个hash值,该hash则由modules字段指定的hash模块对source_labels上各标签的串联值进行hash计算

2. 删除指标:该处的每个指标名称对应一个target

  • keep:regex不能匹配到target上的source_labels上的各标签的串联值时,则删除该target
  • drop:regex能够匹配到target上的source_labels上的各标签的串联值时,则删除该target

3. 创建或删除标签

  • labelmap:将regex对所有的标签名进行匹配判定,而后将匹配到的标签的值赋给replacement字段指定的标签名之上,通常用于取出匹配的标签名的一部分生成新标签
  • labeldrop:将regex对所有的标签名进行匹配判定,能够匹配到的标签将从target的标签集中删除
  • labelkeep:将regex对所有的标签名进行匹配判定,不能够匹配到的标签将从target的标签集中删除
注意:要确保labeldrop或labelkeep操作后,余下的标签集依然能唯一标识该指标

relabel示例之replace

以我们上节基于consul自动发现的target来做示例,下图是服务发现后自动打上的标签:
我们这里做一个拼接,将__scheme__、__address__和__metrics_path__的值拼接成一个值并重新赋予给endpoint这个标签,如下:
  - job_name: 'nodes'
consul_sd_configs:
- server: "monitor.example.com:8500"
tags:
- "nodes"
refresh_interval: 2m
scrape_interval: 15s
relabel_configs:
- source_labels:
- __scheme__
- __address__
- __metrics_path__
regex: (http|https)(.*)
separator: ""
target_label: endpoint
replacement: ${1}://${2}
action: replace
重新加载配置
curl -XPOST monitor.example.com:9090/-/reload
查看:
如此配置之后,所有job_name=nodes的target都会执行此relabel操作。

relabel示例之labelmap

以我们上节基于consul自动发现的target来做示例,下图是服务发现后自动打上的标签,都以__meta__consul开头:
我们这里做一个类似重命名的操作,将__meta_consul_service开头的标签再次利用起来,将__meta_consul_service_这么一堆去掉,改为node_xxx这种类型:
    - regex: (__meta_consul_service_)(.*)
replacement: node_${2}
action: labelmap
重新加载配置
curl -XPOST monitor.example.com:9090/-/reload
查看:
已经达到预期,这个时候可以通过node_address等这些标签进行筛选target了。

relabel示例之labeldrop

以上两种方式实现了标签的拼接及重命名操作,但是还有很多标签是我们不想要的,我们也可以通过labeldrop来将它们删除,例如上边所有job开头的指标名称全部删除:
    - regex: ^job.*
action: labeldrop
需要注意,relabel是按照配置顺序从上往下执行的,所以在删除操作之前如果有用到此类标签,一定要把drop的配置放在其后边
./promtool check config prometheus.yml
curl -XPOST monitor.example.com:9090/-/reload
此时包含所有以job开头的标签均已被删除:

relabel示例之keep

以上都是对target的标签进行了一系列操作,keep和drop是针对target本身的操作,例如,我想仅仅保持node_port标签值为9.+1的target,其他全部删除:
    - source_labels:
- node_port
regex: 9.+1
action: keep
最终结果,node_port=9100的target被筛选走了:

以上实现最终prometheus.yml配置文件

scrape_configs:
- job_name: 'nodes'
consul_sd_configs:
- server: "monitor.example.com:8500"
tags:
- "nodes"
refresh_interval: 2m
scrape_interval: 15s
relabel_configs:
- source_labels:
- __scheme__
- __address__
- __metrics_path__
regex: (http|https)(.*)
separator: ""
target_label: endpoint
replacement: ${1}://${2}
action: replace
- regex: (__meta_consul_service_)(.*)
replacement: node_${2}
action: labelmap
- regex: job
action: labeldrop
- source_labels:
- node_port
regex: 9.+1
action: keep

metric_relabel_config

上边对target的标签进行relabel后,在获取指标的最后一步,还可以对metric进行重新打标,其作用在于:
  1. 删除不必要的指标
  2. 从指标中删除敏感或不需要的标签
  3. 添加、编辑或者修改指标的标签值或者标签格式
对metric重新打标的配置格式与target重新打标的格式相同,但要定义到 metric_relabel_configs 字段中。
需要注意的是:
  • 更改或添加标签会创建新的时间序列,所以要明确使用各标签,尽可能保持不变,避免创建出一个动态的数据环境
  • 标签是时间序列的唯一性约束,删除标签并导致时间序列重复时,可能会导致系统出现问题

metric relabel删除指标

例如删除go_info指标,通过__name__元标签引用指标名称,然后由regex进行匹配判定,可使用drop action删除匹配的指标。
注:__name__ 是一个特殊的标签名称,用于存储指标名称(也称为“指标类型”),例如go_info它就是一个指标名称。
下边示例,用于在响应的job_name之上,删除go_info指标:
  - job_name: 'nodes'
consul_sd_configs:
- server: "monitor.example.com:8500"
tags:
- "nodes"
refresh_interval: 2m
scrape_interval: 15s
metric_relabel_configs:
- source_labels: [__name__]
regex: go_info
action: drop
重新加载:
curl -XPOST monitor.example.com:9090/-/reload
删除前:
删除后:
至此,Prometheus relabel相关功能演示完毕。

写到最后

到此博客,Prometheus本身相关的话题、知识点及应用方式基本上都汇总完毕,后续会更着重于与Prometheus息息相关的组件介绍,包括查询结果的持久化、grafana、pushgateway以及告警组件altermanager等服务,感兴趣的朋友可以欢迎关注。

Prometheus-5:relabel标签重新打标的更多相关文章

  1. Prometheus监控学习笔记之Prometheus的Relabel,SD以及Federation功能

    0x00 k8s 的监控设计 k8s 默认以及推荐的监控体系是它自己的一套东西:Heapster + cAdvisor + Influxdb + Grafana,具体可以看 这里 . 包括 k8s 自 ...

  2. Prometheus 标签使用示例整合

    Prometheus 监控实例 一.Prometheus 根据标签聚合总CPU使用率 1.主机添加标签(可在多个主机内添加相同标签实现聚合):vim prometheus.conf static_co ...

  3. kubernetes之监控Prometheus实战--prometheus介绍--获取监控(一)

    Prometheus介绍 Prometheus是一个最初在SoundCloud上构建的开源监控系统 .它现在是一个独立的开源项目,为了强调这一点,并说明项目的治理结构,Prometheus 于2016 ...

  4. Prometheus监控学习笔记之Prometheus普罗米修斯监控入门

    0x00 概述 视频讲解通过链接网易云课堂·IT技术快速入门学院进入,更多关于Prometheus的文章. Prometheus是最近几年开始流行的一个新兴监控告警工具,特别是kubernetes的流 ...

  5. Kubernetes1.16下部署Prometheus+node-exporter+Grafana+AlertManager 监控系统

    Prometheus 持久化安装 我们prometheus采用nfs挂载方式来存储数据,同时使用configMap管理配置文件.并且我们将所有的prometheus存储在kube-system #建议 ...

  6. Kubernetes 监控--Prometheus 高可用: Thanos

    前面我们已经学习了 Prometheus 的使用,了解了基本的 PromQL 语句以及结合 Grafana 来进行监控图表展示,通过 AlertManager 来进行报警,这些工具结合起来已经可以帮助 ...

  7. C#开发微信门户及应用(37)--微信公众号标签管理功能

    微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...

  8. jstl标签库基础教程及其使用代码

    概述 在 JSP 页面中,使用标签库代替传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现.鉴于此,出现了 JSTL ( JSP Sta ...

  9. Dreamweaver标签库

    .highlight .hll { background-color: #ffffcc } .highlight { background: #ffffff } .highlight .c { col ...

  10. 转:常用的HTML标签和属性解释

    基本结构标签: <HTML>,表示该文件为HTML文件 <HEAD>,包含文件的标题,使用的脚本,样式定义等 <TITLE>---</TITLE>,包含 ...

随机推荐

  1. Network Science:巴拉巴西网络科学学习笔记3——第二章随机网络

    第二章:随机网络Erdős-Rényi Network (ER网络) 随机网络的两种定义形式: \(G(N,L)\)模型:N个节点,L条边随机链接. \(G(N,p)\)模型:N个节点,每个节点之间以 ...

  2. Portainer安装

    个人博客地址: https://note.raokun.top 拥抱ChatGPT,国内访问网站:https://www.playchat.top Portainer是一个可视化的容器镜像的图形管理工 ...

  3. 快速求popcount的和

    前置知识 \(\text{popcount}(n)\) 表示将 \(n\) 转为二进制后的数中 \(1\) 的个数. 结论 \[\sum_{i=1}^{n} \text{ popcount}(i)=\ ...

  4. Docker快速部署Hadoop环境

    文章目录 安装环境 安装过程 拉取镜像 在Docker中创建网络,方便通信 创建Master节点 创建slave1和slave2节点 分别进入三个容器修改hosts文件 在Master执行集群初始化 ...

  5. 2步打通ModelArts和Astro,实现AI应用快速落地

    摘要:本文以 ModelArts 的"找云宝"自动学习 AI 应用为例,结合低代码平台 Astro 轻应用快速实现一个"找云宝"小应用. 本文分享自华为云社区& ...

  6. 【Python基础】推导式(列表、字典、集合)

    推导式是一种简洁.高效的语法,用于从一个可迭代对象中生成新的可迭代(iterable)对象. 通常情况下,在以下情况可以考虑使用推导式: 只需要简单的表达式来计算新的可迭代对象的元素. 可迭代对象不是 ...

  7. 关于python中的OSError报错问题

    Traceback (most recent call last):  File "main.py", line 1, in <module>    from trai ...

  8. 2020-09-24:jvm监控系统是通过jmx做的么?

    福哥答案2020-09-24:#福大大架构师每日一题# [此答案来自知乎:](https://www.zhihu.com/question/422632973) 一般都是,但是要是记录比较详细的性能定 ...

  9. C语言之环形队列

    一.环形队列的优势 环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题.在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素.这样可以在不浪费空 ...

  10. linux 系统安全和应用

    目录 一.系统安全 二.账号安全 三.修改密码生效时间 四.强制下次登录成功时修改密码 五.历史命令 六.终端自动注销 七.wheel组 八.grub菜单密码 一.系统安全 原因:1.系统数据想要保护 ...