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. day02-2-商铺查询缓存

    功能02-商铺查询缓存 3.商铺详情缓存查询 3.1什么是缓存? 缓存就是数据交换的缓冲区(称作Cache),是存储数据的临时地方,一般读写性能较高. 缓存的作用: 降低后端负载 提高读写效率,降低响 ...

  2. Docker compose单机编排工具

    Docker compose单机编排工具 目录 Docker compose单机编排工具 docker-compose介绍 Docker Compose使用的三步: docker-compose安装部 ...

  3. 2022-02-25:k8s安装zookeeper,yaml如何写?找份北京的golang后端工作,35岁,有人收我吗?

    2022-02-25:k8s安装zookeeper,yaml如何写?找份北京的golang后端工作,35岁,有人收我吗? 答案2022-02-25: yaml如下: apiVersion: apps/ ...

  4. vue全家桶进阶之路49:Vue3 环境变量

    vue3 环境变量 在Vue3中,可以通过环境变量来管理应用程序中的配置.这些配置可以包括后端API的URL.API key.跟踪ID等等.在不同的开发.测试.生产环境中使用不同的配置是非常有用的.V ...

  5. vue全家桶进阶之路24:Mock

    Mock 是一个 JavaScript 库,用于生成随机数据或模拟 HTTP 请求响应,用于前端开发中的单元测试.功能测试.集成测试等场景. Mock 可以生成各种类型的数据,包括字符串.数字.布尔值 ...

  6. 【熊子q的代码乐园】用python写个健康报备记录小系统

    目录 一.前言 二.技术实现 1.概述 2. 环境 3. 技术核心 4. 数据库 5. 源代码 三.最后 一.前言 coding的一路上,遇到过许多问题,也写过一些代码去解决,回头看看还是有点意思的, ...

  7. java开发学习框架

    Java基础 1.1. Java简介与安装 1.2. Java基本语法 1.3. 数据类型与变量 1.4. 运算符与表达式 1.5. 流程控制(分支与循环) 1.6. 数组 面向对象编程 2.1. 类 ...

  8. Abstract Factory Pattern 抽象工厂模式简介与 C# 示例【创建型】【设计模式来了】

    〇.简介 1.什么是抽象工厂模式? 一句话解释:   通过对抽象类和抽象工厂的一组实现,独立出一系列新的操作,客户端无需了解其逻辑直接访问. 抽象工厂模式(Abstract Factory Patte ...

  9. 【最佳实践】如何设计 RESTful API ?

    良好的 API 设计是一个经常被提及的话题,特别是对于那些试图完善其 API 策略的团队来说.一个设计良好的 API 的好处包括:改进开发者体验.更快速地编写文档以及更高效地推广你的 API.但是,到 ...

  10. RStuido Server 选择不同的 R 版本(conda 中的不同 R 版本)

    自从上一次服务器重装系统之后,总感觉缺少了一些东西,安装R包很多依赖库报错,也可以解决,但总是存在,烦. 一天,一个同事问我说ggpubr包安装不成功,我就自己试了一下,真的是--安装不成功. 当你到 ...