Integración de métricas de Prometheus en aplicaciones Kotlin: guía completa

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

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 = 0


Exportació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

Recommendations