Métricas de Prometheus en C++: biblioteca prometheus-cpp
En el desarrollo de software moderno, el monitoreo se ha convertido en una parte esencial de los sistemas de producción. Prometheus es una de las soluciones más populares para la recopilación y análisis de métricas. Si programas en C++ y deseas agregar monitoreo a tu aplicación, la biblioteca prometheus-cpp es justo lo que necesitas. Proporciona soporte completo para los tipos de métricas de Prometheus y permite exportarlas fácilmente a través de HTTP.
¿Qué es prometheus-cpp?
prometheus-cpp es una biblioteca cliente para C++ que implementa el protocolo de exportación de métricas de Prometheus. Soporta todos los tipos principales de métricas: Counter, Gauge, Histogram y Summary. La biblioteca está escrita en C++ moderno (C++11 y superior), no tiene dependencias externas (excepto la biblioteca estándar y libcurl para el servidor HTTP) y cuenta con un mantenimiento activo por parte de la comunidad.
Instalación
La forma más sencilla de instalación es a través de vcpkg o Conan. Para vcpkg, ejecuta:
vcpkg install prometheus-cppSi prefieres compilarlo manualmente, clona el repositorio y usa CMake:
git clone https://github.com/jupp0r/prometheus-cpp.gitcd prometheus-cppmkdir build && cd buildcmake ..make -j4sudo make installConceptos principales
La biblioteca se estructura en torno a los siguientes componentes:
- Registry — registro que almacena todas las métricas de la aplicación.
- Counter — contador que solo aumenta (por ejemplo, número de solicitudes).
- Gauge — valor que puede tanto aumentar como disminuir (por ejemplo, número de conexiones activas).
- Histogram — histograma para medir la distribución de valores (por ejemplo, tiempo de respuesta).
- Summary — estimación cuantil (similar al histograma, pero calcula percentiles exactos).
Ejemplo: creación de Counter y Gauge
Consideremos un ejemplo simple: un servidor HTTP que cuenta el número de solicitudes y rastrea el número de conexiones activas.
#include <prometheus/counter.h>#include <prometheus/gauge.h>#include <prometheus/registry.h>#include <prometheus/exposer.h>
int main() { // Creamos el registro de métricas auto registry = std::make_shared<prometheus::Registry>();
// Creamos la familia Counter auto& counter_family = prometheus::BuildCounter() .Name("http_requests_total") .Help("Total number of HTTP requests") .Register(*registry);
// Agregamos la etiqueta "method" con el valor "GET" auto& http_requests = counter_family.Add({{"method", "GET"}});
// Creamos la familia Gauge auto& gauge_family = prometheus::BuildGauge() .Name("active_connections") .Help("Number of active connections") .Register(*registry);
auto& active_connections = gauge_family.Add({});
// Exportamos las métricas en el puerto 8080 prometheus::Exposer exposer("0.0.0.0:8080"); exposer.RegisterCollectable(registry);
// Simulación de trabajo while (true) { http_requests.Increment(); // +1 al contador active_connections.Set(42); // establecemos el valor 42 std::this_thread::sleep_for(std::chrono::seconds(1)); }
return 0;}Ejemplo: Histogram para tiempo de respuesta
Los histogramas son útiles para medir la latencia. Definamos buckets para el tiempo de respuesta:
#include <prometheus/histogram.h>
// Creamos un histograma con 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( También en la biblioteca
Procesamiento de imágenes en C++: bibliotecas CImg, OpenCV y stb_image
Colly para Go: guía completa con ejemplos prácticos
Autorización y autenticación en C++: bibliotecas y ejemplos prácticos