📚概述
prometheus的配置都是基于文件的,不论是规则配置还是target的配置都是如此,每次新增配置和修改规则都需要操作配置文件,维护成本太高。
prometheus官方提供了多种服务发现机制。
介绍三种方式:基于静态文件、基于动态文件、基于consul的服务发现。
并介绍通过consul+confd实现规则文件动态刷新。
📗基于文件服务发现
🔖静态文件发现
静态文件发现,需要修改prometheus.yml配置文件,对于不变动的配置可以使用,例如alertmanager服务。
- job_name: "prometheus"
static_configs:
- targets: ["10.0.204.66:29090"]
- job_name: "alertmanager"
static_configs:
- targets: ["10.0.204.66:29093"]
🔖动态文件发现
🔖修改prometheus配置
基于文件的服务发现使用file_sd_configs并指定文件路径即可。文件格式可以是json格式。
- job_name: "服务器监控"
file_sd_configs:
- files:
- './node_config/*.json' # 文件路径
refresh_interval: 15s # 自动发现间隔时间,默认5m
json文件示例:
[
{
"targets": [
"192.168.124.109:9182"
],
"labels": {
"id": "ff80808183d199270183d19b682a0008",
"instance": "192.168.124.109",
"ip": "192.168.124.109",
"name": "lg测试101302",
"systemType": "WINDOWS",
"type": "server"
}
}
]
📙基于Consul服务发现
📖整理流程设计
confd原理

整理流程图

📃consul安装
🧩单机版安装
下载地址:https://developer.hashicorp.com/consul/downloads

配置acl,在consul配置文件目录下,可以读取hcl和json格式的配置文件
新增配置文件
全局配置文件:https://github.com/hashicorp/consul/blob/v1.14.3/agent/config/testdata/full-config.json
{
"datacenter": "dc1",
"data_dir": "../data",
"log_level": "INFO",
"node_name": "node1",
"server": true,
"bootstrap": true,
"client_addr": "0.0.0.0",
"bind_addr": "10.0.107.55",
"bootstrap_expect": 1,
"acl": {
"enabled": true,
"default_policy": "deny",
"enable_token_persistence": true
}
}
上传服务器,解压后启动。
# 启动
./consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0 -bind=10.0.107.55 -datacenter=dc1 -data-dir=/data/consul/data -config-dir=/data/consul/conf >> /data/consul/logs/consul.log &
参数说明:
- bootstrap-expect:集群期望的节点数,只有节点数量达到这个值才会选举leader。
- server: 运行在server模式
- data-dir:指定数据目录,其他的节点对于这个目录必须有读的权限
- node:指定节点的名称
- bind:为该节点绑定一个地址
- config-dir:指定配置文件,定义服务的,默认所有一.json结尾的文件都会读
- enable-script-checks=true:设置检查服务为可用
- datacenter: 数据中心没名称,
- join:加入到已有的集群中
- client:指定web ui、的监听地址,默认127.0.0.1只能本机访问。
启动之后,访问http://ip:8500即可
Consul端口说明:
8300:集群内数据的读写和复制
8301:单个数据中心gossip协议通讯
8302:跨数据中心gossip协议通讯
8500:提供获取服务列表、注册服务、注销服务等HTTP接口;提供UI服务
8600:采用DNS协议提供服务发现功能
📖参考资料
参考资料:
SpringCloud之consul (服务注册发现)客户端的安装与简单使用|第十三章-yellowcong_狂飙的yellowcong的博客-CSDN博客
💡服务注册与删除
🧩更新注册服务
- URL:
/v1/agent/service/register- Method:
PUT
请求参数
{
"id":"SERVER_10.0.204.143", // 服务id
"name":"node_exporter", // 服务名称
"address":"10.0.204.143", // IP地址
"port": 9100, // 端口 int类型
"tags": ["server"], // 标签
"check":{
"http":"http://10.0.204.143:9100/metrics", // 健康检查接口
"interval":"1m" // 间隔时间
},
"meta":{ // 元数据信息 可以添加map形式的额外数据,String类型
"gdmpId":"uuid-143222",
"gdmpName":"SERVER_10.0.204.143",
"gdmpType":"server",
"gdmpResItemType":"linux",
"__metrics_path__":"/metrics"
},
"token":"your_token" // consul的token
}
{
"service": {
"name": "web",
"tags": ["rails"],
"port": 80,
"checks": [{
"id": "api", // 健康检查项的id,唯一
"name": "HTTP API on port 5000", // 检查项的名字
"http": "https://localhost:5000/health", // 定期访问的Url,通过这个url请求结果确定服务是否正常
"tls_skip_verify": false, // 关闭tls验证
"method": "POST", // 设置http请求方式,默认是GET
"header": { // 可以自定义请求头,可以不配置
"x-foo": ["bar", "baz"]
},
"interval": "10s", // 定期检查的时间间隔,这里是10秒
"timeout": "1s" // 请求超时时间,1秒
}]
}
}
请求示例
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:8500/v1/agent/service/register -d '{
"id":"SERVER_10.0.204.143",
"name":"node_exporter",
"address":"10.0.204.143",
"port": 9100,
"tags": ["server"],
"check":{
"http":"http://10.0.204.143:9100/metrics",
"interval":"1m"
},
"meta":{
"gdmpId":"uuid-143222",
"gdmpName":"SERVER_10.0.204.143",
"gdmpType":"server",
"gdmpResItemType":"linux",
"__metrics_path__":"/metrics"
},
"token":"your_token"
}'
🌵删除服务
- URL:
/v1/agent/service/deregister/{serviceId}- Method:
PUT
请求参数
| 参数名 | 参数含义 |
|---|---|
| serverId | 服务ID |
请求示例
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:8500/v1/agent/service/deregister/89823324afs8jsf93sjfa
☘️prometheus配置
- job_name: '服务器监控'
consul_sd_configs:
- server: '10.0.107.55:8500'
- services: ["node_exporter"]
relabel_configs:
- source_labels: ["__meta_consul_tags"]
regex: .*server.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
说明:
- 在
consul_sd_configs定义当中通过server定义了Consul服务的访问地址,services则定义了当前需要发现哪些类型服务实例的信息,这里限定了只获取node_exporter的服务实例信息。relabel_configs可以对标签进行重新配置,regex: __meta_consul_service_metadata_(.+)主要用于将注册到consul的元数据转化为label标签source_labels通过正则匹配对于应的标签,只要符合条件的才会到【服务器监控】这个job中- action:重新标签动作
- replace:默认,通过regex匹配source_label的值,使用replacement来引用表达式匹配的分组
- keep:删除regex与连接不匹配的目标 source_labels
- drop:删除regex与连接匹配的目标 source_labels
- labeldrop:删除regex匹配的标签
- labelkeep:删除regex不匹配的标签
- hashmod:设置target_label为modulus连接的哈希值source_labels
- labelmap:匹配regex所有标签名称。然后复制匹配标签的值进行分组,replacement分组引用( 1 , {1}, 1,{2},…)替代

