本文将对Prometheus的任务配置进行详细介绍,阅读本文可以了解到如何通过配置任务获取到需要的实例信息。
任务与实例,是Prometheus监控中经常会提到的词汇。在其术语中,每一个提供样本数据的端点称为一个实例(instance),它可以是各种Exporter,如node-exporter、mysql-exporter,也可以是你自己开发的一个服务。只要提供符合prometheus要求的数据格式 ,并允许通过HTTP请求获取信息的端点都可称为实例。而对于实例数据的采集,则是通过一个个任务(job)来进行管理,每个Job会管理一类相同业务的实例。
在前面部署安装一节中,我们对Prometheus的配置文件promehteus.yml进行过介绍,其中scrape_configs模块即是管理Job的配置。
如下是Prometheus默认配置的Job,用于获取Prometheus自身的状态信息,这是一个格式最精简的Job。
scrape_configs:
- job_name: ‘prometheus‘
static_configs:
- targets: [‘localhost:9090‘]
可以在Targets页面看到相关的任务实例,其中Endpoint项代表该实例的采集地址;State项为实例状态,状态为UP表示可正常采集;Labels为实例所拥有的标签 ,标签会包含在获取到的所有时间序列中。
Job配置
Job_name
Job_name定义了该job的名称,这会生成一个标签{job="prometheus"},并插入到该任务所有获取指标的标签列中。在Prometheus表达式浏览器中查询 {job="prometheus"},可看到与该job相关的指标。
此外,Job也支持自定义标签的方式。如下所示,将在该Job获取的指标中添加{group="dev"}的标签。
scrape_configs:
- job_name: ‘prometheus‘
static_configs:
- targets: [‘localhost:9090‘]
labels:
group: ‘dev‘
配置完成后,重启Prometheus可看到标签?已生效。
注意:修改Job后,只对新获取数据生效,原有数据不会有变化 。
static_configs(静态配置)
static_configs为静态配置,需要手动在配置文件填写targets的目标信息,格式为域名/IP +?端口号。当有多个目标实例时,书写格式如下 :
scrape_configs:
- job_name: ‘myjob‘
static_configs:
- targets:
- ‘192.168.0.1:9100‘
- ‘192.168.0.2:9100‘
- ‘192.168.0.3:9100‘
$ vi /opt/prom/nodex-info.yml
- targets:
- ‘192.168.0.1:9100‘
- ‘192.168.0.2:9100‘
- ‘192.168.0.3:9100‘
scrape_configs:
- job_name: ‘myjob‘
file_sd_configs:
- files:
- /opt/prom/nodex-info.yml
scrape_interval和scrape_timeout
scrape_configs:
- job_name: ‘myjob‘
scrape_interval: 15s
scrape_timeout: 10s
static_configs:
- targets: [‘192.168.0.1:9100‘]
注意:scrape_timeout时间不能大于scrape_interval,否则Prometheus将会报错。
metric_path
指定抓取路径,可以不配置,默认为/metrics。
示例:
scrape_configs:
- job_name: ‘myjob‘
metric_path:/metrics
static_configs:
- targets: [‘192.168.0.1:9100‘]
scheme
指定采集使用的协议,http或者https,默认为http。
示例:
scrape_configs:
- job_name: ‘myjob‘
scheme: http
static_configs:
- targets: [‘192.168.0.1:9100‘]
params
某些特殊的exporter需要在请求中携带url参数,如Blackbox_exporter ,可以通过params进行相关参数配置。
示例:
scrape_configs:
- job_name: ‘myjob‘
params:
module: [http_2xx]
static_configs:
- targets: [‘192.168.0.1:9100‘]
basic_auth
默认情况下,exporter不需要账号密码即可获取到相关的监控数据。在某此安全程度较高的场景下,可能验证通过后才可获取exporter信息,此时可通过basic_auth配置Prometheus的获取exporter信息时使用的账密。
scrape_configs:
- job_name: ‘myjob‘
static_configs:
- targets: [‘192.168.0.1:9100‘]
basic_auth:
username: alex
password: mypassword
relabel_config
用于配置标签重写(Relabeling),在拉取(scraping)阶段前,修改target和它的labels。这是Job配置中最复杂的部分,但Relabeling在实际应用非常有用,值得认真了解。
默认情况下,Prometheus加载targets后,都会包含一些默认的标签,其中以__作为前置的标签是在系统内部使用的,因此这些标签不会写入到样本数据中。
如:
target的job标签设置为配置文件里的job_name的值;
__address__设置为配置里的targets的值;
而instance标签的值,是重定义标签操作之后__address__的值;
__scheme__和__metrics_path__标签的值,也是从配置里取值的;
#源标签,需要在现有标签中已存在
[ source_labels: ‘[‘ <labelname> [, ...] ‘]‘ ]
# 多个源标签的分隔符;
[ separator: <string> | default = ; ]
# 要替换的目标标签;
[ target_label: <labelname> ]
# 正则表达式,用于匹配源标签的值
[ regex: <regex> | default = (.*) ]
# 源标签值取hash的模块;
[ modulus: <uint64> ]
# 当正则表达式匹配时,用于替换的值,$1代替正则匹配到的值;
[ replacement: <string> | default = $1 ]
# 基于正则匹配的动作
[ action: <relabel_action> | default = replace ]
其中,相关的action类型有如下几种:
replace: 正则匹配源标签的值用来替换目标标签,如果有replacement,使用replacement替换目标标签;
keep:? ?如果正则没有匹配到源标签的值,删除该targets ,不进行采集;
drop:? ?与keep相反,正则匹配到源标签,删除该targets;
labelmap: 正则匹配所有标签名,将匹配的标签值部分做为新标签名,原标签值做为新标签的值;
labeldrop: 正则匹配所有标签名,匹配则移除标签;
labelkeep: 正则匹配所有标签名,不匹配的标签会被移除;
注意:重定义标签并应用后,__开头的标签会被删除;要临时存储值用于下一阶段的处理,使用__tmp开头的标签名,这种标签不会被Prometheus使用;
?
scrape_configs:
- job_name: ‘myjob‘
static_configs:
- targets:
- ‘10.12.61.1:9100‘
labels:
__machine_hostname__: ‘node-01‘
__machine_idc__: ‘idc-01‘
- targets:
- ‘10.12.61.2:9100‘
labels:
__machine_hostname__: ‘node-02‘
__machine_idc__: ‘idc-02‘
replace操作
将__machine_hostname__的值替换到新标签hostname
scrape_configs:
- job_name: ‘myjob‘
static_configs:
- targets:
- ‘10.12.61.1:9100‘
labels:
__machine_hostname__: ‘node-01‘
__machine_idc__: ‘idc-01‘
- targets:
- ‘10.12.61.2:9100‘
labels:
__machine_hostname__: ‘node-02‘
__machine_idc__: ‘idc-02‘
relabel_configs:
- source_labels: [__machine_hostname__]
regex: "(.*)"
target_label: "hostname"
action: replace
replacement: ‘$1‘
重启Prometheus后,查看target信息如下:
如果将上面配置的action改为drop,则结果相反,将删除正则匹配到标签的实例。
?
keep操作
排除标签值不匹配正则的targets?目标,此处正则匹配__machine_hostname__: ‘node-01‘ 。
scrape_configs:
- job_name: ‘myjob‘
static_configs:
- targets:
- ‘10.12.61.1:9100‘
labels:
__machine_hostname__: ‘node-01‘
__machine_idc__: ‘idc-01‘
- targets:
- ‘10.12.61.2:9100‘
labels:
__machine_hostname__: ‘node-02‘
__machine_idc__: ‘idc-02‘
relabel_configs:
- source_labels: [__machine_hostname__]
regex: "(.*)-01"
target_label: "hostname"
action: keep
replacement: ‘$1‘
如果将上面配置的action改为drop,则结果相反,将删除正则匹配到标签的实例。
?
labelmap操作
重写新的标签hostname和idc,使用原有__machine_hostname__和__machine_idc__标签的值。
scrape_configs:
- job_name: ‘myjob‘
static_configs:
- targets:
- ‘10.12.61.1:9100‘
labels:
__machine_hostname__: ‘node-01‘
__machine_idc__: ‘idc-01‘
- targets:
- ‘10.12.61.2:9100‘
labels:
__machine_hostname__: ‘node-02‘
__machine_idc__: ‘idc-02‘
relabel_configs:
- action: labelmap
regex: __machine_(.+)__
查看target信息,可看到重写的新标签。