relabel顾名思义,就是标签重写,可以允许用户重写标签或者针对标签做一些过滤操作,Prometheus中的relabel有如下三种,应用范围和工作时段不一样,这里主要介绍relabel_config:
relabel_config
在被prometheus抓取之前修改,针对的是targetmetric_relabel_configs
在被prometheus存储之前修改,针对的是Metricalert_relabel_configs
在被发送到alertmanager之前,针对的是alertwrite_relabel_configs
写到远程存储的样本在配置监控目标的时我们更多的会使用
relabel_configs
和metric_relabel_configs
配置,采集数据之前,通过relabel_configs
来采集数据,写入存储之前,通过metric_relabel_configs
进行配置。
以双下划线__
开头的标签属于特殊的标签,它们在重新标记后会被删除,标记对象的来源最初可以附加这些隐藏的标签,以提供关于标记对象的额外元数据,这些特殊的标签可以在 relabeling 阶段被用来对对象的标签进行修改,对于抓取指标,其中就包含一些隐藏的标签,可以用来控制目标应该如何被抓取:
__address__ 被抓取目标的地址
__scheme__ 抓取目标的请求模式,包括 http 与 https,默认为 http。
__metrics_path__ 表示用于采集指标的 HTTP 路径,默认为 /metrics。
__param_包含 HTTP 查询参数名称和它们的值。
此外,服务发现机制也可以提供一组以__meta__
开头的标签,包含关于目标的特定发现元数据。例如,当发现 Kubernetes 集群中的 pod 时,Kubernetes 服务发现引擎将为每个 pod 目标提供一个 __meta_kubernetes_pod_name
的标签,包含被发现的 pod 的名字,以及一个 __meta_kubernetes_pod_ready
标签,表明 pod 是否处于就绪状态,关于服务发现生成的元标签可以查看官方文档 Configuration | Prometheus 了解更多。
Relabeling 规则主要由以下的一些配置属性组成:
action | 执行的 relabeling 动作,可选值包括 replace、keep、drop、hashmod、labelmap、labeldrop 、labelkeep,默认值为 replace |
separator | 分隔符,一个字符串,用于在连接源标签 source_labels 时分隔它们,默认为; |
source_labels | 源标签,使用配置的分隔符串联的标签名称列表,并与提供的正则表达式进行匹配 |
target_label | 目标标签,当使用 replace 或者 hashmod 动作时,应该被覆盖的标签名 |
regex | 正则表达式,用于匹配串联的源标签,默认为 (.*),匹配任何源标签 |
modulus | 模数,串联的源标签哈希值的模,主要用于 Prometheus 水平分片 |
replacement | 写在目标标签上,它可以参考由 regex 捕获的正则表达式捕获组 |
关于relabel_config的action类型说明:
replace | 设置或替换/覆盖标签值,是默认的action |
keep | 满足特定条件的实例对象进行采集,其他的不采集 |
drop | 满足特定条件的实例不采集,其他的采集 |
labeldrop | 对抓取的实例特定标签进行删除,其他的保留 |
labelkeep | 对抓取的实例特定标签进行保留,其他标签删除 |
labelmap | 将源标签的值映射到一组新的标签中去 |
hashmod |
对服务的整体目标进行分片 |
一个 replace 动作的规则配置方式如下所示:
action: replace
source_labels: [
该操作按顺序以下步骤执行:
1. separator 分隔符将 source_labels 中的标签列表值连接起来
2. regex 正则表达式与上一步连接的字符串进行匹配
3. replacement 引用上面的regex正则表达式捕获组,通过($1, $2, ...)将它们的值进行替换
4.把经过正则表达式替换的 replacement 字符串作为 target_label 标签的新值存储起来
replace 操作的示例
1)设置一个固定的标签值:最简单的 replace 例子就是将一个标签设置为一个固定的值,比如你可以把 env 标签设置为 production:
action: replace
replacement: production
target_label: env
这里将替换后的字符串 production 作为 target_label 标签 env 的新值存储起来,也就是将 env 标签的值设置为 production。
2)替换标签的值:如下示例是重写一个被抓取任务实例的端口,我们可以用一个固定的 9100端口来替换 __address__
标签的端口:
action: replace
source_labels: [__address__]
regex: ([^:]+)(?::\d+)? # 第一个捕获组匹配的是 host,第二个匹配的是 port 端口。
replacement: "$1:9100"
target_label: __address__
这里我们替换的源标签为 __address__
,然后通过正则表达式 ([^:]+)(?::\d+)?
进行匹配,这里有两个捕获组,第一个匹配的是 host($1),第二个匹配的是端口($2),所以在 replacement
字符串中我们保留第一个捕获组 $1,然后将端口更改为9100,这样就可以将 __address__
的实例端口更改为 9100 端口,然后重新写会 __address__
这个目标标签。
Relabeling 另一个常见的用例就是过滤有标签的对象,keep
或 drop
这两个动作可以来完成。
一个 keep
动作的配置规则如下所示:
action: keep
source_labels: []
separator: # 默认为 ';'
regex: # 默认为 '(.*)' (匹配任何值)
keep
操作同样按顺序执行如下步骤:
1.使用 separator 分隔符将 source_labels 中列出的标签值连接起来
2.测试 regex 中的正则表达式是否与上一步的连接字符串匹配
3.如果不匹配,该对象将从最终输出列表中删除,如果匹配,则保留该对象
keep
和 drop
的示例
1)只抓取具有注解的目标
在服务发现的时候,我们可能只想抓取那些具有特定元数据标签的目标,例如,下面的配置让我们只抓取 Kubernetes 中具有 example.io/should_be_scraped=true
这个 annotation 的目标:
action: keep
source_labels:
[__meta_kubernetes_service_annotation_example_io_should_be_scraped]
regex: true
Kubernetes 服务发现机制下面会将 labels 标签与 annotation 作为元信息输出到 Prometheus,这些元信息都包含 __meta_
前缀,这里我们的配置就是保留具有 example.io/should_be_scraped
这个 annotation 标签,且值为 true
的目标。
2)只存储特定的指标
当使用 metric_relabel_configs
来控制目标的抓取方式时,我们可以使用下面的规则来只存储指标名称以 api_
或 http_
开头的指标
action: keep
source_labels: [__name__]
regex: "(api_|http_).*"
labelmap
最常用的使用场景就是从服务发现中获取一组隐藏的或临时的元数据标签,并将它们映射到新的目标标签中,labelmap
动作的配置规则如下所示:
action: labelmap
regex: # 默认为 '(.*)'
replacement: # 默认为 '$1'
和前面的一些 action 不同,labelmap 是对标签名而不是标签值进行重新匹配和操作,labelmap 按顺序执行以下步骤:
1.将 regex 中的正则表达式与所有标签名进行匹配
2.将匹配的标签名的任何匹配值复制到由 replacement 字符串决定的新的标签名中
labelmap 示例:使用 labelmap
映射 Kubernetes Service 标签
当使用 Kubernetes 的服务发现来发现 pod 端点时,我们可能希望每个端点的最终目标标签也包含 Kubernetes Service 标签,这样可以更好的区分端点数据,Kubernetes 服务发现机制会将这些标签添加到 Prometheus 中去,标签名称格式为__meta_kubernetes_service_label_
,我们可以提取这些元数据标签中的
部分,并将相应的标签值映射到一组以 k8s_
为前缀的新标签名称上,如下所示:
action: labelmap
regex: __meta_kubernetes_service_label_(.+)
replacement: "k8s_$1"
通过上面的 labelmap
操作,regex 正则表达式中匹配标签名,然后将标签名对应的值复制到 k8s_$1
的新标签中,$1
就是匹配的标签名这个捕获组。
labelkeep
、labeldrop
—保留或删除标签有的时候我们也有保留或删除一些标签的需求,比如有的目标在时间序列上提供了许多额外的标签,这些标签用途不大,这个时候我们就可以使用 labelkeep
和 labeldrop
这两个操作,使用这两个操作可以有选择地保留或删除一些标签,labelkeep
的配置规则如下所示:
action: labelkeep
regex: # 默认为'(.*)'
labeldrop 与 labelkeep 类似,只是它是删除那些匹配正则表达式的标签而不是保留
一样 labelkeep 按顺序执行下面的步骤:
1.首先将 regex 中的正则表达式与所有标签名称进行匹配
2.它只保留那些匹配的标签