Как организовать мониторинг доступности внешних хостов и сервисов?

«Как организовать мониторинг доступности внешних хостов и сервисов?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps для мониторинга внешних ресурсов (сторонние API, CDN, DNS-провайдеры) мы используем специализированные инструменты, а не разовые команды. Вот стек и подход.

1. Использование Prometheus Blackbox Exporter (стандарт для мониторинга изнутри сети): Blackbox Exporter — это специальный прокми-экспортер, который «звонит» наружу и возвращает метрики.

  • Конфигурация (blackbox.yml): Определяем модули проверок.
    modules:
      http_external_2xx:
        prober: http
        timeout: 10s
        http:
          valid_status_codes: [200]
          fail_if_ssl: false
          fail_if_not_ssl: false
      tcp_external:
        prober: tcp
        tcp:
          preferred_ip_protocol: "ip4"
      dns_external:
        prober: dns
        dns:
          query_name: "example.com"
          query_type: "A"
          valid_rcodes: [NOERROR]
  • Задачи в Prometheus (prometheus.yml):
    scrape_configs:
      - job_name: 'blackbox-external'
        metrics_path: /probe
        params:
          module: [http_external_2xx]
        static_configs:
          - targets:
            - https://api.external-service.com/health
            - https://cdn.provider.com/
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - source_labels: [__param_target]
            target_label: instance
          - target_label: __address__
            replacement: blackbox-exporter:9115  # Адрес экспортера

    Теперь в Prometheus есть метрика probe_success{instance="https://api.external-service.com/health"}, где 1 — доступно, 0 — нет.

2. Настройка алертов в Alertmanager: Создаем правило алерта, если сервис недоступен 2 минуты.

    groups:
      - name: external-services.rules
        rules:
        - alert: ExternalServiceDown
          expr: probe_success{job="blackbox-external"} == 0
          for: 2m
          labels:
            severity: critical
          annotations:
            summary: "External service {{ $labels.instance }} is down"
            description: "The external service {{ $labels.instance }} has been unreachable for more than 2 minutes."

3. Синтетический мониторинг извне (Grafana Synthetic Monitoring / Checkmk): Чтобы проверить доступность так, как ее видят конечные пользователи, настраиваю проверки из нескольких точек мира (AWS regions, GCP zones). Это помогает обнаружить проблемы с конкретным ISP или регионом.

4. Резервные проверки через простые скрипты: Для ad-hoc проверок или в скриптах деплоя использую curl с таймаутами и обработкой ошибок:

    if ! curl -sSf --max-time 10 https://critical-dependency.com/health > /dev/null; then
      echo "CRITICAL: External dependency is down. Aborting deployment."
      exit 1
    fi