Métricas de Prometheus en Kotlin: desde lo básico hasta soluciones de producción
Las aplicaciones backend modernas requieren monitoreo constante. Prometheus es el estándar de facto para la recolección de métricas en el mundo de los microservicios. En este artículo, analizaremos cómo integrar Prometheus en aplicaciones Kotlin utilizando la biblioteca Micrometer y el framework Ktor. Aprenderá a crear contadores personalizados, histogramas y temporizadores, así como a configurar un endpoint para la recolección de métricas.
1. ¿Por qué es necesario Micrometer?
Micrometer es una fachada para monitoreo, similar a SLF4J para registro. Soporta múltiples backends: Prometheus, Graphite, Datadog, InfluxDB y otros. Al usar Micrometer, no se ata a un sistema de monitoreo específico; basta con cambiar la dependencia.
Para Prometheus, Micrometer proporciona un registro especial PrometheusMeterRegistry que exporta métricas en formato de texto comprensible para Prometheus.
2. Agregar dependencias
Agregue las siguientes dependencias en build.gradle.kts:
dependencies { // Micrometer + Prometheus implementation("io.micrometer:micrometer-core:1.12.5") implementation("io.micrometer:micrometer-registry-prometheus:1.12.5")
// Para Ktor implementation("io.ktor:ktor-server-core:2.3.9") implementation("io.ktor:ktor-server-netty:2.3.9") implementation("io.ktor:ktor-server-metrics-micrometer:2.3.9")}Si usa Spring Boot, basta con agregar spring-boot-starter-actuator y micrometer-registry-prometheus; Spring Boot configurará automáticamente el endpoint /actuator/prometheus.
3. Configuración básica en Ktor
Creemos una aplicación Ktor simple con métricas de Prometheus. Necesitaremos:
PrometheusMeterRegistry— registro de métricasKtorMetricsPlugin— plugin para recolección automática de métricas HTTP- Endpoint
/metricspara la recolección de datos de Prometheus
import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.response.*import io.ktor.server.routing.*import io.micrometer.prometheus.PrometheusConfigimport io.micrometer.prometheus.PrometheusMeterRegistryimport io.ktor.server.plugins.metrics.micrometer.*
fun main() { val prometheusRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)
embeddedServer(Netty, port = 8080) { install(MicrometerMetrics) { registry = prometheusRegistry // Habilitar recolección de métricas predeterminadas (JVM, CPU, memoria) meterBinders = listOf( JvmGcMetrics(), JvmMemoryMetrics(), ProcessorMetrics() ) }
routing { // Endpoint para Prometheus get("/metrics") { call.respondText( contentType = ContentType.parse("text/plain; version=0.0.4"), text = prometheusRegistry.scrape() ) }
// Ejemplo de endpoint de negocio get("/hello") { call.respondText("Hello, Kotlin!") } } }.start(wait = true)}4. Métricas personalizadas
Además de las métricas automáticas, puede crear las suyas propias. Veamos tres tipos principales:
- Counter — contador (por ejemplo, número de solicitudes)
- Timer — tiempo de ejecución de una operación
- Gauge — valor actual (por ejemplo, número de usuarios activos)
import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.Timerimport io.micrometer.core.instrument.Gauge
// Crear métricasval requestCounter: Counter = Counter .builder(