🎋Confd规则配置
Confd是一个轻量级的配置管理工具。通过查询后端存储,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。
对应的后端存储可以是etcd、redis、zookeeper、consul等。
github地址:https://github.com/kelseyhightower/confd
🛒confd下载
# 下载二进制包,这里最新的就是0.16.0版本,2018年发布的release版本
wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64
# 重命名二进制文件,并移动到安装的prometheus目录,/data/monitor/prometheus为prometheus安装目录
mv confd-0.16.0-linux-amd64 /data/monitor/prometheus/confd
chmod +x /data/monitor/prometheus/confd
# 验证是否安装成功
confd --help
🧵创建配置文件目录
需要在prometheus目录下进行创建
# 在prometheus目录下创建
mkdir conf.d
mkdir templates
mkdir rules

说明:
conf.d:confd的配置文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。
templates:配置模板Template,即基于不同组件的配置,模板语法格式为:Golang text templates,可参考https://github.com/kelseyhightower/confd/blob/master/docs/templates.md
新增规则到consul
使用key/Value形式新增规则到consul
接口:
- URL:
/v1/kv/prometheus/rules/{resType}/{key_id}- Method:
PUT- 说明:
- kv后就是以folder形式创建的key,有层级关系方便管理。
- 结合业务场景,设计如下:resType为资源类型,如server、database等,规则文件按照类型分开维护,不至于一个规则文件太大。
数据:
{
"ruleId":"rule_server_linux_001", # 规则ID,业务数据
"name": "SERVER_LINUX", # 规则名称
"rules": [
{
"alert": "143服务器运行状态",
"expr": "up{instance=\"10.0.204.143:9100\"} == 0",
"for": "5m",
"labels": {
"severity": "1"
},
"annotations": {
"alarmRuleConfigCode": "UP_STATUS",
"currentValue": "{{ $value }}",
"thresholdValue": "运行状态 == 未连通",
"description": "{{ $labels.name }}({{ $labels.ip }})的运行状态当前是未连通,请及时处理"
}
},
{
"alert": "66服务器运行状态",
"expr": "mysql_up{job=\"10.0.204.66:9100\"} == 0",
"for": "5m",
"labels": {
"severity": "3"
},
"annotations": {
"alarmRuleConfigCode": "UP_STATUS",
"currentValue": "{{ $value }}",
"thresholdValue": "运行状态 == 未连通",
"description": "{{ $labels.name }}({{ $labels.ip }})的运行状态当前是未连通,请及时处理"
}
}
]
}

