Экспортёр метрик не запускается: порт занят
Экспортёры метрик — простые службы, и почти все их отказы сводятся к занятому порту или неверному адресу привязки. Вторая по частоте причина — отсутствие прав на чтение системных данных при жёсткой изоляции.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Порт занят другим экземпляром
Экспортёр мог быть установлен двумя способами: пакетом и вручную. Обе службы пытаются занять один порт.
-
Указан адрес, которого нет на машине
Привязка к конкретному адресу удобна для ограничения доступа, но при смене адресации ломает запуск.
-
Изоляция закрывает доступ к системным данным
Экспортёру нужны /proc и /sys. Параметры вроде
ProtectProc=invisibleилиPrivateDevices=yesломают сбор части метрик.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Кто занимает порт экспортёра.
sudo ss -tlnp | grep 9100Отвечает ли экспортёр и отдаёт ли метрики.
curl -s localhost:9100/metrics | head -5Сообщения при запуске.
journalctl -u node_exporter -n 30 --no-pagerРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Экспортёр мог быть установлен двумя способами: пакетом и вручную. Обе службы пытаются занять один порт.
- Как проверить
-
Посмотрите владельца порта и все связанные unit.
sudo ss -tlnp | grep 9100 systemctl list-unit-files "*exporter*" --no-pager
- Как исправить
- Оставьте один способ установки, лишнюю службу отключите полностью.
- Почему происходит
- Привязка к конкретному адресу удобна для ограничения доступа, но при смене адресации ломает запуск.
- Как проверить
-
Сравните адрес из ключей с адресами машины.
systemctl cat node_exporter | grep -i "web.listen" ip -brief addr
- Как исправить
- Слушайте на нужном адресе, который действительно есть, либо ограничивайте доступ брандмауэром.
- Почему происходит
- Экспортёру нужны /proc и /sys. Параметры вроде
ProtectProc=invisibleилиPrivateDevices=yesломают сбор части метрик.
- Как проверить
-
Посмотрите параметры изоляции и журнал.
systemctl show node_exporter | grep -E "Protect|Private" journalctl -u node_exporter -n 30 --no-pager | grep -i "permission\|error"
- Как исправить
- Ослабьте точечно те параметры, которые мешают сбору нужных метрик.
Пример вывода
Порт занят вторым экземпляром экспортёра. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
node_exporter[4500]: caller=tls_config.go:274 level=info msg="Listening on" address=[::]:9100
node_exporter[4500]: caller=main.go:239 level=error err="listen tcp :9100: bind: address already in use"
systemd[1]: node_exporter.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Apache: could not bind to address Apache не занимает порт: конфликт с nginx, порт занят, нет прав на привилегированный порт.
- BIND: порт 53 занят systemd-resolved named не может занять порт 53: его держит локальный разрешатель имён. Как развести их по адресам.
- Caddy не занимает порты 80 и 443 без прав Служба падает при открытии слушателя: нет возможности занимать привилегированные порты.
- Grafana: расширение не загружается из-за подписи Расширение не появляется в интерфейсе: не подписано или подпись не совпадает. Как разрешить осознанно.
- PostgreSQL: could not bind IPv4 address Кластер PostgreSQL не занимает порт: адрес занят другим экземпляром или остался файл сокета. Разбор.
Источники
- Документация Prometheus: node_exporter
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено двумя установленными экземплярами экспортёра.