Métricas Prometheus em Kotlin: do básico às soluções de produção
As aplicações backend modernas exigem monitoramento constante. Prometheus é o padrão de facto para coleta de métricas no mundo dos microsserviços. Neste artigo, vamos abordar como integrar Prometheus em aplicações Kotlin usando a biblioteca Micrometer e o framework Ktor. Você aprenderá a criar contadores personalizados, histogramas e temporizadores, além de configurar um endpoint para coleta de métricas.
1. Por que usar Micrometer?
Micrometer é uma fachada para monitoramento, semelhante ao SLF4J para logging. Ele suporta diversos backends: Prometheus, Graphite, Datadog, InfluxDB e outros. Usando Micrometer, você não fica preso a um sistema de monitoramento específico — basta trocar a dependência.
Para Prometheus, o Micrometer fornece um registro especial PrometheusMeterRegistry, que exporta métricas em formato de texto compreensível pelo Prometheus.
2. Adicionando dependências
Adicione as seguintes dependências no 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")}Se você estiver usando Spring Boot, basta adicionar spring-boot-starter-actuator e micrometer-registry-prometheus — o Spring Boot configurará automaticamente o endpoint /actuator/prometheus.
3. Configuração básica no Ktor
Vamos criar uma aplicação Ktor simples com métricas Prometheus. Precisaremos de:
PrometheusMeterRegistry— registro de métricasKtorMetricsPlugin— plugin para coleta automática de métricas HTTP- Endpoint
/metricspara coleta de dados do 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 // Habilita a coleta de métricas padrão (JVM, CPU, memória) 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() ) }
// Exemplo de endpoint de negócio get("/hello") { call.respondText("Hello, Kotlin!") } } }.start(wait = true)}4. Métricas personalizadas
Além das métricas automáticas, você pode criar as suas próprias. Vamos considerar três tipos principais:
- Counter — contador (ex.: número de requisições)
- Timer — tempo de execução de uma operação
- Gauge — valor atual (ex.: número de usuários ativos)
import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.Timerimport io.micrometer.core.instrument.Gauge
// Criando métricasval requestCounter: Counter = Counter .builder( Também na biblioteca
Filas de Tarefas em Go: Visão Geral das Bibliotecas async, gocelery e machinery
Parsing de HTML em PHP: Guia Completo sobre Bibliotecas e Ferramentas
Processamento de imagens em Kotlin: resize e crop com a biblioteca Kamel
Geração de QR Codes em C++: biblioteca QR-Code-generator