使用 metrics 库监控 C++ 应用程序
在开发高负载和关键任务的 C++ 系统时,离不开高质量的监控。跟踪性能、发现瓶颈以及对故障做出快速响应是 DevOps 和开发人员的关键任务。metrics 库(也称为 cppmetrics)提供了一种轻量且高效的方式,可以直接从 C++ 代码中收集、聚合和导出指标。
在本文中,我们将分析该库的主要功能、其架构、展示使用示例,并介绍如何将其与 Prometheus 等数据收集系统集成。
什么是 metrics 库?
metrics 是一个用于 C++(C++11 及以上版本)的仅头文件库,它实现了来自 Dropwizard Metrics(Java)的流行指标类型。它包括:
- 计数器 (Counters) — 用于计数事件(例如,请求数量)。
- 瞬时值 (Gauges) — 用于即时值(当前 CPU 负载、队列大小)。
- 直方图 (Histograms) — 用于分析值分布(响应时间、数据包大小)。
- 计时器 (Timers) — 计数器和直方图的组合,用于测量操作持续时间。
- 速率表 (Meters) — 测量事件速率(每秒请求数)。
该库支持线程安全、可配置的采样池(例如,指数衰减)以及以 JSON、Prometheus、Graphite 格式导出指标。
安装与集成
由于该库是仅头文件库,安装只需将头文件复制到您的项目中。您可以使用 CMake FetchContent 或直接将 metrics 文件夹复制到 include 目录:
#include <metrics/metrics.hpp>要使用 Prometheus,还需要安装 prometheus-cpp(可选)。
使用示例:基本指标
考虑一个简单的 HTTP 服务器,它计算请求数量并测量处理时间。
#include <metrics/metrics.hpp>#include <iostream>#include <thread>#include <chrono>
using namespace metrics;
// 创建指标注册表MetricsRegistry registry("my_app");
// 定义计数器和计时器Counter& request_counter = registry.counter("http.requests.total");Timer& request_timer = registry.timer("http.requests.duration");
void handle_request() { auto context = request_timer.create_context(); // 启动计时器 request_counter.increment(); // 增加计数器
// 模拟处理 std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 100));
// 当 context 销毁时自动记录时间}
int main() { for (int i = 0; i < 100; ++i) { handle_request(); }
// 将指标输出到控制台 (JSON) std::cout << registry.report_json() << std::endl; return 0;}结果您将得到一个包含计数器以及处理时间的第 50、75、95 和 99 百分位数的 JSON。
将指标导出到 Prometheus
为了与 Prometheus 集成,该库提供了一个单独的模块 metrics_prometheus。配置端点的示例:
#include <metrics/metrics.hpp>#include <metrics/prometheus/prometheus_collector.hpp>#include <metrics/prometheus/prometheus_server.hpp>
using namespace metrics;
int main() { MetricsRegistry registry("my_service"); // ... 注册指标 ...
// 在端口 8080 上创建 HTTP 服务器 PrometheusServer server(registry, 8080); server.start();
std::cout << "Prometheus metrics available a