Алгоритм действий состоит из следующих шагов:
1.Запуск Beanstalkd-экспортера для сбора метрик с Beanstalkd и отдачи их Prometheus-у
2.Настройка Prometheus-а для сбора метрик с Beanstalkd-экспортера
3.Импортирование/настройка dashboard Grafana для визуализации метрик
4.Настрйка правил Prometheus для мониторинга Beanstalkd показателей
1.Запуск Beanstalkd-экспортера для сбора метрик с Beanstalkd и отдачи их Prometheus-у
Скачиваем репозитарий,который содержит Dockerfile для сборки образа, из которого запускается контейнер
1 |
# git clone https://github.com/messagebird/beanstalkd_exporter.git beanstalkd-exporter |
Если не используется docker-compose
1 |
# cd beanstalkd-exporter |
1 |
# docker build -t beanstalkd-exporter . |
1 |
# docker run -d -p 10.102.90.1:9127:8080 --network laradock_backend --name beanstalkd-exporter beanstalkd-exporter -beanstalkd.address beanstalkd:11300 -web.listen-address 0.0.0.0:8080 -num-tube-stat-workers 13 -sleep-between-tube-stats 500 |
Параметры,которые используются для запуска beanstalkd
1 |
-web.listen-address |
– адрес и порт, на котором будут доступны метрики с beanstalkd-экспортера — забиндим порт(8080) на всех интерфейсах(0.0.0.0),чтобы можно было пробросить этот порт(8080) на хост на порт,например, 9127 (по дефолту используется «:8080»)
1 |
-num-tube-stat-workers |
— количество параллельных воркеров используемых для получения статистики с очередей(tubes). Это значение я установил равным количество очередей(в данном случае — 13) (по дефолту используется 1)
1 |
-sleep-between-tube-stats |
— количество миллисекунд между проверками очередей( по умолчанию 5000). Я уменьшил дефолтное значение в 10 раз для того,чтобы проверка занимала меньше времени.
Также здесь пробрасывается порт,на котором слушает запросы beanstalkd-exporter наружу на, например, туннельный IP-адрес(10.102.90.1) и на порт, например,9127, чтобы Prometheus смог подключиться к с beanstalkd-экспортеру для сбора метрик с него. Порт внутри контейнера, на котором запущен beanstalkd-экспортер — 8080
Если используется docker-compose
1 |
# nano docker-compose.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
… ### Beanstalkd Exporter ######################################### beanstalkd-exporter: build: ./beanstalkd-exporter/ container_name: beanstalkd-exporter restart: unless-stopped command: ["-beanstalkd.address", "beanstalkd:11300", "-web.listen-address", "0.0.0.0:8080", "-num-tube-stat-workers", "13", "-sleep-between-tube-stats", "500"] ports: - "10.102.90.1:9127:8080" 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 |
Создание и запуск beanstalkd-exporter контейнера
1 |
# docker-compose up -d beanstalkd-exporter |
Проверяем наличие запущенного beanstalkd-exporter контейнера, который будет собирать метрики с beanstalkd-сервера
1 |
# docker-compose ps | grep beanstalkd-exporter |
1 |
beanstalkd-exporter beanstalkd_exporter -beans ... Up 10.102.90.1:9127->8080/tcp |
1 |
# netstat -nlptu | grep 9127 |
1 |
tcp 0 0 10.102.90.1:9127 0.0.0.0:* LISTEN 27315/docker-proxy |
С хоста, на котором запущен beanstalkd-контейнер проверяем доступность метрик с beanstalkd-экспортера
Список показателей достаточно длинный, поэтому просто вывел их количество
1 |
# curl 10.102.90.1:9127/metrics | grep -vE "^#" | wc-l |
1 |
231 |
С мониторинг хоста
1 |
# curl 10.102.90.1:9127/metrics | grep -vE "^#" | wc-l |
1 |
231 |
Получаем такой же успешный ответ
2.Настройка Prometheus-а для сбора метрик с Beanstalkd-экспортера
Добавляем beanstalkd-экпортер в service discovery файл
1 |
# nano prometheus/sd/targets-beanstalkd-exporter.yml |
1 2 3 4 5 6 7 |
... - targets: - f1.mydomain.com:9127 labels: env: staging job: beanstalkd-exporter ... |
Подключаем этот service discovery файл в Prometheus
1 |
# nano prometheus/prometheus.yml |
1 2 3 4 5 6 7 |
... scrape_configs: - job_name: 'beanstalkd-exporter' file_sd_configs: - files: - sd/targets-beanstalkd-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 для визуализации метрик
Готовый dashboard на сайте Grafana на момент настройки я не нашел, поэтому создал свой dashboard
Beanstalkd-dashboard.zip
4.Настройка правил Prometheus для мониторинга Beanstalkd показателей
Добавляем несколько правил для мониторинга Beanstalkd показателей
1.Количество воркеров(потребителей) меньше необходимого значения (beanstalkd_workers_count)
2.Количество сообщений/задач в очереди READY больше определенного значения (beanstalkd_jobs_ready_count)
3.Количество сообщений/задач в очереди RESERVED больше определенного значения (beanstalkd_jobs_reserved_count)
4.Количество сообщений/задач в очереди DELAYED больше определенного значения (beanstalkd_jobs_delayed_count)
5.Количество сообщений/задач в очереди URGENT больше определенного значения (beanstalkd_jobs_urgent_count)
6.Количество сообщений/задач в очереди BURIED больше определенного значения (beanstalkd_jobs_buried_count)
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 |
groups: - name: beanstalkd rules: - alert: beanstalkd_workers_count expr: current_workers{job="beanstalkd-exporter"} < 19 for: 5m labels: severity: critical annotations: summary: "Critical: Beanstalkd numbers of workers too small(<19) on the instance {{ $labels.instance }} for more than 5 minutes." description: "Beanstalkd current number of workers is {{ $value }}" - alert: beanstalkd_jobs_ready_count expr: sum by (instance) (tube_current_jobs_ready{job="beanstalkd-exporter"}) > 15 for: 5m labels: severity: critical annotations: summary: "Critical: Beanstalkd numbers of jobs in state READY too many(>15) on the instance {{ $labels.instance }} for more than 5 minutes." description: "Beanstalkd current number of jobs in state READY is {{ $value }}" - alert: beanstalkd_jobs_reserved_count expr: sum by (instance) (tube_current_jobs_reserved{job="beanstalkd-exporter"}) > 15 for: 5m labels: severity: critical annotations: summary: "Critical: Beanstalkd numbers of jobs in state RESERVED too many(>15) on the instance {{ $labels.instance }} for more than 5 minutes." description: "Beanstalkd current number of jobs in state RESERVED is {{ $value }}" - alert: beanstalkd_jobs_delayed_count expr: sum by (instance) (tube_current_jobs_delayed{job="beanstalkd-exporter"}) > 15 for: 5m labels: severity: critical annotations: summary: "Critical: Beanstalkd numbers of jobs in state DELAYED too many(>15) on the instance {{ $labels.instance }} for more than 5 minutes." description: "Beanstalkd current number of jobs in state DELAYED is {{ $value }}" - alert: beanstalkd_jobs_urgent_count expr: sum by (instance) (tube_current_jobs_urgent{job="beanstalkd-exporter"}) > 15 for: 5m labels: severity: critical annotations: summary: "Critical: Beanstalkd numbers of jobs in state URGENT too many(>15) on the instance {{ $labels.instance }} for more than 5 minutes." description: "Beanstalkd current number of jobs in state URGENT is {{ $value }}" - alert: beanstalkd_jobs_buried_count expr: sum by (instance) (tube_current_jobs_buried{job="beanstalkd-exporter"}) > 15 for: 5m labels: severity: critical annotations: summary: "Critical: Beanstalkd numbers of jobs in state BURIED too many(>15) on the instance {{ $labels.instance }} for more than 5 minutes." description: "Beanstalkd current number of jobs in state BURIED is {{ $value }}" |
Проверка синтаксиса конфиг.файла 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→Alerts появляются добавленные правила
Источник:
https://github.com/messagebird/beanstalkd_exporter