Prometheus基于Consul的 Redis 多實(shí)例監(jiān)控方案
Redis exporter
使用 Prometheus? 進(jìn)行 Redis? 監(jiān)控的都知道,Redis_exporter? 是較常用的解決方案,但是在 redis_exporter? 開始的版本中,并不支持一個(gè) redis_exporter? 實(shí)例監(jiān)控多 Redis? 實(shí)例,這樣造成 exporter? 實(shí)例的數(shù)量較多,難以維護(hù)和管理。但是好在官方已經(jīng)解決了此問題。在 metrics 的暴漏形式上也有所改變:
# old
http://redis_exporter:9121/metrics
# now
http://redis_exporter:9121/scrape?target=redis://redis:6379
這種改變一定程度緩解了 redis? 相同認(rèn)證方式上 redis_exporter實(shí)例過多,維護(hù)難得問題。
prometheus配置回顧
prometheus 有靜態(tài)配置和動(dòng)態(tài)配置。
靜態(tài)配置
靜態(tài)配置就是直接把要監(jiān)控的目標(biāo)寫死到 prometheus? 的配置文件中,這樣維護(hù)起來比較難,需要頻繁的修改配置文件 prometheus.yml?. 同時(shí)還需進(jìn)行 reload 操作才能生效。
scrape_configs:
- job_name: node
static_configs:
- targets:
- 10.40.58.153:9100
- 10.40.61.116:9100
- 10.40.58.154:9100
配置完成后需要 reload 后,才能生效。
curl -XPUT http://prometheus:9090/-/reload
基于文件發(fā)現(xiàn)
- job_name: 'RabbitMQ-server'
file_sd_configs:
- files:
- rabbitmq.json
與此相反,prometheus? 也可基于文件形式 rabbitmq.json?(與 prometheus? 在同一級(jí)目錄下) 的動(dòng)態(tài)發(fā)現(xiàn),雖然不需要再頻繁修改的 prometheus? 配置文件后進(jìn)行 reload 操作,但是維護(hù)文件對運(yùn)維確實(shí)也是苦難的,可自動(dòng)化程度低且復(fù)雜。
基于consul/etcd
prometheus? 是可以基于 consul/etcd? 實(shí)現(xiàn)動(dòng)態(tài)發(fā)現(xiàn)的,這也是今天說的重點(diǎn),對于基于 consul 實(shí)現(xiàn)的監(jiān)控目標(biāo)自動(dòng)發(fā)現(xiàn)好處多多:
- 避免頻繁操作機(jī)器配置文件來增加和修改配置項(xiàng),減輕運(yùn)維人員負(fù)擔(dān)避免成為配置達(dá)人。
- 利用 consul 等 自帶的 API 可以結(jié)合現(xiàn)有的平臺(tái)實(shí)現(xiàn)自動(dòng)化接入。
- 無需reload。
其他過多的就不在擴(kuò)展了,直接進(jìn)入正題,通過 Redis_exporter? 的動(dòng)態(tài)發(fā)現(xiàn)實(shí)現(xiàn)多實(shí)例監(jiān)控來熟悉一下 consul? 在 prometheus 動(dòng)態(tài)發(fā)現(xiàn)中有多重要。
前期準(zhǔn)備
因?yàn)檫@里主要記錄 prometheus? 基于 consul? 實(shí)現(xiàn)的 redis_exporter? 進(jìn)行多實(shí)例監(jiān)控的案例,consul? 和 prometheus 部署的問題就不在細(xì)說。
測試環(huán)境服務(wù)器IP:192.168.0.100。
consul部署
1.consul配置文件consul.hcl。
client_addr = "0.0.0.0"
ui_config{
enabled = true
}
server = true
bootstrap = true
acl = {
enabled = true
default_policy = "deny"
enable_token_persistence = true
}
2.Consul docker-compose.yaml。
version: '3'
services:
consul-server1:
image: hashicorp/consul:1.13
container_name: consul-server
restart: always
ports:
- "8500:8500"
- "8600:8600/tcp"
- "8600:8600/udp"
command: "agent -server -config-file /consul/consul.hcl"
volumes:
- ./consul.hcl:/consul/consul.hcl:ro
啟動(dòng) consul? 服務(wù),并且獲取 consul? 的 token?,后期 prometheus 的配置中需要用到。
docker-compose up -d
docker exec -it consul-server bash
consul acl bootstrap
redis_exporter
redis_exporter 多實(shí)例密碼問題[1]。
# 運(yùn)行一個(gè)redis_exporter,用于獲取 沒有啟用認(rèn)證的實(shí)例的指標(biāo)
docker run -d --name redis_exporter -p 19121:9121 oliver006/redis_exporter
# 運(yùn)行一個(gè)redis_exporter,用于獲取 啟用認(rèn)證且密碼是SUPER_SECRET_PASSWORD的實(shí)例的指標(biāo)
docker run -d --name redis_exporter_auth -p 29121:9121 oliver006/redis_exporter -redis.password SUPER_SECRET_PASSWORD
# 運(yùn)行一個(gè) 啟用認(rèn)證且密碼是SUPER_SECRET_PASSWORD的redis實(shí)例
docker run --name redis -d -p 46379:6379 redis redis-server --requirepass "SUPER_SECRET_PASSWORD"
在redis_exporter issues中也有人做了針對不同密碼不同redis實(shí)例采集的Docker鏡像, 但這種方案無論在prometheus展示中還是在consul中都會(huì)明文暴漏redis實(shí)例密碼,有需要的可以自己查看[2]。
prometheus
1.prometheus docker-compose.yaml。
version: '3'
services:
prometheus:
image: prom/prometheus:v2.12.0
container_name: prometheus
volumes:
- /apps/prometheus/conf/:/etc/prometheus/
restart: always
ports:
- "9090:9090"
command: ['--web.external-url=http://192.168.0.100:9090','--config.file=/etc/prometheus/prometheus.yml','--storage.tsdb.path=/prometheus/data','--web.enable-lifecycle','--web.enable-admin-api','--web.console.templates=/prometheus/consoletest','--web.page-title=prometheus-consul-redis實(shí)踐展示'
2.注冊redis? 到consul 中。
curl --location --request PUT 'http://consul:8500/v1/agent/service/register' \
--header 'X-CONSUL-TOKEN: 17ee5423-b5ce-xxxx-338e-xxxxxxxxxxx' \
--header 'Content-Type: application/json' \
--data-raw '{
"id": "redis-192.168.0.100:46379",
"name": "redis",
"address": "192.168.0.100",
"port": 46379,
"tags": [
"192.168.0.100:29121",
"redis",
"test"
],
"checks": [
{
"http": "http://192.168.0.100:29121",
"interval": "5s"
}
]
}'
consul頁面
這樣截圖對比一下是否清晰的知道 JSON? 中每個(gè)字段的含義了?對于同一分類的 redis? 實(shí)例可以放在同一個(gè) service? 的 name? 下,也就是通過 service? 的 name 進(jìn)行分組。
3.服務(wù)注冊到consul? 以后,就需要修改prometheus 的配置了。
- job_name: consul_redis
scrape_interval: 15s
scrape_timeout: 5s
consul_sd_configs:
- server: '192.168.0.100:8500' # 修改你consul服務(wù)所在的ip地址
token: '17ee5423-b5ce-xxxx-338e-xxxxxxxxxxx' # 修改你從consul中獲取到的token
refresh_interval: 30s
services: ["redis"] # 這里是匹配注冊到consul中的服務(wù)名稱
tags: ['test','redis'] # 這是匹配注冊到consul中的tags, 要對應(yīng)一致,不然查找到對象
metrics_path: /scrape # redis_exporter 監(jiān)控多實(shí)例時(shí)要把/metrics自定義為/scrape
relabel_configs: # 以下是修正標(biāo)簽值以及grafana的自定義模板進(jìn)行的自定義標(biāo)簽【注意:】一定要按需修改,切勿照搬
- source_labels: ['__meta_consul_service']
regex: "consul"
action: drop
- source_labels: ['__address__']
target_label: __param_target
- source_labels: ['__param_target']
target_label: realip # 自定義realip標(biāo)簽,值為注冊進(jìn)去的address:port,用于grafana dashboard
- source_labels: ['__meta_consul_tags']
separator: ','
regex: ",(.*),redis,test," # 此處要注意逗號(hào)格式,按照tags的順序匹配,(.*)獲取到的是redis_exporter的實(shí)例地址
replacement: $1
target_label: exporter
- source_labels: ['__meta_consul_tags']
separator: ','
regex: ",(.*),redis,test,"
replacement: $1
target_label: __address__ # 此處是修正endpoint的值為redis_exporter的實(shí)例地址
- source_labels: ['__param_target']
regex: "(.*):(.*)"
replacement: $2
target_label: port # 自定義標(biāo)簽port,用于grafana dashboard
?
如果有同學(xué)借鑒以上配置,把自定義標(biāo)簽 realip/port 兩個(gè)去掉即可,其它不動(dòng)即可使用。
4.修改完成后,我們做針對consul_redis? 這個(gè) job 的最后一次reload prometheus服務(wù)。
curl -XPUT http://prometheus:9090/-/reload
5.然后訪問prometheus 的頁面,查看是否有監(jiān)控項(xiàng)被發(fā)現(xiàn)。
prometheus target頁面
這里就是最后的發(fā)現(xiàn)結(jié)果。
6.通過curl 查看監(jiān)控指標(biāo)的值
通過curl查看exporter結(jié)果
7.查看grafana 數(shù)據(jù)展示。
在 Dashboard? 中配置之前定義好的realip變量,最終的展示大盤。
資料參考
[1]redis_exporter 多實(shí)例密碼問題討論:https://github.com/oliver006/redis_exporter/issues/278
[2]redis_exporter multi-auth docker:https://hub.docker.com/r/linuxhub/redis_exporter