1. 配置文件说明

Prometheus可以通过命令行或者配置文件的方式对服务进行配置。

  • 命令行方式一般用于不可变的系统参数配置,例如存储位置、要保留在磁盘和内存中的数据量等;配置文件用于定义与数据动态获取相关的配置选项和文件等内容。
  • 命令行方式的配置属性可以通过 prometheus -h 的方式来获取,这些配置属性主要在服务启动时候设置
  • 配置文件方式,需要在prometheus.yml 文件中修改配置属性,该配置文件的内容是以YAML格式编写的

官方文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/

  • 默认情况下,prometheus的配置文件由4部分组成,效果如下:
[root@cs7 node_exporter]# egrep -v '^#|^$' prometheus.yml
global:
 scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
 evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
 # scrape_timeout is set to the global default (10s).
alerting:
 alertmanagers:
 - static_configs:
 - targets:
rule_files:
scrape_configs:
 - job_name: 'prometheus'
 static_configs:
 - targets: ['localhost:9090']





scrape_interval: 15s #采集目标主机监控据的时间间隔

scrape_timeout: 10s #数据采集超时时间,默认10s

evaluation_interval: 1m #查看规则的时间间隔,默认是1m

  • 配置解析

#核心配置:

global #全局配置内容

alerting #触发告警相关的配置,主要是与Alertmanager相关的设置。

rule_files #各种各样的外置规则文件配置,包含了各种告警表达式、数据查询表达式等

scrape_configs #监控项的配置列表,这是最核心的配置

#除了默认的四项配置之外,prometheus还有另外可选的其它配置如下

#扩展配置(8项) 
tls_config、static_config、relabel_config、metric_relabel_configs、 
alert_relabel_configs、alertmanager_config、remote_write、remote_read
#平台集成配置(12项) 
azure_sd_config、consul_sd_config、dns_sd_config、ec2_sd_config、 
openstack_sd_config、file_sd_config、gce_sd_config、kubernetes_sd_config、 
marathon_sd_config、nerve_sd_config、serverset_sd_config、triton_sd_config
  • scrape_configs 管理

scrape_configs 是操作最多的一个配置段,它指定了一组监控目标及其细节配置参数,这些目标和参数描述了如何获取指定主机上的时序数据。配置样例如下:

scrape_configs:
 - job_name: '<job_name>'
 static_configs:
 - targets: [ '<host_ip:host_port>', ... ]
 labels: { <labelname>: <labelvalue> ... }

#配置解析: #在一般情况下,一个scrape_configs配置需要指定一个或者多个job,

根据我们之前对基本概念的了解,每一个job都是一系列的instance集合,借助job我们可以将目标主机进行分组管理。

#对于job内部的每一个instance的配置,都需要借助于static_configs参数获取目标列表,

只要在该列表位置的目标,都可以被Prometheus动态服务自动发现。

#static_configs可以借助于 targets 以ip+port 方式发现目标,也可以使用labels以标签方式发现目标。

语法检查

[root@prometheus ~]#promtool check config
/usr/local/prometheus/conf/prometheus.yml

2. 标签简介



标签功能: 用于对数据分组和分类,利用标签可以将数据进行过滤筛选

标签的常见场景:

  • 删除不必要的指标
  • 从指标中删除敏感或不需要的标签
  • 添加、编辑或修改指标的标签值或标签格式

标签分类:

  • 默认标签: Prometheus 自身内置
  • 形式: __keyname__
  • 应用标签: 应用本身内置
  • 形式: keyname
  • 自定义标签: 用户定义
  • 形式: keyname

范例: 添加主机节点

#编辑prometheus.yml配置文件 scrape_configs:
 ...
 - job_name: "prometheus"
 static_configs:
 - targets: ['10.0.0.101:9100']
 - job_name: 'node_exporter'
 static_configs:
 - targets: ['10.0.0.104:9100','10.0.0.105:9100','10.0.0.106:9100']
#- '10.0.0.104:9100' #或者下面格式 #- '10.0.0.105:9100'
#- '10.0.0.106:9100'
#配置解析:static_configs 用于手工定制要监控的target 
#重启服务
systemctl restart prometheus.service

#查看效果,可以看到如下的内置的标签

  • 应用默认的标签如下形式

范例:添加主机标签

