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;

// 在端口 8080 上创建 HTTP 服务器 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++ 中最快的日志库(仅头文件、异步模式)。



#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-&

推荐