Prometheus (программное обеспечение)
Prometheus — свободное программное обеспечение для мониторинга событий и оповещения[1]. Система собирает метрики в базе данных временных рядов (с поддержкой высокой размерности метаданных), построенной на модели опроса по HTTP, с возможностью выполнения сложных запросов и настройкой оповещений в реальном времени[2].[3] Проект написан на языке Go и распространяется под лицензией Apache 2.0; исходный код доступен на GitHub[4].
Общие сведения
| Prometheus | |
|---|---|
| Тип | СУБД временных рядов |
| Написана на | Go |
| Операционная система | мультиплатформенное |
| Первый выпуск | 24 ноября 2012 |
| Аппаратные платформы | x86_64, IA-32, MIPS, PowerPC и ARM |
| Последняя версия | v3.2.1 (26 февраля 2025) |
| Репозиторий | github.com/prometheus/pr… |
| Лицензия | Apache License 2.0 |
| Сайт | prometheus.io |
История
Разработка Prometheus началась в компании SoundCloud в 2012 году[5], когда стало ясно, что существовавшие инструменты мониторинга и метрик (StatsD, Graphite) не удовлетворяют их требованиям. В частности, отмечалась необходимость поддержки многомерной модели данных, простоты эксплуатации, масштабируемого сбора данных и мощного языка запросов — всё это в одном инструменте[6]. Проект изначально был открытым и начал использоваться, помимо SoundCloud, также компаниями Boxever и Docker, несмотря на отсутствие официального анонса[6].[7] На Prometheus повлиял внутренний инструмент мониторинга Borgmon, используемый в Google[8].
В 2013 году Prometheus стал использоваться в продакшене в SoundCloud[6]. Официальный публичный анонс состоялся в январе 2015 года[6]
В мае 2016 года Cloud Native Computing Foundation (CNCF) приняла Prometheus в качестве своего второго инкубируемого проекта после Kubernetes.[9]. В августе 2018 года CNCF объявила о завершении процесса «выпуска» проекта всё в том же фонде[10].
Prometheus 1.0 был выпущен в июле 2016 года[11]. Последующие версии выходили в ходе 2016 и 2017 годов; в ноябре 2017 года появилась версия 2.0[12].
| Версия | Дата | Ветка/статус | Источник |
|---|---|---|---|
| 1.0 | июль 2016 | стабильная | [11] |
| 2.0 | ноябрь 2017 | стабильная | [12] |
| v3.2.1 | 26 февраля 2025 | стабильная | [13] |
Архитектура
Типичная система мониторинга на базе Prometheus состоит из нескольких компонентов:
- Несколько экспортёров метрик, запускаемых на целевых хостах.
- Сервер Prometheus для централизованного сбора и хранения метрик.
- Служба Alertmanager[14] для управления оповещениями.
- Grafana для построения дашбордов.
- Язык запросов PromQL для построения графиков и настройки оповещений.
Данные Prometheus хранятся в виде метрик, каждая из которых имеет имя (для обращения и запросов). Произвольное количество пар ключ=значение («лейблы») позволяют уточнять источник и детали метрики (например, какой сервер, HTTP-код ответа, способ запроса — GET/POST, endpoint и т. д.). Такая система организации и оперативных запросов объясняет, почему модель данных Prometheus называют многомерной[15].[6][7]
Данные сохраняются локально на диске для быстрой записи и запросов[6] Также поддерживается выгрузка метрик во внешние хранилища.[16].
Prometheus собирает данные в виде временных рядов, строя их по pull-модели — сервер опрашивает заданный список источников (экспортёров) с заданной частотой. Каждый источник отдаёт актуальные значения метрик на свой endpoint, Prometheus агрегирует их[6] Имеются механизмы автоматического обнаружения ресурсов для сбора метрик.[17].
Prometheus предоставляет собственный язык запросов PromQL (Prometheus Query Language), позволяющий гибко выбирать и агрегировать данные. PromQL оптимизирован для работы с базами временных рядов и реализует расширенные функции по работе со временем. Примеры: функция, вектора-срезы по времени, обработка скользящих (range vector) и мгновенных (instant vector) выборок[18]. Структура системы строится вокруг четырёх типов метрик:[19]
- Gauge (измеряемое значение)
- Counter (счётчик)
- Histogram (гистограмма)
- Summary (суммарная статистика)
# Метрика с фильтрацией по лейблам
go_gc_duration_seconds{instance="localhost:9090", job="alertmanager"}
# Операторы агрегации
sum by (app, proc) (
instance_memory_limit_bytes - instance_memory_usage_bytes
) / 1024 / 1024
В конфигурации Prometheus можно задавать условия и длительность, при которых срабатывает оповещение. По наступлении условия алерт пересылается в сервис Alertmanager. Alertmanager поддерживает подавление оповещений и их релей на email, Slack и системы уведомлений вроде PagerDuty[21]. Дополнительно интеграция возможна с мессенджерами вроде Microsoft Teams[22] через Webhook Receiver[23], а также возможна отправка алертов напрямую на Android-устройства даже без настройки целей в Alertmanager[24].
В Prometheus реализована собственная система хранения временных рядов: свежие данные (по умолчанию 1-3 часа) размещаются одновременно в памяти[25] и в файлах на диске с использованием mmap[26], а для долговременного хранения метрик используется блочный формат[27] с обратным индексом. Такая организация удобна для паттернов запросов Prometheus[28]. В ходе фонового обслуживания мелкие блоки консолидируются в крупные (compaction)[29] для ускорения обработки запросов. Используется также журнал предзаписи (WAL) для устойчивости к сбоям[30].
Prometheus не предназначен для полноценных дашбордов — он может строить отдельные простые графики по запросу, но для построения комплексных дашбордов используется Grafana (что иногда критикуется из-за необходимости дополнительной настройки)[31].
Prometheus ориентирован на white-box-мониторинг — приложения интегрируют экспортёр метрик, который собирает данные и отдаёт их Prometheus[32]. Для популярных приложений существуют готовые экспортёры и агенты[33]. Кроме того, Prometheus поддерживает мониторинговые и административные протоколы для интеграции и миграции: Graphite, StatsD, SNMP, JMX, CollectD.
Основной акцент сделан на доступности платформы и базовых операциях[34]. Метрики обычно хранятся несколько недель; для долговременного хранения их можно выгружать во внешние хранилища[16]
Существуют инициативы по стандартизации формата экспорта Prometheus под названием OpenMetrics.[35]. Формат внедрён в ряде продуктов: в Telegraf от InfluxData[36], InfluxDB, Google Cloud Platform[37], DataDog[38] и New Relic[39].[40]
Примечания
Литература
- Russ, McKendrick. Monitoring Docker: мониторинг контейнеров Docker и их приложений с помощью нативных и сторонних инструментов : [англ.]. — Birmingham, UK, 15 декабря 2015. — ISBN 9781785885501.
- JOSEPH., HECK. KUBERNETES FOR DEVELOPERS: использование Kubernetes для разработки, тестирования и развертывания приложений в контейнерах : [англ.]. — [S.l.] : PACKT PUBLISHING, 2018. — ISBN 978-1788830607.
- Burns, Brendan. Designing distributed systems: паттерны и парадигмы для масштабируемых, надёжных сервисов : [англ.]. — Первое. — Sebastopol, CA, 20 февраля 2018. — ISBN 9781491983614.
- Martin., Helmich. Cloud Native programming with Golang. Разработка веб-приложений и микросервисов для облака на Go : [англ.]. — Birmingham : Packt Publishing, 2017. — ISBN 9781787127968.
- Alok, Shrivastwa. Hybrid cloud for architects: создание надёжных гибридных облачных решений на базе AWS и OpenStack : [англ.]. — Birmingham, UK, 23 февраля 2018. — ISBN 9781788627986.
- Kaewkasi, Chanwit. Native Docker Clustering with Swarm : [англ.]. — Packt Publishing, Limited, 2016. — ISBN 978-1786469755.