Мониторинг приложений на 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:
- Поддержка ротации логов по размеру/времени <
Также в библиотеке
Конфигурация приложений Swift (iOS/macOS): библиотеки и инструменты
Валидация данных в C# (.NET) с FluentValidation: полное руководство