Blackbox exporter: мониторим внешние сервисы
Node Exporter отлично показывает состояние сервера изнутри. Но как узнать, что ваш сайт доступен снаружи, SSL-сертификат не истёк, а DNS правильно разрезолвается? Для этого существует Blackbox Exporter — инструмент Prometheus для проверки сервисов методом black-box тестирования.
Что умеет Blackbox Exporter
Blackbox Exporter поддерживает несколько типов проб:
- HTTP/HTTPS — проверка доступности, статус-кода, содержимого ответа, времени отклика
- TCP — проверка доступности TCP-порта
- ICMP — ping-мониторинг доступности хостов
- DNS — проверка корректности DNS-резолвинга
Конфигурация модулей
Файл blackbox.yml описывает модули — шаблоны проверок:
modules:
http_2xx:
prober: http
timeout: 10s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
valid_status_codes: [200, 201]
method: GET
follow_redirects: true
preferred_ip_protocol: "ip4"
tls_config:
insecure_skip_verify: false
http_post_json:
prober: http
timeout: 10s
http:
method: POST
headers:
Content-Type: application/json
body: '{"ping": "pong"}'
valid_status_codes: [200]
tcp_connect:
prober: tcp
timeout: 5s
icmp_ping:
prober: icmp
timeout: 5s
icmp:
preferred_ip_protocol: "ip4"
dns_check:
prober: dns
timeout: 5s
dns:
query_name: "example.com"
query_type: "A"
valid_rcodes: ["NOERROR"]
Интеграция с Prometheus
В prometheus.yml добавляем job с relabeling:
scrape_configs:
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://example.com
- https://api.example.com/health
- https://admin.example.com
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_tcp'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- postgres-server:5432
- redis-server:6379
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115
Алерт на истечение SSL-сертификата
Одна из самых полезных проверок — мониторинг срока действия SSL:
groups:
- name: ssl_certificates
rules:
- alert: SSLCertificateExpiringSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
for: 1h
labels:
severity: warning
annotations:
summary: "SSL сертификат истекает через {{ $value | humanizeDuration }}"
description: "Сертификат для {{ $labels.instance }} нужно обновить"
- alert: SSLCertificateExpired
expr: probe_ssl_earliest_cert_expiry - time() < 0
for: 0m
labels:
severity: critical
annotations:
summary: "SSL сертификат истёк для {{ $labels.instance }}"
Grafana дашборд
Ключевые метрики для дашборда:
probe_success— 1 если проба успешна, 0 если нет (главный индикатор)probe_duration_seconds— полное время выполнения пробыprobe_http_status_code— HTTP статус-код ответаprobe_ssl_earliest_cert_expiry— timestamp истечения сертификатаprobe_dns_lookup_time_seconds— время DNS-резолвинга
Хороший дашборд строится вокруг probe_success с drill-down в probe_duration_seconds по фазам: DNS lookup, TCP connect, TLS handshake, transfer.
Готовый дашборд с ID 7587 на Grafana.com покрывает большинство сценариев и подходит как отправная точка для кастомизации.
Blackbox Exporter — обязательный компонент зрелой системы мониторинга. Он закрывает слепую зону между внутренними метриками сервера и реальным пользовательским опытом.
Алерт на SSL очень выручает — один раз пропустил истечение сертификата на prod и с тех пор Blackbox обязателен в каждом проекте. Дополнительно мониторю ещё и intermediate сертификаты в цепочке.