Алгоритм действий состоит из следующих шагов:
1.Настройка конфигурационного файла Blackbox-экспортера на поддержку http/s-проверки
2.Настройка Prometheus-а для подключения и поддержки Blackbox-экспортера
3.Импортирование/настройка dashboard Grafana для визуализации метрик
4.Настрйка правил Prometheus для мониторинга доступности сайта, скорости ответа сайта.
Например, мониторить будем несколько сайтов
По https такие сайты: mysite1.com, mysite2.com, mysite4.com
По http – сайт mysite3.com
Доступность сайтов mysite1.com, mysite2.com, mysite3.com будем мониторить с помощью допустимых кодов ответа — в нашем случае следующих кодов ответа — 200,302,301,304
Доступность сайта mysite4.com будем мониторить по наличию в исходном коде страницы необходимой строки/подстроки — например, подстроки «my custom site string»
Для общей группы сайтов (mysite{1,2,3}.com) создаем модуль, например, с именем http_2xx-general, для сайта mysite4.com – создаем отдельный модуль, например, с именем http_2xx-mysite4.com
В обоих модулях используем следующие настройки
1 2 3 4 5 6 7 8 |
timeout: 10s - время выполнения проверки valid_status_codes: [200,302,301,304] - валидные коды ответа method: GET - метод запроса no_follow_redirects: false - следовать редиректам/перенаправлениям на сайте fail_if_ssl: false - не считать проверку неуспешной, если используется ssl fail_if_not_ssl: false - не считать проверку неуспешной, если НЕ используется ssl preferred_ip_protocol: "ip4" - использовать ipv4 протокол для выполнения проверки fail_if_body_not_matches_regexp - считать проверку неуспешной, если тело ответа не содержит указанную подстроку |
1.Настройка конфигурационного файла Blackbox-экспортера на поддержку http/s-проверки
Определяем вышеуказанные модули с именами http_2xx-general и http_2xx-mysite4.com
1 |
# nano blackbox-exporter/blackbox.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 |
modules: http_2xx-general: prober: http timeout: 10s http: valid_status_codes: [200,302,301,304] # Defaults to 2xx method: GET no_follow_redirects: false fail_if_ssl: false fail_if_not_ssl: false preferred_ip_protocol: "ip4" # defaults to "ip6" tls_config: insecure_skip_verify: true http_2xx-mysite4.com: prober: http timeout: 10s http: valid_status_codes: [200,302,301,304] # Defaults to 2xx method: GET no_follow_redirects: false fail_if_ssl: false fail_if_not_ssl: false fail_if_body_not_matches_regexp: - "my custom site string" preferred_ip_protocol: "ip4" # defaults to "ip6" tls_config: insecure_skip_verify: true http_post_2xx: prober: http timeout: 10s http: method: POST |
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 определяем сайты, доступность которых по http/s-протоколу требуется проверять
Название модуля(http_2xx-general или http_2xx-mysite4.com) должно совпадать с именем модуля, указанным в конфигурационном файле blackbox-экспортера — blackbox.yml (см.пункт 1)
За счет переназначения меток в подразделе relabel_configs значение поле instance будет равно значению поля addess(а address — это те имена сайтов, которые указаны в параметре 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 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
scrape_configs: - job_name: 'blackbox-http_2xx-general' scrape_interval: 30s metrics_path: /probe params: module: [http_2xx-general] static_configs: - targets: - https://mysite1.com - https://mysite2.com - http://mysite3.com # Target to probe with http. relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115 - job_name: 'blackbox-http_2xx-mysite4.com' scrape_interval: 30s metrics_path: /probe params: module: [http_2xx-mysite4.com] static_configs: - targets: #- http://mysite4.com # Target to probe with http. - https://mysite4.com # Target to probe with https. 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.Импортирование/настройка dashboard Grafana для визуализации метрик
4.Настрйка правил Prometheus для мониторинга доступности сайта, скорости ответа сайта
Добавляем правила для мониторинга доступности сайта, скорости ответа сайта, монитринга просроченного SSL-сертификата
1.Cайт mysite4.com недоступен вообще (site_down_mysite4.com) (т.е нет ответа в течение отведенного в проверке времени выполнения — в нашем случае 10 секунд (параметр timeout в конфигурационном файле Blackbox-экспортера для модуля http_2xx-mysite4.com))
2.Любой другой сайт(mysite1.com, mysite2.com, mysite3.com) кроме сайта mysite4.com(он мониторится вышеуказанным правилом) недоступен вообще (site_down) (т.е нет ответа в течение отведенного в проверке времени выполнения — в нашем случае 10 секунд (параметр timeout в конфигурационном файле Blackbox-экспортера для модуля http_2xx-general))
3.Время ответа(response time) от сайта слишком долгое(site_is_very_slow) — более 3-х секунд
4.Code-ответа от сайта не 2XX(http_status_code_not_200-299) (отредактируйте на допустимое кодs ответа в вашем случае)
5.SSL-сертификат станет просроченным через 30 дней(ssl_certificate_expire)
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 |
groups: - name: sites rules: - alert: site_down_mysite4.com expr: probe_success{instance="https://mysite4.com"} == 0 for: 1m labels: severity: critical annotations: summary: "Critical: site '{{ $labels.instance }}' isn't available for more than 1 minutes" description: "Site {{ $labels.instance }} isn't available(down)" - alert: site_down expr: probe_success{job="blackbox-http_2xx-general"} == 0 for: 3m labels: severity: critical annotations: summary: "Critical: Site '{{ $labels.instance }}' isn't available for more than 3 minutes" description: "Site {{ $labels.instance }} isn't available(down)" - alert: site_is_very_slow expr: sum by (instance) (probe_http_duration_seconds) > 3 for: 3m labels: severity: warning annotations: summary: "Warning: Site '{{ $labels.instance }}' is very slow(>3s) for more than 3 minutes" description: "Site {{ $labels.instance }} response for {{ humanize $value}}s" - alert: http_status_code_not_200-299 expr: probe_http_status_code <= 199 OR probe_http_status_code >= 300 for: 3m labels: severity: critical annotations: summary: "Critical: HTTP status code for the site '{{ $labels.instance }}' isn't 200-299 for more than 3 minutes" description: "HTTP status code is {{ $value }}" - alert: ssl_certificate_expire expr: probe_ssl_earliest_cert_expiry - time() < 86400 *30 for: 10m labels: severity: warning annotations: summary: "Warning: SSL certificate will expire soon for the site '{{ $labels.instance }}'" description: "SSL certificate expires in 30 days" |
Проверка синтаксиса конфиг.файла 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 запрос на перечитывание своего конф.файл blacbox-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) |
Источник:
https://github.com/prometheus/blackbox_exporter
https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md