Prometheus基于Consul的 Redis 多实例监控方案

1,093 阅读5分钟

Redis exporter 使用 Prometheus 进行 Redis 监控的都知道,Redis_exporter 是较常用的解决方案,但是在 redis_exporter 开始的版本中,并不支持一个 redis_exporter 实例监控多 Redis 实例,这样造成 exporter 实例的数量较多,难以维护和管理。但是好在官方已经解决了此问题。在 metrics 的暴漏形式上也有所改变:

old

http://redis_exporter:9121/metrics

now

http://redis_exporter:9121/scrape?target=redis://redis:6379 这种改变一定程度缓解了 redis 相同认证方式上 redis_exporter实例过多,维护难得问题

prometheus配置回顾 prometheus 有静态配置和动态配置。

静态配置 静态配置就是直接把要监控的目标写死到 prometheus 的配置文件中,这样维护起来比较难,需要频繁的修改配置文件 prometheus.yml. 同时还需进行 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 基于文件发现

  • job_name: 'RabbitMQ-server' file_sd_configs:
    • files:
      • rabbitmq.json 与此相反,prometheus 也可基于文件形式 rabbitmq.json(与 prometheus 在同一级目录下) 的动态发现,虽然不需要再频繁修改的 prometheus 配置文件后进行 reload 操作,但是维护文件对运维确实也是苦难的,可自动化程度低且复杂。

基于consul/etcd prometheus 是可以基于 consul/etcd 实现动态发现的,这也是今天说的重点,对于基于 consul 实现的监控目标自动发现好处多多:

避免频繁操作机器配置文件来增加和修改配置项,减轻运维人员负担避免成为配置达人

利用 consul 等 自带的 API 可以结合现有的平台实现自动化接入

无需 reload

其他过多的就不在扩展了,直接进入正题,通过 Redis_exporter 的动态发现实现多实例监控来熟悉一下 consul 在 prometheus 动态发现中有多重要。

前期准备 因为这里主要记录 prometheus 基于 consul 实现的 redis_exporter 进行多实例监控的案例,consul 和 prometheus 部署的问题就不在细说

测试环境服务器IP:192.168.0.100

consul部署 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 } 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` 启动 consul 服务,并且获取 consul 的 token,后期 prometheus 的配置中需要用到

docker-compose up -d docker exec -it consul-server bash consul acl bootstrap redis_exporter redis_exporter 多实例密码问题[1]

运行一个redis_exporter,用于获取 没有启用认证的实例的指标

docker run -d --name redis_exporter -p 19121:9121 oliver006/redis_exporter

运行一个redis_exporter,用于获取 启用认证且密码是SUPER_SECRET_PASSWORD的实例的指标

docker run -d --name redis_exporter_auth -p 29121:9121 oliver006/redis_exporter -redis.password SUPER_SECRET_PASSWORD

运行一个 启用认证且密码是SUPER_SECRET_PASSWORD的redis实例

docker run --name redis -d -p 46379:6379 redis redis-server --requirepass "SUPER_SECRET_PASSWORD" 在redis_exporter issues中也有人做了针对不同密码不同redis实例采集的Docker镜像, 但这种方案无论在prometheus展示中还是在consul中都会明文暴漏redis实例密码,有需要的可以自己查看[2]

prometheus 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实践展示>' 注册 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" } ] }'

image.png consul页面

这样截图对比一下是否清晰的知道 JSON 中每个字段的含义了?对于同一分类的 redis 实例可以放在同一个 service 的 name 下,也就是通过 service 的 name 进行分组。

服务注册到 consul 以后,就需要修改 prometheus 的配置了

  • job_name: consul_redis scrape_interval: 15s scrape_timeout: 5s consul_sd_configs:
    • server: '192.168.0.100:8500' # 修改你consul服务所在的ip地址 token: '17ee5423-b5ce-xxxx-338e-xxxxxxxxxxx' # 修改你从consul中获取到的token refresh_interval: 30s services: ["redis"] # 这里是匹配注册到consul中的服务名称 tags: ['test','redis'] # 这是匹配注册到consul中的tags, 要对应一致,不然查找到对象 metrics_path: /scrape # redis_exporter 监控多实例时要把/metrics自定义为/scrape relabel_configs: # 以下是修正标签值以及grafana的自定义模板进行的自定义标签【注意:】一定要按需修改,切勿照搬
    • source_labels: ['__meta_consul_service'] regex: "consul" action: drop
    • source_labels: ['address'] target_label: __param_target
    • source_labels: ['__param_target'] target_label: realip # 自定义realip标签,值为注册进去的address:port,用于grafana dashboard
    • source_labels: ['__meta_consul_tags'] separator: ',' regex: ",(.),redis,test," # 此处要注意逗号格式,按照tags的顺序匹配,(.)获取到的是redis_exporter的实例地址 replacement: $1 target_label: exporter
    • source_labels: ['__meta_consul_tags'] separator: ',' regex: ",(.*),redis,test," replacement: $1 target_label: address # 此处是修正endpoint的值为redis_exporter的实例地址
    • source_labels: ['__param_target'] regex: "(.):(.)" replacement: $2 target_label: port # 自定义标签port,用于grafana dashboard

如果有同学借鉴以上配置,把自定义标签 realip/port 两个去掉即可,其它不动即可使用

修改完成后,我们做针对 consul_redis 这个 job 的最后一次 reload prometheus服务

curl -XPUT http://prometheus:9090/-/reload 然后访问 prometheus 的页面,查看是否有监控项被发现

image.png

prometheus target页面

这里就是最后的发现结果

通过 curl 查看监控指标的值 image.png 通过curl查看exporter结果

查看 grafana 数据展示

在 Dashboard 中配置之前定义好的realip变量,最终的展示大盘出处链接及本声明。 原文链接:blog.csdn.net/singgel/art…

image.png