Prometheus(四)

看完之前说的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>

该操作按顺序以下步骤执行:

  1. separator 分隔符将 source_labels 中的标签列表值连接起来
  2. regex 正则表达式与上一步连接的字符串进行匹配
  3. replacement 引用上面的regex正则表达式捕获组,通过($1, $2, …)将它们的值进行替换
  4. 把经过正则表达式替换的 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
把address的标签值更改为test