Métricas de Prometheus en Kotlin: guía completa de integración
En el desarrollo moderno, el monitoreo y la recopilación de métricas son críticos para mantener la estabilidad de las aplicaciones. Prometheus es un sistema de monitoreo líder de código abierto que permite recopilar, almacenar y analizar datos de rendimiento. En este artículo, veremos cómo agregar métricas de Prometheus en aplicaciones Kotlin, utilizando la biblioteca Micrometer y un servidor HTTP personalizable.
¿Por qué usar Prometheus con Kotlin?
- Flexibilidad: Prometheus admite múltiples tipos de métricas: contadores, histogramas, resúmenes y medidores.
- Integración incorporada: Kotlin es totalmente compatible con el ecosistema Java, lo que permite usar Micrometer, una herramienta popular para la recopilación de métricas.
- Escalabilidad: Prometheus se escala fácilmente para monitorear microservicios y sistemas distribuidos.
Configuración del proyecto con Gradle
Para comenzar, agregue las dependencias en el archivo build.gradle.kts:
dependencies { implementation("io.micrometer:micrometer-core:1.12.0") implementation("io.micrometer:micrometer-registry-prometheus:1.12.0") // Para el servidor HTTP (usamos Ktor) implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-server-content-negotiation:2.3.7")}Creación del registrador de Prometheus
La base de la recopilación de métricas es PrometheusMeterRegistry. Créelo en su aplicación:
import io.micrometer.prometheus.PrometheusConfigimport io.micrometer.prometheus.PrometheusMeterRegistry
val registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)Definición de métricas
Consideremos tres tipos principales de métricas:
- Counter — un contador que solo aumenta (por ejemplo, número de solicitudes).
- Gauge — un valor actual (por ejemplo, número de usuarios activos).
- Timer — tiempo de ejecución de operaciones.
Ejemplo de creación de métricas:
import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.Gaugeimport io.micrometer.core.instrument.Timer
val requestCounter: Counter = Counter .builder("api.requests.total") .description("Número total de solicitudes a la API") .register(registry)
val activeUsersGauge: Gauge = Gauge .builder("app.users.active") .description("Número de usuarios activos") .register(registry) { activeUsersCount }
val requestTimer: Timer = Timer .builder("api.requests.duration") .description("Tiempo de ejecución de las solicitudes") .register(registry)
var activeUsersCount = 0Exportación de métricas a través de HTTP
Para que Prometheus pueda recopilar métricas, deben exportarse en el formato /metrics. Usamos Ktor para crear un endpoint:
import io.ktor.server.engine.embeddedServerimport io.ktor.server.netty.Nettyimport io.ktor.server.routing.getimport io.ktor.server.routing.routingimport io.ktor.server.response.respondText
fun startMetricsServer(port: Int = 9090) { embeddedServer(Netty, port = port) { routing { get("/metrics") { val scrape = registry.scrape() call.respondText(scrape, contentType = io.ktor.http.ContentType.Text.Plain) } } }.start(wait = false)}Integración con la lógica de negocio
Actualice las métricas en el código de su aplicación:
fun handleRequest() { requestTimer.record { // Simulación del procesamiento de la solicitud Thread.sleep(100) requestCounter.increment() }}
fun userLoggedIn() { activeUsersCount++}
fun userLoggedOut() { act