Мониторинг приложений 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,