Prometheus в systemd: почему не поднимается
Prometheus проверяет свой файл настроек при запуске и отказывается стартовать при любой ошибке в нём. Вторая частая причина — права на каталог данных, третья — оставшаяся блокировка после аварийного завершения.
О службе
Файл настроек в формате YAML, и отступы в нём значимы. Проверять его лучше отдельной утилитой из комплекта Prometheus, а не перезапуском службы: она печатает файл, строку и суть ошибки.
Каталог данных содержит блокировку: второй экземпляр на тех же данных не запустится. Это защита от порчи базы метрик, и обходить её удалением файла блокировки при работающем процессе нельзя.
Как устроена
| Файл настроек | /etc/prometheus/prometheus.yml, формат YAML |
|---|---|
| Проверка настроек | promtool check config /etc/prometheus/prometheus.yml |
| Каталог данных | задаётся ключом --storage.tsdb.path, обычно /var/lib/prometheus |
| Порт по умолчанию | 9090 |
| Перезагрузка настроек | сигнал HUP или запрос к /-/reload при включённом ключе |
Частые ошибки
9 записей базы отмечены за этой службой.
Коды выхода
- status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
Сообщения журнала
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
Ресурсы и ограничения
- No space left on device в журнале службыНет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- Too many open files в журнале службыСлужба исчерпала лимит файловых дескрипторов. Как правильно поднять LimitNOFILE и когда дело в утечке.
Ошибки служб
- Prometheus не собирает метрики: цель недоступнаЦель в состоянии down: служба не слушает нужный адрес, закрыт порт или обрывается по таймауту сбора.
- Prometheus: каталог данных занят другим экземпляромСлужба не запускается: блокировка каталога данных после аварийного завершения или второй экземпляр.
- Оповещения не уходят: настройки не перечиталисьПравка настроек оповещений не применилась: перезагрузка отказала, а служба продолжает работать с прежними.
- Панели и источники данных не подхватываются при запускеОписания источников и панелей не применяются: каталог недоступен службе или описания с ошибкой.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
Диагностика
Проверка настроек с указанием строки ошибки.
promtool check config /etc/prometheus/prometheus.ymlСостояние и последние строки журнала.
systemctl status prometheus --no-pager -lПрава на каталог данных и место.
sudo ls -ld /var/lib/prometheus && df -h /var/lib/prometheusОтвечает ли служба.
curl -s localhost:9090/-/healthyПараметры unit, которые тут важны
- User=служба работает от prometheus, каталог данных должен принадлежать ему
- LimitNOFILE=много открытых файлов блоков метрик
- ExecReload=перезагрузка настроек сигналом без перезапуска
- StateDirectory=каталог данных удобно объявлять через параметр systemd
Источники
- Документация Prometheus: настройка
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)