Prometheus не собирает метрики: цель недоступна
Состояние цели down означает неудачу сбора, а не отказ самой службы. Причины делятся на три группы: адрес прослушивания, доступность порта и таймаут сбора. Разбор идёт со стороны сборщика, а не наблюдаемой службы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служба слушает только петлевой адрес
Отдающая метрики служба привязана к петлевому адресу, а сборщик обращается с другой машины. Соединения не будет.
-
Порт закрыт брандмауэром
Соединение отбрасывается, сборщик получает таймаут. Со стороны наблюдаемой машины при этом всё выглядит нормально.
-
Сбор не успевает за отведённое время
Если отдача метрик занимает больше таймаута сбора, цель помечается недоступной при работающей службе.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Отвечает ли цель и как быстро.
curl -s -o /dev/null -w "%{http_code} %{time_total}\n" http://узел:9100/metricsНа каком адресе слушает отдающая служба.
sudo ss -tlnp | grep :9100Сообщения сборщика о неудачах сбора.
journalctl -u prometheus -n 30 --no-pager | grep -iE "scrape|target"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Отдающая метрики служба привязана к петлевому адресу, а сборщик обращается с другой машины. Соединения не будет.
- Как проверить
-
Посмотрите, на каком адресе слушает служба.
sudo ss -tlnp | grep -E ":9100|:9090" systemctl cat node-exporter 2>/dev/null | grep -i "web.listen"
- Как исправить
- Привяжите отдающую службу к нужному адресу или собирайте метрики через туннель. Открывать её во внешнюю сеть без ограничения доступа не стоит: метрики раскрывают устройство системы.
- Почему происходит
- Соединение отбрасывается, сборщик получает таймаут. Со стороны наблюдаемой машины при этом всё выглядит нормально.
- Как проверить
-
Проверьте доступность порта со стороны сборщика.
timeout 5 bash -c "</dev/tcp/наблюдаемый-узел/9100" && echo открыт || echo закрыт
- Как исправить
- Откройте порт только для адреса сборщика. Правило для всей сети здесь не нужно.
- Почему происходит
- Если отдача метрик занимает больше таймаута сбора, цель помечается недоступной при работающей службе.
- Как проверить
-
Посмотрите время ответа и таймаут.
curl -s -o /dev/null -w '%{time_total}\n' http://наблюдаемый-узел:9100/metrics grep -iE 'scrape_timeout|scrape_interval' /etc/prometheus/prometheus.yml 2>/dev/null
- Как исправить
- Увеличьте таймаут сбора или уменьшите объём отдаваемых метрик. Таймаут больше интервала сбора задавать нельзя.
Пример вывода
Отдающая служба слушает только петлевой адрес. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
prometheus[6500]: level=warn msg="Error on ingesting samples" scrape_pool=node target=http://10.0.0.5:9100/metrics err="Get \"http://10.0.0.5:9100/metrics\": dial tcp 10.0.0.5:9100: connect: connection refused"
# на наблюдаемой машине:
$ sudo ss -tlnp | grep :9100
LISTEN 0 4096 127.0.0.1:9100 0.0.0.0:* users:(("node_exporter",pid=980,fd=3))
Связанные ошибки
- Экспортёр метрик не запускается: порт занят node_exporter и подобные службы мониторинга не поднимаются из-за занятого порта 9100 или неверного адреса привязки.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
- Connection reset by peer в журнале службы Соединение сброшено другой стороной: обрыв клиента, перезапуск сервера, промежуточное устройство.
- Connection timed out в журнале службы Соединение не устанавливается по таймауту: пакеты отбрасываются, узел недоступен, перегружен сервер на другой стороне.
Где встречается чаще всего
Источники
- Документация Prometheus: сбор метрик
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено привязкой отдающей службы к петлевому адресу.