Prometheus умеет собирать метрики с сервисов, но не отвечает на вопрос, доступен ли сервис снаружи. Для этого нужен активный зонд: он открывает URL, устанавливает TCP-соединение или отправляет ICMP-запрос и превращает результат в метрики. blackbox_exporter — штатный инструмент экосистемы Prometheus для такой проверки. Разберём его конфигурацию, подключение и типичные ошибки.
Модель multi-target
Экспортёр не хранит список целей. Вместо этого Prometheus при каждом опросе передаёт параметры target и module в URL /probe. Модуль описывает тип проверки: HTTP, TCP, ICMP или DNS. Один экземпляр экспортёра обслуживает произвольное число целей, а метрики получают метку instance с адресом проверяемого сервиса.
Такая схема экономит ресурсы и упрощает сопровождение: список целей живёт в конфигурации Prometheus, а не в отдельном файле экспортёра. Плата за гибкость — необходимость правильно настроить relabeling, иначе все пробы будут выглядеть как проверки самого экспортёра.
Установка
sudo apt update
sudo apt install prometheus-blackbox-exporter
systemctl status prometheus-blackbox-exporter --no-pager
ss -lntp | grep 9115
curl -s http://127.0.0.1:9115/metrics | head
В Debian, Ubuntu и Linux Mint пакет создаёт службу, пользователя и файл /etc/prometheus/blackbox.yml. Порт по умолчанию — 9115. Если пакета нет, используйте официальный релиз с GitHub и unit-файл systemd; принципы настройки не изменятся.
Не открывайте порт 9115 в интернет. Экспортёр умеет инициировать запросы к произвольным адресам, поэтому доступ к нему должен быть только у Prometheus и администратора.
Конфигурация модулей
Минимальный набор модулей покрывает большинство задач: проверка HTTP-кода, TCP-порт и ICMP.
modules:
http_2xx:
prober: http
timeout: 5s
http:
preferred_ip_protocol: ip4
ip_protocol_fallback: false
valid_status_codes: [200]
follow_redirects: true
tcp_connect:
prober: tcp
timeout: 3s
icmp:
prober: icmp
timeout: 3s
icmp:
preferred_ip_protocol: ip4
valid_status_codes задаёт допустимые ответы. Если сервис отвечает 204 или 301, их нужно перечислить явно, иначе проба будет считаться неуспешной. follow_redirects включает переходы, а preferred_ip_protocol и ip_protocol_fallback: false запрещают откат на другую версию IP — это помогает, когда IPv6 настроен не полностью и создаёт ложные срабатывания.
Для проверки DNS-сервера используется отдельный модуль: цель — адрес сервера, а имя запроса задаётся в конфигурации.
modules:
dns_udp:
prober: dns
timeout: 3s
dns:
query_name: linuxmint.su
query_type: A
preferred_ip_protocol: ip4
После правки проверьте синтаксис и перечитайте конфигурацию. Если unit не поддерживает reload, отправьте процессу SIGHUP вручную.
sudo prometheus-blackbox-exporter --config.check --config.file=/etc/prometheus/blackbox.yml
sudo systemctl reload prometheus-blackbox-exporter
sudo journalctl -u prometheus-blackbox-exporter -n 30 --no-pager
Проверка вручную
curl -s 'http://127.0.0.1:9115/probe?module=http_2xx&target=https://example.com' | grep -E 'probe_success|probe_duration_seconds'
curl -s 'http://127.0.0.1:9115/probe?module=tcp_connect&target=example.com:443' | grep probe_success
curl -s 'http://127.0.0.1:9115/probe?module=icmp&target=1.1.1.1' | grep probe_success
Ответ содержит метрики в формате Prometheus. probe_success 1 означает успех, 0 — ошибку. Рядом видны длительность, код ответа, версия HTTP и срок действия сертификата. Если проверка не проходит, добавьте &debug=true — экспортёр вернёт подробный лог попытки, включая ошибки DNS и TLS.
Подключение к Prometheus
scrape_configs:
- job_name: blackbox_http
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://linuxmint.su
- https://example.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115
Первый relabel переносит цель в параметр target, второй сохраняет её в метке instance, третий подменяет адрес опроса на сам экспортёр. Без третьего правила Prometheus попытается обратиться к проверяемому URL напрямую и не получит метрик зонда.
Для ICMP и TCP создайте отдельные задания с другим module: параметр params задаётся на уровне задания. Не смешивайте разные типы проверок в одном job_name, иначе алерты будет сложно читать.
- job_name: blackbox_icmp
metrics_path: /probe
params:
module: [icmp]
static_configs:
- targets: [192.0.2.10, 192.0.2.11]
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115
Права на ICMP
ICMP-пробы требуют сырых сокетов. Если служба работает не от root, выдайте бинарнику возможность CAP_NET_RAW либо настройте unit:
sudo setcap cap_net_raw+ep /usr/bin/prometheus-blackbox-exporter
getcap /usr/bin/prometheus-blackbox-exporter
sudo systemctl restart prometheus-blackbox-exporter
sudo journalctl -u prometheus-blackbox-exporter -n 20 --no-pager
В systemd надёжнее явно указать возможности в drop-in файле:
[Service]
AmbientCapabilities=CAP_NET_RAW
CapabilityBoundingSet=CAP_NET_RAW
После изменения выполните systemctl daemon-reload и перезапустите службу. Если в журнале остаётся operation not permitted, проверьте, что служба действительно работает под нужным пользователем и что NoNewPrivileges не конфликтует с выданными возможностями.
Алерты
groups:
- name: blackbox
rules:
- alert: ProbeFailed
expr: probe_success == 0
for: 3m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} недоступен"
- alert: TLSCertExpiring
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 21
for: 1h
labels:
severity: warning
annotations:
summary: "Сертификат {{ $labels.instance }} истекает меньше чем через 21 день"
Порог в три минуты отсекает случайные сетевые всплески. Для критичных сервисов можно снизить его до одной минуты, но тогда вырастет риск ложных срабатываний при перезапуске. Отдельный алерт на up == 0 нужен, чтобы отличать недоступность самого экспортёра от недоступности проверяемого сервиса.
Проверьте правила через promtool check rules blackbox-rules.yml и не забывайте, что при таймауте пробы метрика probe_success может отсутствовать. Для таких случаев помогает выражение с absent().
Метрики и диагностика
probe_success— итог проверки, 1 или 0.probe_duration_seconds— полное время выполнения.probe_http_status_code— код ответа HTTP.probe_ssl_earliest_cert_expiry— ближайшая дата истечения сертификата в цепочке.probe_dns_lookup_time_seconds— время разрешения имени.probe_ip_protocol— использованная версия IP.
Если проба стабильно возвращает 403, сервис может блокировать адрес экспортёра. Если ошибка связана с TLS, сравните цепочку с браузером: часто не хватает промежуточного сертификата. При таймаутах проверьте scrape_timeout в Prometheus — он должен быть больше timeout модуля, иначе Prometheus оборвёт запрос раньше, чем зонд завершится.
Чек-лист
- Оставьте экспортёр доступным только с хоста Prometheus.
- Опишите отдельные модули для HTTP, TCP, ICMP и DNS.
- Проверяйте конфигурацию через
--config.checkперед перезапуском. - Выдайте
CAP_NET_RAWтолько если используете ICMP. - Настройте relabeling и убедитесь, что метка
instanceсодержит цель. - Добавьте алерты на недоступность и срок сертификата.
- Проверьте, что
scrape_timeoutбольше таймаута модуля.
Итог
blackbox_exporter превращает внешние проверки в обычные метрики Prometheus: доступность, код ответа, задержку и состояние сертификата. Настройка сводится к трём шагам — описать модули, подключить их через relabeling и завести алерты. Начните с HTTP-пробы одного важного сайта, затем добавьте TCP и ICMP, и вы получите раннее предупреждение о проблемах, которые не видны из внутренних метрик приложения.