Библиотека prometheus-cpp: Сбор метрик Prometheus в C++ приложениях
В современной разработке программного обеспечения мониторинг состояния приложений играет критическую роль. Prometheus — это система мониторинга и оповещения с открытым исходным кодом, которая собирает метрики с целевых объектов через HTTP-эндпоинты. Для интеграции Prometheus в проекты на C++ существует мощная и гибкая библиотека prometheus-cpp. Она позволяет разработчикам легко добавлять сбор метрик (счётчики, измерители, гистограммы) в свой код и экспортировать их в формате, понятном серверу Prometheus.
Что такое prometheus-cpp?
prometheus-cpp — это клиентская библиотека для Prometheus, написанная на C++17. Она предоставляет все необходимые инструменты для создания, обновления и экспорта метрик. Библиотека поддерживает три основных типа метрик, определённых в модели данных Prometheus:
- Counter (счётчик) — монотонно возрастающее значение (например, количество запросов, ошибок, выполненных задач).
- Gauge (измеритель) — значение, которое может произвольно увеличиваться и уменьшаться (например, текущая температура, количество активных подключений).
- Histogram (гистограмма) — распределение значений по предопределённым интервалам (например, время выполнения запроса).
Кроме того, поддерживаются Summary (квантили) и Family (группы метрик одного типа с разными метками).
Установка и подключение
Библиотека распространяется через пакетные менеджеры (vcpkg, Conan) или собирается из исходников. Пример установки через vcpkg:
vcpkg install prometheus-cpp
После установки в файле CMakeLists.txt необходимо подключить библиотеку:
find_package(prometheus-cpp CONFIG REQUIRED)
target_link_libraries(your_target PRIVATE prometheus-cpp::push prometheus-cpp::pull prometheus-cpp::core)
Здесь push используется для отправки метрик на Pushgateway, pull — для создания HTTP-сервера, с которого Prometheus будет забирать метрики, а core содержит основные классы (Registry, Counter, Gauge, Histogram).
Пример использования: HTTP-сервер для сбора метрик
Рассмотрим простой пример, создающий HTTP-сервер на порту 8080, который отдаёт метрики в формате Prometheus. Для работы с HTTP используется встроенный в библиотеку механизм на основе simple-web-server или libmicrohttpd.
#include <prometheus/exposer.h>
#include <prometheus/registry.h>
#include <prometheus/counter.h>
#include <prometheus/gauge.h>
#include <prometheus/histogram.h>
#include <thread>
#include <chrono>
int main() {
// Создаём HTTP-сервер на порту 8080
prometheus::Exposer exposer{"0.0.0.0:8080"};
// Создаём реестр метрик
auto registry = std::make_shared<prometheus::Registry>();
// 1. Counter (счётчик)
auto& counter_family = prometheus::BuildCounter()
.Name("http_requests_total")
.Help("Total number of HTTP requests")
.Register(*registry);
auto& counter = counter_family.Add({{"method", "GET"}, {"endpoint", "/api"}});
// 2. Gauge (измеритель)
auto& gauge_family = prometheus::BuildGauge()
.Name("memory_usage_bytes")
.Help("Current memory usage in bytes")
.Register(*registry);
auto& gauge = gauge_family.Add({});
// 3. Histogram (гистограмма)
auto& histogram_family = prometheus::BuildHistogram()
.Name("request_duration_seconds")
.Help("Request duration in seconds")
.Buckets({0.1, 0.5, 1.0, 2.5, 5.0})
.Register(*registry);
auto& histogram = histogram_family.Add({{"handler", "process"}});
// Регистрируем реестр в экспозере
exposer.RegisterCollectable(registry);
// Имитация работы приложения
while (true) {
// Увеличиваем счётчик
counter.Increment();
// Обновляем измеритель (симулируем изменение памяти)
gauge.Set(rand() % 1024);
// Записываем наблюдение в гистограмму
histogram.Observe(0.3);
std::this_thread::sleep_for(std::chrono::seconds(2));
}
return 0;
}
После запуска этого кода, перейдя по адресу http://localhost:8080/metrics, вы увидите все метрики в формате, ожидаемом Prometheus.
Экспорт метрик в Pushgateway
Если ва