Monitoreo de aplicaciones C++: biblioteca metrics para recopilación de métricas

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Monitoreo de aplicaciones C++ con la biblioteca metrics



Al desarrollar sistemas de alta carga y críticos en C++, es imposible prescindir de un monitoreo de calidad. El seguimiento del rendimiento, la detección de cuellos de botella y la respuesta rápida a fallos son tareas clave para DevOps y desarrolladores. La biblioteca metrics (también conocida como cppmetrics) proporciona una forma ligera y eficiente de recopilar, agregar y exportar métricas directamente desde el código C++.



En este artículo, analizaremos las principales capacidades de la biblioteca, su arquitectura, mostraremos ejemplos de uso y explicaremos cómo integrarla con sistemas de recopilación de datos como Prometheus.



¿Qué es la biblioteca metrics?



metrics es una biblioteca header-only para C++ (C++11 y superior) que implementa los tipos de métricas populares de Dropwizard Metrics (Java). Incluye:



  • Contadores (Counters) — para contar eventos (por ejemplo, número de solicitudes).
  • Indicadores (Gauges) — para valores instantáneos (carga actual de CPU, tamaño de cola).
  • Histogramas (Histograms) — para analizar la distribución de valores (tiempo de respuesta, tamaño de paquete).
  • Temporizadores (Timers) — combinación de contador e histograma para medir la duración de operaciones.
  • Medidores (Meters) — miden la velocidad de eventos (solicitudes por segundo).


La biblioteca es thread-safe, admite depósitos de muestreo configurables (por ejemplo, de caída exponencial) y exportación de métricas en formatos JSON, Prometheus y Graphite.



Instalación y configuración



Como la biblioteca es header-only, la instalación se reduce a copiar los archivos de encabezado en su proyecto. Puede usar CMake FetchContent o simplemente copiar la carpeta metrics en include:



#include <metrics/metrics.hpp>


Para trabajar con Prometheus, también necesitará instalar prometheus-cpp (opcional).



Ejemplo de uso: métricas básicas



Consideremos un servidor HTTP simple que cuenta el número de solicitudes y mide el tiempo de procesamiento.



#include <metrics/metrics.hpp>#include <iostream>#include <thread>#include <chrono>

using namespace metrics;

// Creamos un registro de métricasMetricsRegistry registry("my_app");

// Definimos un contador y un 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(); // inicio del temporizador request_counter.increment(); // incrementamos el contador

// Simulación de procesamiento std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 100));

// El tiempo se registra automáticamente al destruir context}

int main() { for (int i = 0; i < 100; ++i) { handle_request(); }

// Salida de métricas en consola (JSON) std::cout << registry.report_json() << std::endl; return 0;}


Como resultado, obtendrá un JSON con el contador y los percentiles 50, 75, 95 y 99 del tiempo de procesamiento.



Exportación de métricas a Prometheus



Para la integración con Prometheus, la biblioteca proporciona un módulo separado metrics_prometheus. Ejemplo de configuración de un 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 ...

// Creamos un servidor HTTP en el puerto 8080 PrometheusServer server(registry, 8080); server.start();

std::cout << "Prometheus metrics available a

Recommendations