prometheus配置文件動態管理
由於Prometheus是“拉”的方式主動監測,所以需要在server端指定被監控節點的列表。當被監控的節點增多之后,每次增加節點都需要更改配置文件,非常麻煩,我這里用consul-template+consul動態生成配置文件,這種方式同樣適用於其他需要頻繁更改配置文件的服務。另外一種解決方案是etcd+confd,基本現在主流的動態配置系統分這兩大陣營。consul-template的定位和confd差不多,不過它是consul自家推出的模板系統。
1.普通實現方法
先看下普通配置下Prometheus的配置文件樣例:
- job_name: 'node-exporter'
static_configs:
- targets: ['10.167.202.10:9100']
labels:
hostname: 'web1'
- targets: ['10.167.202.11:9100']
labels:
hostname: 'web2'
- targets: ['10.167.202.12:9100']
labels:
hostname: 'web3'
2. file_sd_config實現方法
每次新加監控節點的時候,只需要添加一個新的targets即可,“hostname”是我自定義的一個label標簽,方便區分。
當targets的數量達到幾百上千之后,就產生一個問題,配置文件看起來就會特別冗余。所以有經驗的運維人就會想到用include的方式,把其他的配置文件包含進來,這樣就把一個大而冗余的主配置文件,切分成一個個小的配置文件。Prometheus這里用的方法就是基於文件的服務發現--"file_sd_config"。我這里在prometheus下面新建了一個conf.d的目錄,包含兩個子配置文件,分別監控不同系統的機器,linux和windows的機器:
在prometheus.yml中加入如下的配置
- job_name: 'linuxnode-discorvery'
file_sd_configs:
- files:
- /apps/prometheus/conf.d/linuxnode-discovery.json
- job_name: 'windowsnode-discorvery'
file_sd_configs:
- files:
- /apps/prometheus/conf.d/windowsnode-discovery.json
file_sd_config參考樣例
子配置文件可以是YAML或JSON格式,我這里用的JSON格式,示例如下:
cat conf.d/lnode-discovery.json
[
{
"targets": ["10.167.202.235:9100"],
"labels": {
"hostname": "test-01"
}
},
{
"targets": ["10.167.202.199:9100"],
"labels": {
"hostname": "test-02"
}
}
]
啟動服務后,如下:


以后添加節點,編輯對應的json文件即可,不用重啟服務。