Мониторинг приложений C++: библиотеки и инструменты для сбора метрик

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

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

Начать курс

Мониторинг приложений C++: инструменты и библиотеки для сбора метрик и логирования

Разработка на C++ часто предполагает создание высоконагруженных систем, где производительность и стабильность критичны. Без качественного мониторинга невозможно быстро выявить узкие места, утечки памяти или аномальное поведение. В этой статье рассмотрим основные библиотеки и подходы для организации мониторинга C++-приложений — от сбора метрик до интеграции с популярными системами observability.

Зачем нужен мониторинг C++-приложений?

Ключевые задачи мониторинга:

  • Отслеживание использования CPU, памяти, диска и сети.
  • Измерение latency (задержки) обработки запросов.
  • Сбор количества ошибок и исключений.
  • Профилирование горячих точек (hot paths) в коде.
  • Автоматическое оповещение при достижении пороговых значений.

Основные библиотеки для мониторинга C++

1. Prometheus-CPP (prometheus-cpp)

Одна из самых популярных библиотек для сбора и экспорта метрик в формате Prometheus. Позволяет создавать счетчики (counter), гистограммы (histogram) и датчики (gauge).

Пример использования:

#include <prometheus/counter.h>
#include <prometheus/exposer.h>
#include <prometheus/registry.h>

// HTTP endpoint для сбора метрик
prometheus::Exposer exposer{"0.0.0.0:8080"};
auto registry = std::make_shared<prometheus::Registry>();

// Создаем счетчик
auto& counter_family = prometheus::BuildCounter()
    .Name("http_requests_total")
    .Help("Total HTTP requests")
    .Register(*registry);

auto& http_requests = counter_family.Add({{"method", "GET"}});

// Экспонируем метрики
exposer.RegisterCollectable(registry);

// Инкрементируем счетчик при каждом запросе
http_requests.Increment();

2. OpenTelemetry C++

Современный стандарт для сбора трассировок (traces), метрик и логов. OpenTelemetry для C++ предоставляет SDK для инструментирования кода и экспорта данных в любой бэкенд (Jaeger, Zipkin, Prometheus).

Пример настройки трассировки:

#include <opentelemetry/trace/provider.h>
#include <opentelemetry/exporters/otlp/otlp_http_exporter.h>
#include <opentelemetry/sdk/trace/tracer_provider.h>

// Инициализация экспортера
auto exporter = std::unique_ptr<opentelemetry::sdk::trace::SpanExporter>(
    new opentelemetry::exporter::otlp::OtlpHttpExporter());

auto processor = std::unique_ptr<opentelemetry::sdk::trace::SpanProcessor>(
    new opentelemetry::sdk::trace::SimpleSpanProcessor(std::move(exporter)));

auto provider = std::shared_ptr<opentelemetry::trace::TracerProvider>(
    new opentelemetry::sdk::trace::TracerProvider(std::move(processor)));

opentelemetry::trace::Provider::SetTracerProvider(provider);

// Создание спэна
auto tracer = provider->GetTracer("my_app");
auto span = tracer->StartSpan("process_request");
span->SetAttribute("user_id", 12345);
span->End();

3. spdlog + metrics

Хотя spdlog — это библиотека для логирования, её часто комбинируют с кастомными метриками. Например, можно логировать время выполнения функций и парсить логи сторонними инструментами (Filebeat + Elasticsearch).

Пример замера времени с spdlog:

#include <spdlog/spdlog.h>
#include <chrono>

void process_data() {
    auto start = std::chrono::high_resolution_clock::now();
    // ... бизнес-логика ...
    auto end = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
    spdlog::info("process_data took {} ms", duration.count());
}

4. Google Performance Tools (gperftools)

Набор инструментов для профилирования: CPU profiler, heap profiler и heap checker. Позволяет анализировать производительность без интеграции в код — достаточно запустить приложение с флагами.

Интеграция с системами мониторинга

Собранные метрики необходимо куда-то отправлять. Популярные варианты:

  • Prometheus — pull-модель: ваше приложение выступает HTTP-сервером, Prometheus регулярно забирает метрики.
  • Grafana — визуализация метрик из Prometheus,

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