Алгоритм действий состоит из следующих шагов:
1.Запуск Redis-экспортера для сбора метрик с Redis и отдачи их Prometheus-у
2.Настройка Prometheus-а для сбора метрик с Redis-экспортера
3.Импортирование/настройка dashboard Grafana для визуализации метрик
4.Настрйка правил Prometheus для мониторинга Redis показателей
1.Запуск Redis-экспортера для сбора метрик с Redis и отдачи их Prometheus-у
Redis-экспортер запускаем в той же docker-сети, в которой и запущен redis-контейнер,чтобы средствами докера экспортер смог разименовать имя redis-контейнера в его IP-адрес и подключиться по этому IP-адресу для снятия с него метрик
1 |
--redis.addr |
— параметр определяет адрес redis-сервера, с которого необходимо собирать метрики( по умолчанию redis://localhost:6379 )
Больше информации о возможных параметрах доступно в статье
Также здесь пробрасывается порт,на котором слушает запросы redis-exporter наружу на, например, туннельный IP-адрес(10.103.90.1) и на порт, например,9121, чтобы Prometheus смог подключиться к redis-экспортеру для сбора метрик с него.
Если не используется docker-compose
1 |
# docker run -d --name redis-exporter -p 10.103.90.1:9121:9121 --network laradock_backend oliver006/redis_exporter:alpine --redis.addr redis://redis:6379 |
Если используется docker-compose
1 |
# nano docker-compose.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
### Redis Exporter ######################################### redis-exporter: image: oliver006/redis_exporter:alpine container_name: redis-exporter restart: unless-stopped command: ["--redis.addr", "redis://redis:6379"] ports: - "10.103.90.1:9121:9121" networks: - backend #mem_limit: 128m # for docker-compose v2 only #mem_reservation: 64m # for docker-compose v2 only logging: driver: "json-file" options: max-size: "5m" |
Проверка синтаксиса docker-compose-файла
1 |
# docker-compose config |
Создание и запуск redis-exporter контейнера
1 |
# docker-compose up -d redis-exporter |
Проверяем наличие запущенного redis-exporter контейнера, который будет собирать метрики с redis-контейнера
1 |
# docker ps | grep redis-exporter |
1 |
9573d212cbce oliver006/redis_exporter:alpine "/redis_exporter --r…" 35 seconds ago Up 34 seconds 10.103.90.1:9121->9121/tcp redis-exporter |
1 |
# netstat -nlptu | grep 9121 |
1 |
tcp 0 0 10.103.90.1:9121 0.0.0.0:* LISTEN 23101/docker-proxy |
С хоста, на котором запущен redis-контейнер, проверяем доступность метрик с redis-экспортера
Список показателей достаточно длинный, поэтому просто вывел их количество
1 |
# curl 10.103.90.1:9121/metrics | grep -E "^redis" | wc -l |
1 |
118 |
С мониторинг хоста получаем такой же успешный ответ
1 |
# curl 10.103.90.1:9121/metrics | grep -E "^redis" | wc -l |
1 |
118 |
2.Настройка Prometheus-а для сбора метрик с Redis-экспортера
Добавляем redis-экпортер в service discovery файл
1 |
# nano prometheus/sd/targets-redis-exporter.yml |
1 2 3 4 5 |
- targets: - f3.mydomain.com:9121 labels: env: staging job: redis-exporter |
Подключаем этот service discovery файл в Prometheus
1 |
# nano prometheus/prometheus.yml |
1 2 3 4 |
- job_name: 'redis-exporter' file_sd_configs: - files: - sd/targets-redis-exporter.yml |
Проверка синтаксиса конфиг.файла Prometheus и файлов с правилами
1 |
# (cd /home/myusername/monstack && ../prometheus-2.10.0.linux-amd64/promtool check config ./prometheus/prometheus.yml && echo OK || echo FAIL) |
Перечитываем конф.файл Prometheus
1 |
# curl -X POST https://adminuser:adminpassword@prometheus.mydomain.com /-/reload |
После чего проверяем в Prometheus наличие новой цели для мониторинга
1 |
Prometheus->Status->Target |
3.Импортирование/настройка dashboard Grafana для визуализации метрик
Импортируем дашбоард отсюда
https://grafana.com/grafana/dashboards/763
Я изменил его под свои задачи
Redis-dashboard.zip
4.Настройка правил Prometheus для мониторинга Redis показателей
Добавляем несколько правил для мониторинга Redis показателей
1.Запущен ли Redis (redis_is_running)
2.Выполняется ли сброс/сохранение данных из памяти на диск
3.Использование памяти Redis-ом(относительно всей ОЗУ доступной на хосте)
4-5.Увеличение количества подключений к Redis(разное для разных инстансов)
6.Уменьшение количества подключений к Redis
7.Появление evicted-ключей
1 |
# nano prometheus/services_rules.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
groups: - name: redis rules: - alert: redis_is_running expr: redis_up == 0 for: 30s labels: severity: critical annotations: summary: "Critical: Redis is down on the host {{ $labels.instance }}." description: "Redis has been down for more than 30 seconds" - alert: redis_missing_rdb_backup expr: time() - redis_rdb_last_save_timestamp_seconds > 60 * 60 for: 5m labels: severity: critical annotations: description: "Critical: Missing RDB-backup on the host {{ $labels.instance }} for more than 5 minutes" summary: "Missing RDB-backup" - alert: redis_memory_usage expr: redis_memory_used_bytes / redis_total_system_memory_bytes * 100 > 40 for: 5m labels: severity: warning annotations: description: "Warning: Redis high memory(>40%) usage on the host {{ $labels.instance }} for more than 5 minutes" summary: "Redis memory usage {{ humanize $value}}% of the host memory" - alert: redis_too_many_connections expr: redis_connected_clients{instance!~"server1.mydomain.com.+"} > 50 for: 5m labels: severity: warning annotations: description: "Warning: Redis has many connections on the host {{ $labels.instance }} for more than 5 minutes" summary: "Redis number of connections {{ $value }}" - alert: redis_too_many_connections_server1.mydomain.com expr: redis_connected_clients{instance=~"server1.mydomain.com.+"} > 160 for: 5m labels: severity: warning annotations: description: "Warning: Redis has many connections on the host {{ $labels.instance }} for more than 5 minutes" summary: "Redis number of connections {{ $value }}" - alert: redis_not_enough_connections expr: redis_connected_clients{instance=~"server1.+|server2.+|server3.+"} < 5 for: 5m labels: severity: warning annotations: description: "Warning: Redis has not enough connections on the host {{ $labels.instance }} for more than 5 minutes" summary: "Redis number of connections {{ $value }}" - alert: redis_rejected_connections expr: increase(redis_rejected_connections_total[1m]) > 0 for: 30s labels: severity: critical annotations: description: "Critical: Redis rejected connections on the host {{ $labels.instance }}" summary: "Redis rejected connections are {{ $value }}" - alert: redis_evicted_keys expr: increase(redis_evicted_keys_total[1m]) > 0 for: 30s labels: severity: critical annotations: description: "Critical: Redis evicted keys on the host {{ $labels.instance }}" summary: "Redis evicted keys are {{ $value }}" |
Источник:
https://github.com/oliver006/redis_exporter
https://grafana.com/grafana/dashboards/763