Métricas Prometheus em Kotlin: guia completo de integração
No desenvolvimento moderno, o monitoramento e a coleta de métricas são criticamente importantes para manter a estabilidade das aplicações. Prometheus é um sistema de monitoramento líder de código aberto que permite coletar, armazenar e analisar dados de desempenho. Neste artigo, veremos como adicionar métricas Prometheus em aplicações Kotlin, usando a biblioteca Micrometer e um servidor HTTP configurável.
Por que usar Prometheus com Kotlin?
- Flexibilidade: Prometheus suporta vários tipos de métricas: contadores, histogramas, sumarizações e medidores.
- Integração nativa: Kotlin é totalmente compatível com o ecossistema Java, permitindo o uso do Micrometer — uma ferramenta popular para coleta de métricas.
- Escalabilidade: Prometheus escala facilmente para monitorar microsserviços e sistemas distribuídos.
Configuração do projeto com Gradle
Para começar, adicione as dependências no arquivo build.gradle.kts:
dependencies { implementation("io.micrometer:micrometer-core:1.12.0") implementation("io.micrometer:micrometer-registry-prometheus:1.12.0") // Para o servidor HTTP (usando Ktor) implementation("io.ktor:ktor-server-netty:2.3.7") implementation("io.ktor:ktor-server-content-negotiation:2.3.7")}Criação do registrador Prometheus
A base da coleta de métricas é o PrometheusMeterRegistry. Crie-o na sua aplicação:
import io.micrometer.prometheus.PrometheusConfigimport io.micrometer.prometheus.PrometheusMeterRegistry
val registry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)Definição de métricas
Vamos considerar três tipos principais de métricas:
- Counter — contador que apenas aumenta (ex.: número de requisições).
- Gauge — valor atual (ex.: número de usuários ativos).
- Timer — tempo de execução de operações.
Exemplo de criação 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 requisições à API") .register(registry)
val activeUsersGauge: Gauge = Gauge .builder("app.users.active") .description("Número de usuários ativos") .register(registry) { activeUsersCount }
val requestTimer: Timer = Timer .builder("api.requests.duration") .description("Tempo de execução das requisições") .register(registry)
var activeUsersCount = 0Exportação de métricas via HTTP
Para que o Prometheus possa coletar métricas, elas precisam ser exportadas no formato /metrics. Usamos Ktor para criar o 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)}Integração com a lógica de negócio
Atualize as métricas no código da sua aplicação:
fun handleRequest() { requestTimer.record { // Simulação de processamento de requisição Thread.sleep(100) requestCounter.increment() }}
fun userLoggedIn() { activeUsersCount++}
fun userLoggedOut() { act