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 分析器、堆分析器和堆