Monitoramento de aplicações Kotlin: biblioteca Ktor Metrics e Micrometer

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Monitoramento de aplicações Kotlin: Ktor Metrics e Micrometer



Aplicações de servidor modernas em Kotlin, construídas no framework Ktor, exigem monitoramento constante de desempenho e estado. Para isso, utiliza-se a combinação de duas ferramentas poderosas: Ktor Metrics Plugin (módulo integrado ao Ktor) e Micrometer (fachada para coleta de métricas). Neste artigo, vamos explicar como configurar o monitoramento com exportação de dados para Prometheus e exibição no Grafana.



Por que o monitoramento é necessário?

O monitoramento permite:

  • Acompanhar o tempo de resposta dos endpoints (latência).
  • Contar o número de requisições (RPS).
  • Identificar requisições lentas e erros.
  • Observar o uso de memória e CPU (através de métricas JVM).
  • Configurar alertas quando limites são excedidos.


Bibliotecas e dependências

Para o funcionamento, serão necessárias as seguintes dependências no build.gradle.kts:



dependencies {    // Ktor Server    implementation("io.ktor:ktor-server-core:2.3.7")    implementation("io.ktor:ktor-server-netty:2.3.7")

// Plugin de métricas implementation("io.ktor:ktor-server-metrics-micrometer:2.3.7")

// Exportação para Prometheus implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")

// Métricas JVM (opcional) implementation("io.micrometer:micrometer-core:1.12.0")}


Configuração básica do Ktor Metrics

Vamos considerar um exemplo simples de servidor com métricas. Crie o arquivo Application.kt:



import io.ktor.server.application.*import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.server.response.*import io.ktor.server.metrics.micrometer.*import io.micrometer.prometheus.PrometheusMeterRegistryimport io.micrometer.prometheus.PrometheusConfig

fun main() { embeddedServer(Netty, port = 8080) { // Cria o registro de métricas Prometheus val prometheusRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)

// Instala o plugin de métricas install(MicrometerMetrics) { registry = prometheusRegistry // Nomes de métricas padrão meterBinders = listOf( // Adiciona métricas JVM io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics(), io.micrometer.core.instrument.binder.system.ProcessorMetrics() ) }

// Roteamento routing { // Endpoint para fornecer métricas ao Prometheus get("/metrics") { call.respond(prometheusRegistry.scrape()) }

// Endpoint de teste get("/hello") { call.respondText("Hello, World!") }

// Endpoint com atraso artificial get("/slow") { Thread.sleep(500) call.respondText("Slow response") } } }.start(wait = true)}


Após iniciar o servidor, abra http://localhost:8080/metrics — você verá as métricas no formato Prometheus:



# HELP ktor_http_server_requests_seconds  # TYPE ktor_http_server_requests_seconds summaryktor_http_server_requests_seconds_count{method="GET",route="/hello",status="2xx"} 3.0ktor_http_server_requests_seconds_sum{method="GET",route="/hello",status="2xx"} 0.012# HELP jvm_memory_used_bytes  # TYPE jvm_memory_used_bytes gaugejvm_memory_used_bytes{area="heap",id="G1 Survivor Space"} 1048576.0


Configuração avançada: métricas personalizadas

Você pode adicionar seus próprios contadores e temporizadores. Por exemplo, um contador de pedidos processados:



import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.MeterRegistry

Recommendations