Introdução: Por que o monitoramento é vital para aplicações Kotlin
\nAplicações Kotlin modernas, executadas na JVM (Java Virtual Machine), frequentemente se tornam nós críticos da infraestrutura. Sem o monitoramento adequado, você corre o risco de enfrentar falhas repentinas, vazamentos de memória ou degradação de desempenho que passarão despercebidos até o momento do incidente. Neste artigo, vamos detalhar como construir um sistema completo de monitoramento de aplicações Kotlin "do A ao Z": desde a coleta de métricas básicas (CPU, memória, GC) até a configuração de alertas no Grafana e Prometheus.
\nAbordaremos três ferramentas principais: Micrometer (fachada para métricas), Prometheus (armazenamento e coletor) e Grafana (visualização e alertas). Todos os exemplos de código são escritos em Kotlin.
\n\n1. Fundamentos da coleta de métricas: Micrometer e Prometheus
\nMicrometer é a fachada padrão de fato para monitoramento no ecossistema Spring e Kotlin. Ele fornece uma API unificada para enviar métricas para vários sistemas (Prometheus, Datadog, New Relic, etc.).
\n\n1.1. Adicionando dependências (Gradle)
\ndependencies {\n implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")\n implementation("org.springframework.boot:spring-boot-starter-actuator")\n}\nPara Ktor ou Kotlin puro sem Spring, você pode adicionar apenas micrometer-core e micrometer-registry-prometheus.
1.2. Configuração básica do Micrometer no Spring Boot
\nNo application.yml, basta ativar o Actuator e o endpoint Prometheus:
management:\n endpoints:\n web:\n exposure:\n include: health,info,prometheus\n metrics:\n export:\n prometheus:\n enabled: true\nApós iniciar a aplicação, as métricas estarão disponíveis em /actuator/prometheus.
1.3. Criando métricas personalizadas (exemplo em Kotlin)
\nSuponha que você queira contar o número de pedidos processados e o tempo de processamento:
\nimport io.micrometer.core.instrument.MeterRegistry\nimport io.micrometer.core.instrument.Timer\nimport org.springframework.stereotype.Service\nimport java.util.concurrent.atomic.AtomicLong\n\n@Service\nclass OrderService(private val registry: MeterRegistry) {\n\n private val processedOrders: AtomicLong = registry.gauge(\n "orders.processed.count",\n AtomicLong(0)\n )\n private val orderProcessingTime: Timer = registry.timer("orders.processing.time")\n\n fun processOrder(orderId: String) {\n val sample = Timer.start()\n try {\n // Lógica de processamento do pedido\n Thread.sleep((50..200).random().toLong())\n processedOrders.incrementAndGet()\n } finally {\n sample.stop(orderProcessingTime)\n }\n }\n}\nAgora, as métricas orders_processed_count e orders_processing_time_seconds aparecerão no Prometheus.
2. Configurando o Prometheus para coleta de métricas
\nPrometheus é um servidor que "raspa" (solicita) métricas de suas aplicações em intervalos agendados.
\n\n2.1. Configuração do prometheus.yml
\nAdicione seu serviço Kotlin como alvo (target):
\nscrape_configs:\n - job_name: 'kotlin-app'\n metrics_path: '/actuator/prometheus'\n static_configs:\n - targets: ['localhost:8080']\nSe a aplicação estiver rodando em Docker/Kubernetes, use service discovery.
\n\n2.2. Métricas JVM importantes por padrão
\nO Micrometer exporta automaticamente várias métricas da JVM:
\n- \n
jvm_memory_used_bytes— memória usada (heap/non-heap) \n jvm_gc_pause_seconds— tempo de pausas do GC \n jvm_threads_live_threads— número de threads ativas \n process_cpu_usage— uso de CPU pelo processo \n
Esses dados já estão disponíveis no Prome