看完之前说的prometheus的监控大家对prometheus有些简单的了解,本次说一下prometheus的高级用法标签重写
Relabel概念
relabel顾明思意,就是标签重写,可以允许用户重写标签或者针对标签做一些过滤操作,prometheus中的relabel有三种应用范围和工作时段不一样,这里我们主要说一下relabel_config:
- relabel_configs:再被prometheus抓取之前修改,针对的是target
- metric_relabel_configs:在被prometheus存储之前修改,针对的是metric
- alet_relabel_configs:在被发送到aletmanager之前,针对的是alert
- write_relabel_configs:写到远程存储的样本
在篇日志监控目标时我们更多的会使用relabel_configs和metric_relabel_configs配置,采集数据之前,通过relabel_configs来采集数据,写入存储之前,通过metric_relabel_configs进行配置。
隐藏的标签
以双下划线__开头的标签属于特殊标签,它们在重新标记后会被删除,标记对象的来源最初可以附加这些隐藏的标签,已提供关于标记对象的额外元数据,这些特殊的标签可以在reladeling阶段被用来对对象的标签进行修改,对于抓取指标,其中就会包含一些隐藏的标签,可以用来空置目标应该如何被抓取:
__address__ 被抓取目标的地址
__scheme__ 抓取目标的请求模式,包括 http 与 https,默认为 http。
__metrics_path__ 表示用于采集指标的 HTTP 路径,默认为 /metrics。
__param_<name> 包含 HTTP 查询参数名称和它们的值。
此外,服务发现机制也可以提供一组以__mate__开头的标签,包含关于目标的特定发现元数据,列如,当发现k8s集群中的pod时,k8s服务发现引擎会将每个pod目标提供一个 __meta_kubernetes_pod_name
的标签,包含被发现的pod名字,以及一个__meta_kubernetes_pod_ready
的标签,表面pod是否处于就绪状态。
Relabeling规则
规则组成
Relabeling规则主要由以下的一些配置属性组成:
- action:执行relabel动作
- replace:替换标签值,是默认action
- keep:满足特定条件的实例对象进行采集,其他的不采集
- drop:满足特定条件的实例不采集,其它的采集
- labeldrop:对抓取的实例特定标签进行删除,其它的标签保留
- labelkeep:对抓取的实例特定标签进行保留,其它的标签删除
- labelmap:将源标签的值映射到移速新的标签中去
- hashmod:对服务的整体目标进行分片
- separator:分割符,一个字符串用于在连接源标签source_labels是分割它们,默认为;号,“”为空
- source_labels:源标签,使用配置的分隔符串联的标签名称列表,并与提供的正则表达式进行匹配
- target_label:目标标签,当使用replace或者hashmod动作时,自定义的标签名称
- regex:正则表达式,用于匹配串联的源标签,默认为(.*),匹配任何源标签
- modulus:模数,串联的标签哈希值的模,主要用于prometheus的水平分片
- replacement:写在目标标签上,它可以参照有regex捕获的正则表达式捕获组,自定义标签的值
一个replace动作的规则配置方式如下所示:
action: replace
source_labels: [<source label name list>]
separator: <source labels separator> # 默认为 ';'
regex: <regular expression> # 默认为 '(.*)' (匹配任何值))
replacement: <replacement string> # 默认为 '$1' (使用第一个捕获组作为 replacement)
target_label: <target label>
该操作按顺序以下步骤执行:
- separator 分隔符将 source_labels 中的标签列表值连接起来
- regex 正则表达式与上一步连接的字符串进行匹配
- replacement 引用上面的regex正则表达式捕获组,通过($1, $2, …)将它们的值进行替换
- 把经过正则表达式替换的 replacement 字符串作为 target_label 标签的新值存储起来
replace操作的示例
设置一个固定的标签值:最简单的replace例子就是讲一个标签设置为一个固定的值,比如你可以吧env标签设置为production
action: replace
replacement: production
target_label: env
这里将替换后的字符串production做为target_label 标签env的新值存储起来,也就是将env标签的值设置为prodution
替换标签的值:如下示例是重写一个备注取任务实例的端口,我们可以用一个固定的9100端口来替换__address__标签的端口:
- job_name: 'nodes'
file_sd_configs:
- files:
- lhl/node.yaml
relabel_configs:
- action: replace
source_labels: ["__address__"]
regex: ([^:]+)(?::\d+)? # 第一个捕获组匹配的是 host,第二个匹配的是 port 端口。
replacement: "${1}:9100"
target_label: tset
