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

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

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

Начать курс

Мониторинг приложений на C++: зачем и как это делать

Мониторинг — неотъемлемая часть разработки и эксплуатации любого серьёзного приложения на C++. Без него вы остаётесь слепы: не знаете, сколько памяти потребляет программа, какие функции тормозят, не падает ли сервер под нагрузкой. В этой статье мы разберём ключевые библиотеки и инструменты для мониторинга C++ приложений — от сбора метрик до профилирования и логирования.

1. Сбор системных метрик: Prometheus Client for C++

Если ваше приложение работает как микросервис или часть распределённой системы, вам нужна инфраструктура сбора метрик. Prometheus — стандарт де-факто. Для C++ существует официальный клиент prometheus-cpp.

Библиотека позволяет создавать счётчики, гистограммы, суммарные метрики (Summary) и экспонировать их через HTTP-эндпоинт, который будет опрашивать сервер Prometheus.

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

int main() {
    using namespace prometheus;

    // Создаём HTTP-сервер на порту 8080
    Exposer exposer{"0.0.0.0:8080"};

    // Регистрируем метрики
    auto registry = std::make_shared<Registry>();
    auto& counter_family = BuildCounter()
        .Name("http_requests_total")
        .Help("Total number of HTTP requests")
        .Register(*registry);

    auto& counter = counter_family.Add({{"method", "GET"}, {"endpoint", "/api"}});

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

    // Эмуляция запросов
    for (int i = 0; i < 100; ++i) {
        counter.Increment();
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }

    return 0;
}

Плюсы:

  • Нативная интеграция с экосистемой Prometheus/Grafana
  • Поддержка гистограмм и квантилей
  • Асинхронный экспорт без блокировки основного потока

Минусы:

  • Требует настройки сервера Prometheus и Grafana для визуализации
  • Не подходит для встраиваемых систем с ограниченной памятью

2. Профилирование производительности: Google Benchmark

Для точного измерения времени выполнения отдельных участков кода (бенчмарков) используйте Google Benchmark. Это не мониторинг в реальном времени, но незаменимый инструмент для регрессионного тестирования производительности.

#include <benchmark/benchmark.h>

static void BM_StringCreation(benchmark::State& state) {
    for (auto _ : state) {
        std::string empty_string;
    }
}
BENCHMARK(BM_StringCreation);

static void BM_StringCopy(benchmark::State& state) {
    std::string x = "hello";
    for (auto _ : state) {
        std::string copy(x);
    }
}
BENCHMARK(BM_StringCopy);

BENCHMARK_MAIN();

Возможности:

  • Автоматический расчёт среднего, медианы, стандартного отклонения
  • Поддержка многопоточных бенчмарков
  • Генерация отчётов в формате JSON, CSV, консоль
  • Интеграция с CI/CD (можно сравнивать результаты с эталонными)

3. Логирование: spdlog

Логи — основа мониторинга ошибок и аномалий. spdlog — самая быстрая библиотека логирования для C++ (header-only, асинхронный режим).

#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>

int main() {
    // Создаём логгер с записью в файл
    auto logger = spdlog::basic_logger_mt("file_logger", "logs/app.log");

    // Устанавливаем уровень логирования
    spdlog::set_level(spdlog::level::info);

    // Логи с разными уровнями
    logger->info("Приложение запущено, версия {}", 1.0);
    logger->warn("Память близка к пределу: {} MB", 512);
    logger->error("Ошибка подключения к базе данных: {}", errno);

    // Асинхронный режим (рекомендуется для продакшна)
    spdlog::flush_every(std::chrono::seconds(3));
    return 0;
}

Преимущества spdlog:

  • Поддержка ротации логов по размеру/времени
  • <

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