博客/工程

《普罗米修斯》中的重新标签是如何运作的

2022年3月21日10分钟

重新标记是一个强大的工具,它允许您通过重写它们的标签集来分类和过滤Prometheus目标和指标。

这篇文章的目的是解释普罗米修斯的价值。relabel_configBlock,它可以在不同的地方找到,以及它在驯服中的用处普罗米修斯指标。这里的大部分内容也适用于Grafana代理用户。

作为参考,这里是我们的指南通过重新标签减少Prometheus参数的使用

废话不多说,让我们开始吧!

普罗米修斯标签

标签是键值对的集合,它允许我们用普罗米修斯度量标准来描述和组织实际被测量的内容。

例如,在测量HTTP延迟时,我们可以使用标签来记录返回的HTTP方法和状态、调用的端点以及负责请求的服务器。

每个键值标签对的唯一组合都被存储为Prometheus中的一个新的时间序列,因此标签对于理解数据的时间序列至关重要基数并且应该避免将无界值集作为标签。

内部标签

但是没有标签的指标呢?普罗米修斯也提供了一些内部标签给我们。这些以两个下划线开头,并在应用了所有重标记步骤后删除;这意味着除非显式地将它们配置为,否则它们将不可用。

我们可以得到的一些特殊标签是

标签名称 描述
__name__ 度量标准的名称
__address__ 主机:刮擦目标器的端口
__scheme__ 抓取目标的URI方案
__metrics_path__ 抓取目标的度量端点
__param_ <名称> 第一个URL参数的值是否传递给目标
__scrape_interval__ 目标刮擦间隔(实验)
__scrape_timeout__ 目标超时(实验性)
__meta_ 由服务发现机制设置的特殊标签
__tmp 在丢弃标签值之前临时存储标签值的特殊前缀

现在我们了解了各种relabel_config规则的输入是什么,我们如何创建一个呢?它们的实际用途是什么?

应用阶段

关于重新标记规则的一个混乱来源是,它们可以在Prometheus配置文件的多个部分中找到。

#刮取配置列表。Scrape_configs: - job_name: "some scrape_job "…#目标重标签配置列表。Relabel_configs: [- …#参数重标配置列表。Metric_relabel_configs: [- …#远程写的相关设置。Remote_write: url: https://remote-write-endpoint.com/api/v1/push…#远程写重标签配置列表。Write_relabel_configs: [- … ]

原因是重新标记可以应用于指标生命周期的不同部分——从选择我们想要刮除的可用目标,到筛选我们想要存储在普罗米修斯时间序列数据库中的内容,以及发送到远程存储的内容。

首先,relabel_configsKey可以作为抓取作业定义的一部分找到。应用这些重新标记步骤之前刮刮发生,只能访问普罗米修斯的服务发现添加的标签。它们允许我们过滤SD机制返回的目标,以及操作它设置的标签。

一旦确定了目标,就可以metric_relabel_configs应用步骤并允许我们选择我们想要摄取的系列到普罗米修斯的存储。

最后,write_relabel_configsBlock在将数据发送到远程端点之前对数据应用重标签规则。这可以用来筛选指标高基数或者将度量路由到特定的remote_write目标。

基本的

一个< relabel_config >由七个字段组成。这些都是:

  • source_labels
  • 分隔符(默认=;)
  • target_label
  • Regex(默认= (.*))
  • 模量
  • 替换(默认= $1)
  • 操作(default = replace)

一个Prometheus配置可以包含一个重标记步骤数组;它们按照定义的顺序应用到标签集。省略的字段采用默认值,因此这些步骤通常会更短。

Source_labels和分隔符

让我们从source_labels.它需要一个包含一个或多个标签名的数组,这些标签名用于选择各自的标签值。如果在source_labels数组中提供了多个名称,则结果将是它们值的内容,并使用所提供的分隔符

例如,考虑以下两个指标

My_custom_counter_total {server="webserver01",子系统="kata"} 192 1644075044000 My_custom_counter_total {server="sqldatabase",子系统="kata"} 147 1644075044000

下面是relabel_config . config

