Integração de métricas Prometheus em 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

Métricas Prometheus em C++: biblioteca prometheus-cpp



No desenvolvimento moderno de software, o monitoramento tornou-se uma parte essencial dos sistemas de produção. Prometheus é uma das soluções mais populares para coleta e análise de métricas. Se você programa em C++ e deseja adicionar monitoramento à sua aplicação, a biblioteca prometheus-cpp é o que você precisa. Ela oferece suporte completo aos tipos de métricas do Prometheus e permite exportá-las facilmente via HTTP.



O que é prometheus-cpp?



prometheus-cpp é uma biblioteca cliente para C++ que implementa o protocolo de exportação de métricas do Prometheus. Ela suporta todos os principais tipos de métricas: Counter, Gauge, Histogram e Summary. A biblioteca é escrita em C++ moderno (C++11 e superior), não possui dependências externas (além da biblioteca padrão e libcurl para o servidor HTTP) e é ativamente mantida pela comunidade.



Instalação



A maneira mais simples de instalar é via vcpkg ou Conan. Para vcpkg, execute:



vcpkg install prometheus-cpp


Se preferir compilar manualmente, clone o repositório e use CMake:



git clone https://github.com/jupp0r/prometheus-cpp.gitcd prometheus-cppmkdir build && cd buildcmake ..make -j4sudo make install


Conceitos principais



A biblioteca é construída em torno dos seguintes componentes:



  • Registry — registro que armazena todas as métricas da aplicação.
  • Counter — contador que apenas aumenta (ex.: número de requisições).
  • Gauge — valor que pode tanto aumentar quanto diminuir (ex.: número de conexões ativas).
  • Histogram — histograma para medir a distribuição de valores (ex.: tempo de resposta).
  • Summary — estimativa quantílica (semelhante ao histograma, mas calcula percentis exatos).


Exemplo: criando Counter e Gauge



Vamos considerar um exemplo simples — um servidor HTTP que conta o número de requisições e monitora o número de conexões ativas.



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

int main() { // Criando o registro de métricas auto registry = std::make_shared<prometheus::Registry>();

// Criando uma família Counter auto& counter_family = prometheus::BuildCounter() .Name("http_requests_total") .Help("Total number of HTTP requests") .Register(*registry);

// Adicionando o rótulo "method" com valor "GET" auto& http_requests = counter_family.Add({{"method", "GET"}});

// Criando uma família Gauge auto& gauge_family = prometheus::BuildGauge() .Name("active_connections") .Help("Number of active connections") .Register(*registry);

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

// Exportando métricas na porta 8080 prometheus::Exposer exposer("0.0.0.0:8080"); exposer.RegisterCollectable(registry);

// Simulação de operação while (true) { http_requests.Increment(); // +1 ao contador active_connections.Set(42); // define o valor 42 std::this_thread::sleep_for(std::chrono::seconds(1)); }

return 0;}


Exemplo: Histogram para tempo de resposta



Histogramas são úteis para medir latência. Vamos definir buckets para o tempo de resposta:



#include <prometheus/histogram.h>

// Criando um histograma com buckets: 0.1, 0.5, 1.0, 2.5, 5.0 segundosauto& histogram_family = prometheus::BuildHistogram() .Name("http_request_duration_seconds") .Help("Request latency in seconds") .Register(*registry);

auto& request_duration = histogram_family.Add(

Recommendations