Icecast exporter для Prometheus

Понадобилось снимать метрики с 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_peakgaugelistenurl, server_typeПик слушателей на точку монтирования. (новая)
icecast_bitrategaugelistenurl, server_typeБитрейт источника (кбит/с). (новая)
icecast_source_countgauge—Число активных источников. (новая)

Запуск

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 — для мониторящей утилитки этого достаточно с запасом.

Ссылки:

— [Репозиторий на Github]
— [Образ на Docker Hub]

Автор

vladios13

IT-шник, интернетчик.