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, и вы получите раннее предупреждение о проблемах, которые не видны из внутренних метрик приложения.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте