在C++应用中集成Prometheus指标:prometheus-cpp库

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

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

开始课程

prometheus-cpp库:在C++应用中收集Prometheus指标



在现代软件开发中,应用状态监控起着关键作用。Prometheus 是一个开源的监控和告警系统,它通过HTTP端点从目标对象收集指标。为了将Prometheus集成到C++项目中,存在一个强大且灵活的库 prometheus-cpp。它允许开发者轻松地在代码中添加指标收集(计数器、测量仪、直方图),并以Prometheus服务器可理解的格式导出它们。



什么是prometheus-cpp?



prometheus-cpp 是一个用C++17编写的Prometheus客户端库。它提供了创建、更新和导出指标所需的所有工具。该库支持Prometheus数据模型中定义的三种主要指标类型:



  • Counter(计数器)——单调递增的值(例如,请求数、错误数、完成任务数)。
  • Gauge(测量仪)——可以任意增加和减少的值(例如,当前温度、活跃连接数)。
  • Histogram(直方图)——按预定义区间分布的值(例如,请求执行时间)。


此外,还支持 Summary(分位数)和 Family(具有不同标签的同一类型指标组)。



安装与配置



该库通过包管理器(vcpkg、Conan)分发,或从源码编译。通过vcpkg安装的示例:



vcpkg install prometheus-cpp


安装后,需要在CMakeLists.txt文件中链接该库:



find_package(prometheus-cpp CONFIG REQUIRED)target_link_libraries(your_target PRIVATE prometheus-cpp::push prometheus-cpp::pull prometheus-cpp::core)


其中,push 用于将指标发送到Pushgateway,pull 用于创建HTTP服务器供Prometheus拉取指标,而 core 包含核心类(Registry、Counter、Gauge、Histogram)。



使用示例:用于收集指标的HTTP服务器



考虑一个简单示例,创建一个监听8080端口的HTTP服务器,以Prometheus格式提供指标。HTTP处理使用库内置的基于 simple-web-server 或 libmicrohttpd 的机制。



#include <prometheus/exposer.h>#include <prometheus/registry.h>#include <prometheus/counter.h>#include <prometheus/gauge.h>#include <prometheus/histogram.h>#include <thread>#include <chrono>

int main() { // 创建监听8080端口的HTTP服务器 prometheus::Exposer exposer{"0.0.0.0:8080"};

// 创建指标注册表 auto registry = std::make_shared<prometheus::Registry>();

// 1. Counter(计数器) auto& counter_family = prometheus::BuildCounter() .Name("http_requests_total") .Help("Total number of HTTP requests") .Register(*registry);

auto& counter = counter_family.Add({{"method", "GET"}, {"endpoint", "/api"}});

// 2. Gauge(测量仪) auto& gauge_family = prometheus::BuildGauge() .Name("memory_usage_bytes") .Help("Current memory usage in bytes") .Register(*registry);

auto& gauge = gauge_family.Add({});

// 3. Histogram(直方图) auto& histogram_family = prometheus::BuildHistogram() .Name("request_duration_seconds") .Help("Request duration in seconds") .Buckets({0.1, 0.5, 1.0, 2.5, 5.0}) .Register(*registry);

auto& histogram = histogram_family.Add({{"handler", "p

推荐