Monitoramento de aplicações C++ com a biblioteca metrics
Ao desenvolver sistemas de alta carga e criticamente importantes em C++, é impossível prescindir de um monitoramento de qualidade. Rastrear desempenho, detectar gargalos e responder rapidamente a falhas são tarefas-chave para DevOps e desenvolvedores. A biblioteca metrics (também conhecida como cppmetrics) fornece uma maneira leve e eficiente de coletar, agregar e exportar métricas diretamente do código C++.
Neste artigo, exploraremos os principais recursos da biblioteca, sua arquitetura, mostraremos exemplos de uso e explicaremos como integrá-la com sistemas de coleta de dados, como o Prometheus.
O que é a biblioteca metrics?
metrics é uma biblioteca header-only para C++ (C++11 e superior) que implementa tipos populares de métricas do Dropwizard Metrics (Java). Ela inclui:
- Contadores (Counters) — para contar eventos (por exemplo, número de requisições).
- Medidores (Gauges) — para valores instantâneos (carga atual da CPU, tamanho da fila).
- Histogramas (Histograms) — para análise de distribuição de valores (tempo de resposta, tamanho do pacote).
- Temporizadores (Timers) — combinação de contador e histograma para medir a duração de operações.
- Medidores de taxa (Meters) — medem a taxa de eventos (requisições por segundo).
A biblioteca suporta segurança de thread, reservatórios personalizáveis para amostragem (por exemplo, decaimento exponencial) e exportação de métricas nos formatos JSON, Prometheus e Graphite.
Instalação e configuração
Como a biblioteca é header-only, a instalação se resume a copiar os arquivos de cabeçalho para o seu projeto. Você pode usar CMake FetchContent ou simplesmente copiar a pasta metrics para o diretório include:
#include <metrics/metrics.hpp>Para trabalhar com Prometheus, também será necessário instalar o prometheus-cpp (opcional).
Exemplo de uso: métricas básicas
Vamos considerar um servidor HTTP simples que conta o número de requisições e mede o tempo de processamento delas.
#include <metrics/metrics.hpp>#include <iostream>#include <thread>#include <chrono>
using namespace metrics;
// Criando um registro de métricasMetricsRegistry registry("my_app");
// Definindo um contador e um temporizadorCounter& request_counter = registry.counter("http.requests.total");Timer& request_timer = registry.timer("http.requests.duration");
void handle_request() { auto context = request_timer.create_context(); // inicia o temporizador request_counter.increment(); // incrementa o contador
// Simulação de processamento std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 100));
// O tempo é registrado automaticamente quando o context é destruído}
int main() { for (int i = 0; i < 100; ++i) { handle_request(); }
// Saída das métricas no console (JSON) std::cout << registry.report_json() << std::endl; return 0;}Como resultado, você obterá um JSON com o contador e os percentis 50, 75, 95 e 99 do tempo de processamento.
Exportação de métricas para o Prometheus
Para integração com o Prometheus, a biblioteca fornece um módulo separado metrics_prometheus. Exemplo de configuração de endpoint:
#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"); // ... registro de métricas ...
// Criando um servidor HTTP na porta 8080 PrometheusServer server(registry, 8080); server.start();
std::cout << "Métricas do Prometheus disponíveis em http://localhost:8080/metrics" << std::endl; return 0;}Agora você pode configurar o Prometheus para coletar métricas deste endpoint.
Conclusão
A biblioteca metrics é uma ferramenta poderosa e flexível para instrumentar aplicações C++. Sua natureza header-only, suporte para tipos de métricas padrão e integração com sistemas populares de monitoramento a tornam uma excelente escolha para projetos modernos. Comece a usar hoje mesmo e torne suas aplicações mais observáveis!
Também na biblioteca
Criptografia em Kotlin: criptografia e hash
GraphQL em C# (.NET): bibliotecas Hot Chocolate e GraphQL.NET para criação de APIs
Agendador de tarefas em Node.js: node-cron, node-schedule e Bull
Aprendizado de Máquina em JavaScript (Node.js): bibliotecas para ML