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-cppSe 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 installConceitos 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( Também na biblioteca
Cache em Rust: Redis, Memcached e soluções embutidas
GraphQL em TypeScript: Bibliotecas para APIs com segurança de tipos
Trabalho com datas em C# (.NET): visão geral de bibliotecas e ferramentas nativas
Framework CLI para C# (.NET): System.CommandLine e Spectre.Console
Trabalhando com Excel em PHP: bibliotecas PhpSpreadsheet e OpenSpout