Source_labels:[子系统,服务器]separator: "@"

会提取出这些值。

kata@webserver01 kata@sqldatabase

正则表达式

正则表达式字段需要一个有效的RE2正则表达式,并且使用匹配类的组合提取的值source_label而且分隔符字段。正则表达式支持带圆括号的捕获组,稍后可以引用这些捕获组。

这个方块会匹配我们之前提取的两个值

Source_labels:[子系统,服务器]separator: "@" regex: "kata@(.*)"

然而,这个块会匹配前面的标签,并将中止这个特定的重新标签步骤的执行

Source_labels:[子系统,服务器]separator: "@" regex: "(.*)@redis"

默认的regex值是(.*),所以如果没有指定,它将匹配整个输入。

更换

如果提取的值与给定的正则表达式匹配,则更换通过执行正则表达式替换并利用任何先前定义的捕获组来填充。回到我们提取的值,和一个这样的块

source_labels(子系统、服务器):分隔符:“@”正则表达式 : "(.*)@(.*)" 替换:“$ {2}/ $ {1}"

会捕捉到之前和之后的情况@符号,交换它们,并用斜线分隔它们。

webserver01 /型sqldatabase /型

替换的默认值是$1,因此它将匹配正则表达式中的第一个捕获组,如果没有指定正则表达式,则匹配整个提取的值。

target_label

如果重标签操作导致一个值被写入某个标签,target_label定义为哪一个更换标签应注明。例如,下面的块将设置这样的标签{env = "生产"}

target_label: "env" action: "replace"

继续前面的示例,这个重新标记步骤将设置更换值改为" my_new_label "

- source_labels:[子系统,服务器]separator: "@" regex: "(.*)@(.*)" replace: "${2}/${1}" target_label: "my_new_label" action: "replace"

导致

{my_new_label =“webserver01 /型”}{my_new_label =“sqldatabase /型”}

模量

最后,模量字段要求为正整数。的结果填充target_label, relabel_config步骤将使用该数字MD5(提取值)%模量表达式。

可用的行动

我们已经走了很长一段路,但我们终于取得了一些进展。现在我们能做什么用这些积木?他们如何在日常工作中帮助我们?

有7种操作可供选择,让我们仔细看看。

保持/下降

保留和删除操作允许我们过滤目标而且指标基于我们的标签值是否匹配提供的正则表达式。

让我们回到前面的例子

My_custom_counter_total {server="webserver01",子系统="kata"} 192 1644075074000 My_custom_counter_total {server="sqldatabase",子系统="kata"} 14700 1644075074000

的内容拼接后子系统而且服务器标签,我们可以放弃暴露的目标webserver-01通过使用下面的块

- source_labels:[子系统,服务器]separator: "@" regex: "kata@webserver" action: "drop"

或者如果我们在一个有多个子系统的环境中,但只想进行监视我们可以保留特定的目标或指标,并放弃与其他服务相关的一切。

—source_labels:[子系统,服务器]separator:“@”regex:“kata@(.*)”action: keep

在许多情况下,这就是内部标签发挥作用的地方。

例如,您可以只保留特定的指标名称。

- source_labels: [__name__] regex: " my_custom_counter_total|my_custom_counter_sum|my_custom_gauge "动作:保持

或者如果你正在使用Prometheus的Kubernetes服务发现,你可能想要从你的测试暂存名称空间。

- source_labels: [__meta_kubernetes_namespace] regex: " testing|staging " action: drop

labelkeep / labeldrop

labelkeep和labeldrop操作允许对标签集本身进行过滤。

在前面的例子中,我们可能对跟踪特定的内容不感兴趣子系统标签了。

下面的重标签将删除所有{子系统= " <名称> "}标签,但保留其他标签。

- regex: "subsystem"动作:labeldrop

当然,我们可以做相反的事情,只保留一组特定的标签,而放弃其他所有内容。

- regex: "subsystem|server|shard" action: labelkeep

我们必须确保在应用labelkeep和labeldrop规则后,所有指标仍然是唯一标记的。

取代