#编辑prometheus.yml配置文件
[root@cs7 node_exporter]# cat prometheus.yml 
global:
 scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
 evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is `every 1 minute.
alerting:
 alertmanagers:
 - static_configs:
 - targets:
rule_files:
scrape_configs:
 - job_name: "prometheus"
 static_configs:
 - targets: ["localhost:9090"]
 - job_name: "pushgateway"
 static_configs:
 - targets: ["192.168.225.167:9091"]
 - job_name: 'node_exporter' #添加以下行,指定监控的node exporter节点
 metrics_path: '/metrics'
 static_configs:
 - targets: ['192.168.225.167:9100'] 
 - targets: ['192.168.225.112:9100'] 
 - targets: ['192.168.225.113:9100'] 
 - targets: ['192.168.225.114:9100'] 
 #labels: {"app": "node_exporter"} 也可以使用这种方式添加标签
 labels: 
 name: shibosen
 class: m49
#重启服务
[root@prometheus ~]#systemctl restart prometheus.service 
#浏览器访问确认



3. 标签管理

官方文档

https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config

https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs

Prometheus对数据的处理流程是:

先从各目标节点上获取数据,然后对数据进行本地化处理,然后进行各种数据分析。这个流程中最核心的就是监控数据的本地化处理

在prometheus的配置选项中,有两个与监控指标密切相关的配置,relabel_config、 metric_relabel_configs,他们的作用就是监控目标上面的监控项进行标签管理和设置,便于在prometheus上设置更灵活的时序数据。

标签主要有两种表现形式:

  • 私有标签

私有标签以"__*"样式存在,用于获取监控目标的默认元数据属性,比如__address__用于获取目标的

地址,__scheme__用户获取目标的请求协议方法,__metrics_path__获取请求的url地址等

  • 普通标签

对个监控主机节点上的监控指标进行各种灵活的管理操作,常见的操作有,删除不必要|敏感指标,

添加、编辑或者修改指标的标签值或者标签格式。

对于一些全局性的标签,可以在global部分通过属性来设置,效果如下:

global: ...

# 与外部系统通信时添加到任何时间序列或警报的标签 external_labels:
 [ <labelname>: <labelvalue> ... ]
relabel_config、metric_relabel_configs 的使用格式基本上一致,虽然他们有很多配置,但是我们使用 的最多的也就那么三四个。
 #配置示例如下: scrape_configs:
 - job_name: 'prometheus'
 metric_relabel_configs:
 - source_labels: [<labelname> [, ...]]
 regex: '<regex> | default = (.*)'
 replacement: '<string> | default = $1'
 target_label: '<labelname>'
 action: '<relabel_action> | default = replace'
#属性解析: 
source_labels #指定正则表达式匹配成功的Label进行标签管理
regex #source_labels对应Label的匹配正则表达式的指定值
target_label #在进行标签替换的时候,可以将原来的source_labels替换为指定修改后的
label 
replacement #替换标签时,指定label对应的值进行修改后的值
action #对标签进行管理,常见的动作有replace|keep|drop|labelmap|labeldrop
等
 
 
#动作解析:
labeldrop #删除regex匹配的标签label
labelkeep #删除regex不匹配的标签label
labelmap #将regex对所有的标签名进行匹配,而后将匹配到的标签的值赋给replacement字段指定的标签名的值;通常用于取出匹配的标签名的一部分生成新标签,旧的标签仍会存在
replace #此为默认值,通过regex匹配source_label的值,使用replacement来进行替换
keep #从获取的监控数据中删除与regex不匹配的目标 source_labels
drop #从获取的监控数据中删除与regex匹配的目标 source_labels
范例:
#删除示例 metric_relabel_configs:
- source_labels: [__name__] #匹配标签
 regex: 'node_network_receive.*' #匹配标签值
 action: drop
#替换示例 metric_relabel_configs: - source_labels: [id]
 regex: '/.*'
 replacement: '123456'
 target_label: replace_id
  • 指标抓取的生命周期

下图展示了Prometheus上进行指标抓取的简单生命周期

在每个scrape_interval(抓取周期)期间,Prometheus都会检查执行的作业(Job);这些作业首先会根据Job上指定的发现配置生成target列表,此即服务发现过程;

#1 服务发现会返回一个Target列表,其中包含一组称为元数据的标签,这些标签都以"_ _medata_"为前缀;

#2 服务发现还会根据目标配置来设置其它标签,这些标签带有“__”前缀和后缀,包括

“__scheme__”、“__address__”和“__metrics_path__”,分别保存有target支持使用协议(http或 https,默认为http)、target的地址及指标的URI路径(默认为/metrics);

#3 若URI路径中存在任何参数,则它们的前缀会设置为“__param_”

#4 这些目标列表和标签会返回给Prometheus,其中的一些标签也可以配置中被覆盖;

配置标签会在抓取的生命周期中被重复利用以生成其他标签,例如,指标上的instance标签的默认值就来自于__address__标签值;



第一个relabe_configs就是对target自身的标签重新标记,常见的target的标签有2个:instance和job,抓取前重新标记

第二个metric_relable_configs是对target抓取后的标签重新标记;

  • 配置区别

relabel_config、metric_relabel_configs这两个配置虽然在作用上类似,但是他们还是有本质上的区别 的,这些区别体现在两个方面:执行顺序和数据处理上。


区别

解析

执行顺序

relabel_configs用与发现目标前的标签设置,也就是说在scrape_configs前生效,针对的target对象的标签

metric_relabel_configs 作用于scrape_configs生效后,即针对target对象上的监控数据的标签

数据处理

metric_relabel_configs 是 prometheus 在保存数据前的最后一步标签重新编辑,默认情况下,它将监控不需要的数据,直接丢掉,不在prometheus 中保存


4. 案例

4.1 relabel_configs

对target重新打标是在数据抓取之前动态重写target标签的强大工具,在每个数据抓取配置中,可以定义多个relabel步骤,它们将按照定义的顺序依次执行;

◆ 对于发现的每个target,Prometheus默认会执行如下操作

 job的标签设定为其所属的job_name的值;

 __address__标签的值为该target的套接字地址“<host>:<port>”

 instance标签的值为__address__的值;

 __scheme__标签的值为抓取该target上指标时使用的协议(http或https);

 __metrics_path__标签的值为抓取该target上的指标时使用URI路径,默认为/metrics;

 __param_<name>标签的值为传递的URL参数中第一个名称为<name>的参数的值;

◆ 重新标记期间,还可以使用该target上以“___meta_”开头的元标签;

 各服务发现机制为其target添加的元标签会有所不同;

◆ 重新标记完成后,该target上以“__”开头的所有标签都会被移除;

 若在relabel的过程中需要临时存储标签值,则要使用__tmp标签名称为前缀进行保存,以避免同Prometheus的内建标签冲突;

4.1.1 修改新增标签或者已有标签的值---replace

#编辑prometheus.yml配置文件
[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml 
scrape_configs:
...
 - job_name: 'k8s-node'
 static_configs:
 - targets: ['192.168.225.167:9100']
 - targets: ['192.168.225.112:9100']
 - targets: ['192.168.225.113:9100']
 - targets: ['192.168.225.114:9100']
 labels:
 name: shibosen
 class: m49
 relabel_configs:
 - source_labels: #匹配3个已有的标签
 - __scheme__
 - __address__
 - __metrics_path__
 regex: "(http|https)(.*)" #使用正则表达式过滤http或https,后面是任意字符,并分组
 separator: "" #默认使用封号连接$1和$2,此处使用空则表示不使用任何符号
 target_label: "endpoint" #如果原来有endpoint这个标签,那么就替换他的值为$1://$2,如果没有就新建
 replacement: "${1}://${2}"
 action: replace
#配置解析:separator 是设定拼接的时候用到的分隔符,我们这里不用设置任何符号
#重启服务
[root@prometheus ~]#systemctl restart prometheus.service

#浏览器查看效果

#结果显示:基于默认的属性重写了一个新的标签。

  • 未修改前



  • 修改后



4.1.2 基于已经存在的标签匹配,改名后删除原有的标签--labelmap&&labeldrop

#编辑prometheus.yml配置文件

[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml 
scrape_configs:
...
 static_configs:
 - targets: ['192.168.225.167:9100']
 - targets: ['192.168.225.112:9100']
 - targets: ['192.168.225.113:9100']
 - targets: ['192.168.225.114:9100']
 labels: {app: 'k8s-node'}
 relabel_configs:
 - source_labels:
 - __scheme__
 - __address__
 - __metrics_path__
 regex: "(http|https)(.*)"
 separator: ""
 target_label: "endpoint"
 replacement: "${1}://${2}"
 action: replace
- regex: "(class|app)" #加下面三行,所有名为class或app的标签修改标签名称,但旧的标签还会存在
 replacement: ${1}_name
 action: labelmap
 - regex: "(class|app)" #加下面两行,则删除旧的标签,注意上面修改和此删除的前后顺序
 action: labeldrop
#配置解析:第一条规则基于现有的匹配内容重写标签名称,第二条规则,删除旧标签的名称 
#重启服务
[root@prometheus ~]#systemctl restart prometheus.service
#查看效果

#如下结果显示:第二条规则中,匹配到的标签就移除掉了

  • 为修改前



  • 修改后



4.1.3 删除target---drop

[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml 
scrape_configs:
...
 static_configs:
 - targets: ['192.168.225.167:9100']
 - targets: ['192.168.225.112:9100']
 - targets: ['192.168.225.113:9100']
 - targets: ['192.168.225.114:9100']
 labels: {app: 'k8s-node'}
 relabel_configs:
 - source_labels:
 - __scheme__
 - __address__
 - __metrics_path__
 regex: "(http|https)(.*)"
 separator: ""
 target_label: "endpoint"
 replacement: "${1}://${2}"
 action: replace
 - regex: "(class|app)" #加下面三行,所有名为class或app的标签修改标签名称,但旧的标签还会存在
 replacement: ${1}_name
 action: labelmap
 - regex: "(class|app)" #加下面两行,则删除旧的标签,注意上面修改和此删除的前后顺序
 action: labeldrop
 - source_labels:
 - __address__ #注意,此处的下划线左右都是2个,不是1个
 regex: "192.168.225.167:9100"
 action: drop
  • 修改前



  • 修改后



需要注意的是:上面的几个范例都是修改的target的标签,也就是在修改抓取metrics之前的标签

4.2 metric_relabel_configs

对metric重新打标是在数据抓取之后动态重写metric标签的工具,在每个数据抓取配置中,可以定义多个metric relabel的步骤,它们将按照定义的顺序依次执行;

  • 删除不必要的指标;
  • 从指标中删除敏感或不需要的标签;
  • 添加、编辑或修改指标的标签值或标签格式;

对metric重新打标的配置格式与target重新打标的格式相同,但前者要定义在专用的metric_relabel_configs字段中;

但是要注意的是,更改或添加标签会创建新的时间序列;

  • 应该明确地使用各个标签,并尽可能保持不变,以避免创建出一个动态的数据环境;
  • 标签是时间序列的唯一性约束,删除标签并导致时间序列重复时,可能会导致系统出现问题;

需要注意的是,对target重新打标和对metrics的操作方式和语法都是一致的,只不过前者是在relabel_configs下面操作,而后者是在metrics_relabel_configs下面操作

4.2.1 metric relabel之drop(删除指标)

在source_labels字段上,通过指标上元标签“name”引用指标名称,而后由regex(正则表达式)进行匹配判定,可使用drop action删除匹配的指标,或使用keep action仅保留匹配的指标;

◆ 下面的示例,用于在相应的job上,在发现的各target之上,删除以“go_info”为前名称前缀的指标

[root@prometheus ~]#vim /usr/local/prometheus/conf/prometheus.yml 
scrape_configs:
...
 static_configs:
 - targets: ['192.168.225.167:9100']
 - targets: ['192.168.225.112:9100']
 - targets: ['192.168.225.113:9100']
 - targets: ['192.168.225.114:9100']
 labels: {app: 'k8s-node'}
 relabel_configs:
 - source_labels:
 - __scheme__
 - __address__
 - __metrics_path__
 regex: "(http|https)(.*)"
 separator: ""
 target_label: "endpoint"
 replacement: "${1}://${2}"
 action: replace
 - regex: "(class|app)" #加下面三行,所有名为class或app的标签修改标签名称,但旧的标签还会存在
 replacement: ${1}_name
 action: labelmap
 - regex: "(class|app)" #加下面两行,则删除旧的标签,注意上面修改和此删除的前后顺序
 action: labeldrop
 - source_labels:
 - __address__ #注意,此处的下划线左右都是2个,不是1个
 regex: "192.168.225.167:9100"
 action: drop
 metric_relabel_configs:
 - source_labels:
 - __name__
 regex: "go_info.*" #匹配以go_info为前缀的指标
 action: drop

下面的第一个图为执行go_info为前缀的指标删除之前的查询结果,而第二个图则是删除相关指标之后的查询结果;

  • 提示:若删除的指标此前曾由Prometheus抓取并存储过相关的样本数据,则删除操作的需要经过一定的时长后才会反映至查询结果中;



5. relabel_action详解

<relabel_action>字段用于定义重新标记的行为,其可用取值如下

⚫ replace:首先将source_labels中指定的各标签的值进行串连,而后将regex字段中的正则表达式对源标签值进行匹配判定,若匹配,则将target_label字段中指定的标签的值替换为replacement字段中保存的值;✓ replacement可按需引用保存regex中的某个“分组模式”匹配到的值;默认保存整个regex匹配到的内容;✓ 进行值替换时,replacememnt字段中指定标签的值也支持以分组格式进行引用;

⚫ hashmod:将target_label的值设置为一个hash值,该hash则由modules字段指定的hash模对块对source_labels上各标签的串连值进行hash计算生成; 删除指标:该处的每个指标名称对应一个target

⚫ keep:regex 不能匹配到target上的source_labels上的 各标签的串连值时,则删除该target;(仅用于relabel_configs)

⚫ drop:regex 能够匹配到target上的source_labels上的 各标签的串连值时,则删除该target;(仅用于relabel_configs)创建或删除指标标签

⚫ labelmap:将regex对所有的 标签名进行匹配判定,而后将匹配到的标签的值赋给replacement字段指定的标签名之上;通常用于取出匹配的标签名的一部分生成新标签;

⚫ labeldrop:将regex对所有的标签名进行匹配判定,能够匹配到的标签将从该target的标签集中删除;

⚫ labelkeep:将regex对所有的标签名进行匹配判定,不能匹配到的标签将从该target的标签集中删除;

◆ 注意:要确保在labeldrop或labelkeep操作后,余下的标签集依然能惟一标识该指标