保留或删除标签
有的时候我们也有保留或删除一些标签的需求,比如有的目标在时间序列上提供了许多额外的标签,这些标签用途不大,这个时候我们就可以使用 labelkeep
和 labeldrop
这两个操作,使用这两个操作可以有选择地保留或删除一些标签。
labelkeep
的配置规则如下所示:
action: labelkeep
regex: <regular expression> # 默认为'(.*)'
一样 labelkeep
按顺序执行下面的步骤:
- 首先将 regex 中的正则表达式与所有标签名称进行匹配
- 它只保留那些匹配的标签
labeldrop
与 labelkeep
类似,只是它是删除那些匹配正则表达式的标签而不是保留。
下面我们看一看 labelkeep/labeldrop
操作的简单示例。
从报警中删除高可用副本标签
当运行两个相同的 Prometheus 作高可用的时候,通常两个服务器都被配置为有一个外部标签(通过全局配置选项 external_labels
),表明它们代表哪个副本,例如:replica: A
和 replica: B
,在从两个副本向同一个 Alertmanager 实例发送报警之前,Prometheus 需要删除这个副本标签(因为不删除对于alertmanager来说就可能识别为两个报警),这样 Alertmanager 就不会把收到的报警看成不同的报警了,否则可能我们会收到两个同样的报警通知。这个时候我们就可以使用 labeldrop
来实现这个操作。
action: labeldrop
regex: replica
这条配置规则很简单的,就是匹配 replica
这个标签,然后执行 labeldrop
删除标签动作即可。
删除指标中不需要的标签
有的时候我们抓取的指标在每个时间序列上都附加了一些额外的标签,这些标签对于我们来说用处不大,还会增加 Prometheus 的存储压力,所以我们可以想办法删除不需要的额外标签。
比如现在我们想要删除一 info_
开头的标签,我们可以使用下面的配置规则来完成。
action: labeldrop
regex: info_.*
同样也只是配置一个要删除的目标标签的正则表达式即可,只要匹配了的标签都会执行 labeldrop
操作将该标签进行删除。
标签值哈希和分片
在一些场景下我们可能需要运行多个几乎相同的 Prometheus 副本来横向扩展,每个副本只抓取部分目标,这样可以降低 Prometheus 的压力,在这种情况下 hashmod
操作有助于我们对目标进行分片操作。(要监控k8s集群,可能监控的资源相当大,一个普罗米修斯压力可能非常大,这样可以将抓取的目标做个拆分的,相当于做个分片的,那么可以让其中一个普罗米修斯抓取一部分,另外一个普罗米修斯抓取另外一部分。)
hashmod
的配置规则如下所示:
action: hashmod
source_labels: [<source label name list>]
modulus: <modulus value>
target_label: <target label>
该操作按顺序执行下面的步骤:
- 首先使用分隔符将源标签集 source_labels 的值连接起来
- 计算连接后的字符串的哈希值
- 将
modulus
中提供的模数应用于哈希值,以将哈希值限制在 0 和modulus-1
之间 - 将上一步的模数值存储在 target_label 目标标签中
使用 hashmod
的主要场景是将一个服务的整体目标进行分片,用于水平扩展 Prometheus,通过首先根据每个目标的一个或多个标签计算基于哈希的模数来实现的,然后只保留具有特定输出模数值的目标。比如为了根据 instance
标签对目标进行分片,只保留分片 2 的实例,我们可以把 hashmod
和 keep
结合起来操作。
- action: hashmod
source_labels: [instance]
modulus: 10
target_label: __tmp_hashmod
- action: keep
source_labels: [__tmp_hashmod]
regex: 2
首先通过 hashmod
操作对 instance
标签进去哈希操作,将取模后的值存储在临时标签 __tmp_hashmod
中,然后通过第二个 keep
操作,只保留分片数为 2 的指标,这样就达到了分片的目的。
到这里我们基本上就了解了 relabeling 的使用,接下来我们可以来了解下服务发现在 Prometheus 中的使用。