Обычные Prometheus-экспортеры (node_exporter, postgres_exporter) отдают метрики изнутри процесса или хоста — то, что видно самому сервису о себе. blackbox_exporter смотрит снаружи: стучится в эндпоинт по HTTP/TCP/ICMP/DNS/gRPC и фиксирует, ответил ли он вообще и за сколько.

Список проверок (модулей) описывается в blackbox.yml — у каждого модуля свой prober, и указывается ровно одна секция с настройками под этот prober:

modules:
  http_2xx:
    prober: http
    http:
      preferred_ip_protocol: "ip4"
  tcp_connect:
    prober: tcp
  icmp:
    prober: icmp
  dns_check:
    prober: dns
    dns:
      query_name: "example.com"
      query_type: "A"

Сам экспортер метрики не копит сам по себе — Prometheus опрашивает его HTTP-эндпоинт /probe, передавая реальный таргет и имя модуля параметрами:

scrape_configs:
  - job_name: 'blackbox-http'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://example.com
          - https://api.internal.local/health
    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   # адрес самого blackbox_exporter

Та же схема relabel, что и у snmp_exporter — без неё все пробы в Prometheus улетят под адресом самого экспортера, а не проверяемого таргета.

Главная метрика — probe_success (1/0, прошла ли проверка) и probe_duration_seconds (сколько заняла). Для HTTP-модуля можно сузить критерий успеха — например, считать пробу проваленной, если в ответе нет TLS или тело не совпадает с ожидаемым регэкспом:

http_2xx:
  prober: http
  http:
    fail_if_not_ssl: true
    fail_if_body_not_matches_regexp:
      - "status.*ok"

Разница с обычными экспортерами принципиальная: node_exporter, упавший вместе с хостом, просто исчезает из метрик — Prometheus увидит отсутствие скрейпа. А blackbox_exporter, живущий отдельно (на другом хосте или хотя бы в другом процессе), продолжит отдавать probe_success=0 даже когда сам проверяемый сервис полностью недоступен — для алерта на “сайт лежит” это разница между “нет данных” и явным сигналом.

#prometheus #monitoring