C++ 应用监控:用于收集指标的库和工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C++ 应用监控:用于收集指标和日志记录的库和工具



C++ 开发通常涉及创建高负载系统,其中性能和稳定性至关重要。没有高质量的监控,就无法快速识别瓶颈、内存泄漏或异常行为。本文将介绍用于组织 C++ 应用监控的主要库和方法——从指标收集到与流行可观测性系统的集成。



为什么需要监控 C++ 应用?

监控的关键任务:

  • 跟踪 CPU、内存、磁盘和网络的使用情况。
  • 测量请求处理的延迟。
  • 收集错误和异常的数量。
  • 对代码中的热点路径进行性能分析。
  • 在达到阈值时自动发出警报。


用于 C++ 监控的主要库



1. Prometheus-CPP (prometheus-cpp)

用于以 Prometheus 格式收集和导出指标的最流行库之一。允许创建计数器、直方图和仪表。

使用示例:

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

// 用于收集指标的 HTTP 端点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++

用于收集追踪、指标和日志的现代标准。OpenTelemetry for C++ 提供了用于代码插桩和将数据导出到任何后端(Jaeger、Zipkin、Prometheus)的 SDK。

追踪配置示例:

#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);

// 创建 spanauto 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 分析器、堆分析器和堆

推荐