Интеграция Prometheus метрик в C++ приложения: библиотека prometheus-cpp

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Библиотека 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

Если ва

Рекомендаций