Алгоритм действий состоит из следующих шагов:
1.Настройка конфигурационного файла Blackbox-экспортера на поддержку проверки порта целевого хоста
2.Настройка Prometheus-а для подключения и поддержки Blackbox-экспортера
3.Настрйка правил Prometheus для мониторинга доступности/недоступности порта целевого хоста
Например, проверим,что mysql-port(3306) НЕ доступен снаружи для подключений
т.е. если кто-то выставит наружу mysql, то система мониторинга это обнаружит и оповестит по соответствующему каналу связи
1.Настройка конфигурационного файла Blackbox-экспортера на поддержку tcp-проверки
Определяем модуль с именем tcp_connect.
Время проверки — до 5 секунд
Протокол для проверки — TCP
1 |
# nano blackbox-exporter/blackbox.yml |
1 2 3 4 |
modules: tcp_connect: prober: tcp timeout: 5s |
2.Настройка Prometheus-а для подключения и поддержки blackbox-экспортера
Определение конетйнера blackbox-exporter в docker-compose.yml
1 |
# nano docker-compose.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 |
version: '2.4' networks: monitor-net: driver: bridge services: … blackbox-exporter: image: prom/blackbox-exporter:${BLACKBOX_EXPORTER_VERSION} container_name: blackbox-exporter volumes: - ./blackbox-exporter/:/config/ command: - '--config.file=/config/blackbox.yml' restart: unless-stopped networks: - monitor-net mem_limit: ${BLACKBOX_EXPORTER_MEM_LIMIT} mem_reservation: ${BLACKBOX_EXPORTER_MEM_RESERVATION} logging: driver: "json-file" options: max-size: "5m" |
Конфигурационный файл blackbox-exporter-а монтируется как volume для возможности его изменения и применения новых настроек без пересборки контейнера
Значение переменных определяющих размер резервируемой и максимально доступной памяти для контейнера, а также версию/тег образа, вынесем в файл с переменными окружения .env, который читает docker-compose
1 |
# nano .env |
1 2 3 4 |
### Blackbox-exporter BLACKBOX_EXPORTER_VERSION=latest BLACKBOX_EXPORTER_MEM_LIMIT=128m BLACKBOX_EXPORTER_MEM_RESERVATION=64m |
В конфигурационном файле prometheus определяем цели(хосты), доступность/недоступность портов MySQL которых необходимо мониторить
Название модуля(tcp_connect) должно совпадать с именем модуля, указанным в конфигурационном файле blackbox-экспортера — blackbox.yml (см.пункт 1)
За счет переназначения меток в подразделе relabel_configs значение поля(метки) instance будет равно значению поля(метки) addess(а address — это те имена хостов/IP-адреса, которые указаны в параметре targets)
т.к нас интересует порт mysql, то добавляем 3306(если используется дефолтный порт) к именам хостов в подразделе targets
1 |
# nano prometheus/prometheus.yml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
scrape_configs: - job_name: 'blackbox-tcp_connect_mysql' scrape_interval: 900s metrics_path: /probe params: module: [tcp_connect] static_configs: - targets: - 111.111.111.111:3306 # server1 - 112.112.112.112:3306 # server2 - server3.mydomain.com:3306 # server3 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115 |
Проверка синтаксиса конфиг.файла Prometheus и файлов с правилами
1 |
# (cd /home/myusername/monstack && ../prometheus-2.10.0.linux-amd64/promtool check config ./prometheus/prometheus.yml && echo OK || echo FAIL) |
Проверка синтаксиса docker-compose.yml файла
1 |
# docker-compose config |
Создаем и запускаем blackbox-exporter, проверяем корректность его запуска
1 |
# docker-compose up -d blackbox-exporter |
1 |
# docker-compose ps | grep blackbox-exporter |
1 |
blackbox-exporter /bin/blackbox_exporter --c ... Up 9115/tcp |
Логи контейнера blackbox-exporter
1 |
# docker-compose logs blackbox-exporter |
1 2 3 |
blackbox-exporter | level=info ts=2019-08-23T14:23:43.187317952Z caller=main.go:213 msg="Starting blackbox_exporter" version="(version=0.14.0, branch=HEAD, revision=bba7ef76193948a333a5868a1ab38b864f7d968a)" blackbox-exporter | level=info ts=2019-08-23T14:23:43.18852946Z caller=main.go:226 msg="Loaded config file" blackbox-exporter | level=info ts=2019-08-23T14:23:43.188778232Z caller=main.go:330 msg="Listening on address" address=:9115 |
После чего проверяем в Prometheus наличие новых целей для мониторинга
1 |
Prometheus→Status→Target |
3.Настрйка правил Prometheus для мониторинга доступности/недоступности порта целевого хоста
Добавляем правило для мониторинга доступности/недоступности порта 3306
Если порт доступен снаружи, то правило сработает и отправит оповещение через настроенный канал связи(например, Slack)
1.Порт MySQL(3306) доступен снаружи
1 |
# nano prometheus/hosts_rules.yml |
1 2 3 4 5 6 7 8 9 10 11 |
groups: - name: general rules: - alert: service_mysql_is_available_outside expr: probe_success{job="blackbox-tcp_connect_mysql"} == 1 for: 1m labels: severity: critical annotations: description: "Critical: Mysql is available outside on the host {{ $labels.instance }}." summary: "Mysql is available outside" |
Проверка синтаксиса конфиг.файла 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 появляется добавленное правило
При изменении конфигурационного файла blackbox-exporter-а blackbox.yml для применения новых настроек достаточно послать POST запрос на перечитывание своего конф.файл blackbox-exporter контейнеру. Если в этом файле будут ошибки,то изменения не применяются и соответствующая ошибка будет в выводе такого POST-запроса
Например, это можно сделать из любого контейнера, который находится в одной docker-сети с blackbox-exorter-контейнером и у которого установлен curl
Например, внутри контейнера с grafana выполним команду по перезагруки blackbox-exporter
1 |
# ( cd /home/myusername/monstack && docker-compose exec grafana curl -X POST http://blackbox-exporter:9115/-/reload) |
Добавление мониторинга другого порта
Если необходимо добавить мониторинг другого порта, например, порта Redis (6379)
Для этого в prometheus.yml добавляем блок
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
- job_name: 'blackbox-tcp_connect_redis' scrape_interval: 900s metrics_path: /probe params: module: [tcp_connect] static_configs: - targets: - 111.111.111.111:6379 # server1 - 112.112.112.112:6379 # server2 - server3.mydomain.com:6379 # server3 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115 |
И в файл с описанием правил проверки(в данном случае prometheus/services_rules.yml)
1 2 3 4 5 6 7 8 |
- alert: service_redis_is_available_outside expr: probe_success{job="blackbox-tcp_connect_redis"} == 1 for: 1m labels: severity: critical annotations: description: "Critical: Redis is available outside on the host {{ $labels.instance }}." summary: "Redis is available outside" |
Проверка синтаксиса конфиг.файла 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 |
После чего проверяем наличие
— правила для мониторинга Redis в Prometheus→Alerts
— наличие новой цели по мониторингу Redis-порта в Prometheus→Status→Target
Источник:
https://github.com/prometheus/blackbox_exporter
https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md