Integração de métricas Prometheus em aplicações C++: biblioteca prometheus-cpp

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Biblioteca prometheus-cpp: Coleta de métricas Prometheus em aplicações C++



No desenvolvimento moderno de software, o monitoramento do estado das aplicações desempenha um papel crítico. Prometheus é um sistema de monitoramento e alerta de código aberto que coleta métricas de alvos através de endpoints HTTP. Para integrar o Prometheus em projetos C++, existe uma biblioteca poderosa e flexível chamada prometheus-cpp. Ela permite que desenvolvedores adicionem facilmente a coleta de métricas (contadores, medidores, histogramas) ao seu código e as exportem em um formato compreensível pelo servidor Prometheus.



O que é prometheus-cpp?



prometheus-cpp é uma biblioteca cliente para Prometheus, escrita em C++17. Ela fornece todas as ferramentas necessárias para criar, atualizar e exportar métricas. A biblioteca suporta três tipos principais de métricas, definidos no modelo de dados do Prometheus:



  • Counter (contador) — um valor monotonicamente crescente (por exemplo, número de requisições, erros, tarefas concluídas).
  • Gauge (medidor) — um valor que pode aumentar e diminuir arbitrariamente (por exemplo, temperatura atual, número de conexões ativas).
  • Histogram (histograma) — distribuição de valores em intervalos predefinidos (por exemplo, tempo de execução de uma requisição).


Além disso, são suportados Summary (quantis) e Family (grupos de métricas do mesmo tipo com diferentes rótulos).



Instalação e configuração



A biblioteca é distribuída através de gerenciadores de pacotes (vcpkg, Conan) ou compilada a partir do código-fonte. Exemplo de instalação via vcpkg:



vcpkg install prometheus-cpp


Após a instalação, no arquivo CMakeLists.txt, é necessário conectar a biblioteca:



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


Aqui, push é usado para enviar métricas para o Pushgateway, pull para criar um servidor HTTP do qual o Prometheus coletará as métricas, e core contém as classes principais (Registry, Counter, Gauge, Histogram).



Exemplo de uso: Servidor HTTP para coleta de métricas



Vamos considerar um exemplo simples que cria um servidor HTTP na porta 8080, que fornece métricas no formato Prometheus. Para trabalhar com HTTP, é usado o mecanismo embutido na biblioteca baseado em simple-web-server ou 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() { // Cria um servidor HTTP na porta 8080 prometheus::Exposer exposer{"0.0.0.0:8080"};

// Cria um registro de métricas auto registry = std::make_shared<prometheus::Registry>();

// 1. Counter (contador) 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 (medidor) auto& gauge_family = prometheus::BuildGauge() .Name("memory_usage_bytes") .Help("Current memory usage in bytes") .Register(*registry);

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

// 3. Histogram (histograma) 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

Recommendations