Понадобилось снимать метрики с Icecast-сервера в Prometheus, а готовый экспортер от markuslindenberg/icecast_exporter оказался заброшен, да еще и падает на реальных данных, когда Icecast иногда отдаёт битый JSON. Таки форкнул проект и переписал, (автор не принимает PR-ы).
Старый экспортер написан под древний Go, тянет устаревшие зависимости и падает при первом же кривом ответе от Icecast — а Icecast кривит JSON регулярно, стоит источнику отправить нестандартный битрейт или семплрейт строкой вместо числа. Плюс поле source в статусе может быть массивом, одиночным объектом или вовсе отсутствовать — оригинал такое не всегда переваривает.
Что сделал
- санитизация JSON перед парсингом: неправильно квотированные значения оборачиваются в кавычки, валидный JSON при этом не трогается.
- нормализация поля source под все три формы.
- новые метрики: суммарное число слушателей, пиковые слушатели, битрейт, число активных источников, инфа о сервере.
- вместо старого логгера, актуальный go.mod — Go 1.24+.
- ручка /healthz для healthcheck и нормальный graceful shutdown.
- многоэтапная сборка в Docker с итоговым образом на scratch.
Метрики
Из нового и полезного:
icecast_listener_peak | gauge | listenurl, server_type | Пик слушателей на точку монтирования. (новая) |
icecast_bitrate | gauge | listenurl, server_type | Битрейт источника (кбит/с). (новая) |
icecast_source_count | gauge | — | Число активных источников. (новая) |
Запуск
docker pull vladios13/icecast_exporter
docker run --rm -p 9146:9146 vladios13/icecast_exporter \
-icecast.scrape-uri http://192.168.10.1:9804/status-json.xsl
Через docker compose сервис ограничен 64 МБ ОЗУ, поднимается с restart: unless-stopped и встроенным healthcheck — для мониторящей утилитки этого достаточно с запасом.