如果没有指定重标签规则,则Replace是该规则的默认操作;类的内容覆盖单个标签的值更换字段。

正如我们前面看到的,下面的块将把env标签设置为更换提供,所以{env = "生产"}将被添加到标签集。

—action: replace replace:生产target_label: env

取代Action在与其他字段结合使用时最有用。

下面是另一个例子:

- action: replace source_labels: [__meta_kubernetes_pod_name,__meta_kubernetes_pod_container_port_number] separator: ":" target_label: address

上面的代码段将连接存储在__meta_kubernetes_pod_name而且__meta_kubernetes_pod_container_port_number.然后将提取的字符串设置为写入target_label可能会导致{地址= " podname: 8080}

hashmod

hashmod操作提供了一种水平缩放Prometheus的机制。

重标步骤计算连接标签值的MD5哈希对正整数N进行模运算,得到范围为[0,N-1]的数字。

举个例子可以更清楚地说明这一点。考虑下面的度量和重新标记步骤

My_custom_metric {name="node",val="42"} 100 - action: hashmod source_labels: [name, val] separator: "-" modulus: 8 target_label: __tmp_hashmod

串接的结果是字符串“node-42”,字符串模量8的MD5值为5

$ python3 >>> import hashlib >>> m = hashlib.md5(b"node-42") >>> int(m.h hexdigest(), 16) % 8 5 .执行以下命令

所以,最终{__tmp = 5}将被追加到度量的标签集。

这最常用于在Prometheus实例舰队中对多个目标进行分片。下面的规则可用于在8个Prometheus实例之间分配负载,每个实例负责获取目标子集,最终产生[0,7]范围内的某个值,并忽略所有其他值。

- action: keep source_labels: [__tmp_hashmod] regex: 5

labelmap

labelmap操作用于将一个或多个标签对映射到不同的标签名。

方法中给出的新标签名将复制名称与所提供的正则表达式匹配的任何标签对更换字段,通过使用组引用(${1},${2}等)。

更换字段默认为just1美元,是第一个捕获的正则表达式,因此有时会省略它。

举个例子。如果我们使用普罗米修斯的Kubernetes SD,我们的目标会暂时暴露一些标签,如:

__meta_kubernetes_node_name:节点对象的名称。__meta_kubernetes_node_provider_id:节点对象的云提供商名称。__meta_kubernetes_node_address_:每个节点地址类型的第一个地址,如果存在的话。__meta_kubernetes_namespace:服务对象的命名空间。__meta_kubernetes_service_external_name:服务的DNS名称。(适用于ExternalName类型的服务)__meta_kubernetes_service_name:服务对象的名称。__meta_kubernetes_service_port_name:目标器的业务端口名称。__meta_kubernetes_pod_name: pod对象的名称。__meta_kubernetes_pod_ip: pod对象的pod IP。__meta_kubernetes_pod_container_init:如果容器是InitContainer,则为true。__meta_kubernetes_pod_container_name:目标地址指向的容器名称。 …

双下划线开头的标签在应用了重标签步骤后会被Prometheus删除,所以我们可以使用labelmap通过将它们映射到不同的名称来保存它们。

- action: labelmap regex: "__meta_kubernetes_(.*)"替换:"k8s_${1}"

在Prometheus中重新标签的常见用例

下面是一个小列表,列出了重新标记的常见用例,以及添加重新标记步骤的适当位置。

  • 当你想忽略应用程序的一个子集时;使用relabel_config
  • 在多个Prometheus服务器之间拆分目标时;使用relabel_config + hashmod
  • 当你想忽略高基数度量的子集时;使用metric_relabel_config
  • 当发送不同的度量到不同的端点时;使用write_relabel_config

了解更多

这就是今天的全部内容!希望你学到了关于重新标签规则的一两件事,并且你可以更自如地使用它们。欲了解更多信息,请查看我们的文档并阅读更多普罗米修斯的文档

Grafana Cloud是开始使用度量、日志、跟踪和仪表板的最简单方法。我们有一个慷慨的免费永远层和计划为每个bob体育手机二维码用例。现在免费注册