使用场景:
私有云物理装机项目,使用prometheus node_exporter 监控物理机cpu,磁盘,内存,tcp,网络等运行指标,动态的添加node_exporter 指标采集地址
软件环境
consul注册中心、prometheus node_exporter、 prometheus
consul-template:Consul-Template可以查询Consul中的服务目录、Key、Key-values等,搭配ctmpl 模板,已守护线程的方式动态更新 文件。比如nginx配置;下载地址https://releases.hashicorp.com/consul-template/,下载后解压就是单独的consul-template可运行文件
实现:
prometheus.yml添加配置
job_name: 'linuxnode-discorvery' #json 文件动态设置,prometheus会动态加载此json文件种的配置
file_sd_configs:
- files:
- /apps/prometheus/conf.d/*.json
refresh_interval: 10s
prometheus ctmpl 模板文件:
[
{$ range tree "prometheus/node" $}
{
"targets": ["{$ .Value $}"],
"labels": {
"instance": "{$ .Key $}",
}
},
{$ end $}
{}
]
最终效果
[
{
"targets": ["10.20.3.44:10206"],
"labels": {
"host": "10.20.3.44:10205"
}
},
]
consul-template.conf文件:
log_level = "warn"
syslog { # 启用syslog,这样服务日志可以记录到syslog里
enabled = true
# This is the name of the syslog facility to log to.
facility = "LOCAL5"
}
consul {
# auth {
# enabled = true
# username = "test"
# password = "test"
# }
address = "" #consul地址
# token = "abcd1234"
retry {
enabled = true
attempts = 12
backoff = "250ms" #backoff设置时间间隔,当未从consul获取到数据时会进行重试,并以2的倍数的时间间隔进行。比如设置250ms,重试5次
# If max_backoff is set to 10s and backoff is set to 1s, sleep times
# would be: 1s, 2s, 4s, 8s, 10s, 10s, ...
#max_backoff = "3m"
}
}
template {
source = "/home/runtime/prometheus/node.ctmpl" #模板文件地址
destination = "/home/runtime/prometheus/node.json" #输出的文件路径
command = "" #文件渲染成功之后需要执行的命令。prometheus这里会自动发现文件的更改,所以我这里无需任何命令,给注释掉了。像nginx、haproxy之类的服务,一般更改完配置文件之后都需要重启,这里可以设置“nginx -s reload”之类的命令
command_timeout = "60s"
backup = true #当backup=true的时候,会备份上一次的配置,并以bak后缀结尾
left_delimiter = "{$"
right_delimiter = "$}" #模板文件中分隔符。默认是用“{{}}”设置模板,当产生冲突的时候可以更改这里的设置。比如我这里由于用ansible去推送的模板文件,“{{}}”符号与Jinja2的语法产生了冲突,所以改为了“{$$}”符号
wait {
min = "2s"
max = "20s"
}}
启动consul-template
consul-template -config ./consul-template.conf