配置模板文件templates/server_rule.conf.tmpl
groups: {{range gets "/prometheus/rules/server/*"}}{{$data := json .Value}}
- name: '{{$data.name}}_{{$data.ruleId}}'
rules: {{range $data.rules}}
- alert: '{{.alert}}'
expr: {{.expr}}
for: {{.holdDuration}}
labels:
severity: {{.labels.severity}}
annotations:
description: '{{.annotations.description}}'
currentValue: '{{.annotations.currentValue}}'
thresholdValue: '{{.annotations.thresholdValue}}'
alarmRuleConfigCode: '{{.annotations.alarmRuleConfigCode}}'
{{end}}
{{end}}
注意:
模板中groups下的name在同一个文件中不能重复,否者prometheus进行reload时会报错。
新增confd的配置文件conf.d/server.toml
[template]
src = "../templates/server_rules.conf.tmpl" # 模板路径
dest = "/data/monitor/prometheus/rules/server_rules.yml" # 最终生成的文件路径
keys = ["/prometheus/rules/server"] # 指定key
# check_cmd = "touch /tmp/check" #检查命令,nginx这类软件有nginx -c ,prometheus没有检查命令,直接reload即可
reload_cmd = "/usr/bin/curl --connect-timeout 5 --retry 5 --retry-max-time 40 -X POST http://127.0.0.1:29090/-/reload" # reload prometheus
启动confd
在prometheus下启动confd
nohup ./confd -interval 15 -log-level info -confdir ./ -config-file conf.d/config.toml -backend consul -node 10.0.107.55:8500 &>>./logs/confd.log &
🔩confd配置说明
为了避免一个规则文件过大,将规则文件拆分为不同的文件,方便维护和管理。同时为了兼容不属于指定类型的,提供了默认的规则文件【在prometheus配置服务中控制】。目录结构如下。
.
├── confd # 二进制启动文件
├── conf.d # 配置目录
│ ├── application.toml # 应用服务配置
│ ├── database.toml # 数据库配置
│ ├── default.toml # 默认配置,不属于指定类型的都在这个类型中
│ ├── middleware.toml # 中间件配置
│ └── server.toml # 服务器配置
├── stopconfd.sh # 停止脚本
├── stopconf.sh # 启动脚本
└── templates
├── application_rules.conf.tmpl # 应用服务规则模板文件
├── database_rules.conf.tmpl # 数据库规则模板文件
├── default_rules.conf.tmpl # 默认规则模板文件
├── middleware_rules.conf.tmpl # 中间件爱你规则模板文件
└── server_rules.conf.tmpl # 服务器规则模板文件
🎫promethus规则文件配置
修改prometheus.yml,指定规则文件路径即可
rule_files:
- "./rules/*.yml"
📄prometheus.yml配置文件示例
# my global config
global:
scrape_interval: 1m # 采集间隔 Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 1m # 监控规则评估时间间隔 Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
# 可以采用consul形式,也可以直接使用static形式配置
alerting:
alertmanagers:
- consul_sd_configs:
- server: "10.0.169.95:8500"
tags:
- "alertmanager"
#- static_configs:
# - targets:
# - 127.0.0.1:29093
# - targets:
# - 192.168.124.75:18880
# 配置规则文件路径
rule_files:
- "./rules/*.yml"
scrape_configs:
# static_configs 静态配置
- job_name: "alertmanager"
static_configs:
- targets: ["127.0.0.1:29093"]
# 动态文件服务发现
- job_name: "数据库监控"
file_sd_configs:
- files:
- './database_config/*.json' # 文件路径
refresh_interval: 15s # 自动发现间隔时间,默认5m
# 基于consul的服务发现配置
- job_name: '服务器监控'
consul_sd_configs:
- server: '10.0.107.55:8500' # consul服务地址
- services: ["node_exporter"] # 服务名称,配置后,当前job只监控指定的服务
relabel_configs:
- source_labels: ["__meta_consul_tags"] # tag标签,可以用于分组,打标签
regex: .*server.* # 正则匹配,包含tags中包含server都会被记录到【服务器监控】这个job中
action: keep # 具体操作, 删除与regex不匹配的目标 source_labels
# 解析medata数据,作为标签使用,在consul中可以新增meta数据,这里直接解析作为label使用
- regex: __meta_consul_service_metadata_(.+)
action: labelmap
- job_name: 'graylog监控'
basic_auth:
username: admin
password: admin123graylog
consul_sd_configs:
- server: '10.0.107.55:8500'
- services: ["graylog"]
relabel_configs:
- source_labels: ["__meta_consul_tags"]
regex: .*graylog.*
action: keep
- regex: __meta_consul_service_metadata_(.+)
action: labelmap

本文介绍了Prometheus的配置方式,包括静态文件服务发现和动态文件服务发现,重点讲述了如何通过Consul配合ConfD实现规则文件的动态刷新,以及Consul的安装、服务注册与删除过程。此外,还展示了Prometheus配置文件中的服务发现配置示例,以及ConfD的配置和模板文件的使用方法。
31

被折叠的 条评论
为什么被折叠?



