Kotlin 应用监控:Ktor Metrics 与 Micrometer
基于 Ktor 框架构建的现代 Kotlin 服务器应用,需要持续监控其性能和状态。为此,我们使用两个强大工具的组合:Ktor Metrics Plugin(Ktor 内置模块)和 Micrometer(指标收集门面)。本文将介绍如何配置监控,并将数据导出到 Prometheus,然后在 Grafana 中展示。
为什么需要监控?
监控可以:
- 跟踪端点的响应时间(延迟)。
- 统计请求数量(RPS)。
- 发现慢速请求和错误。
- 观察内存和 CPU 使用情况(通过 JVM 指标)。
- 在超过阈值时配置告警。
库与依赖
需要在 build.gradle.kts 中添加以下依赖:
dependencies { // Ktor Server implementation("io.ktor:ktor-server-core:2.3.7") implementation("io.ktor:ktor-server-netty:2.3.7")
// 指标插件 implementation("io.ktor:ktor-server-metrics-micrometer:2.3.7")
// 导出到 Prometheus implementation("io.micrometer:micrometer-registry-prometheus:1.12.0")
// JVM 指标(可选) implementation("io.micrometer:micrometer-core:1.12.0")}Ktor Metrics 基本配置
我们来看一个带有指标的简单服务器示例。创建文件 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) { // 创建 Prometheus 指标注册表 val prometheusRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)
// 安装指标插件 install(MicrometerMetrics) { registry = prometheusRegistry // 默认指标名称 meterBinders = listOf( // 添加 JVM 指标 io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics(), io.micrometer.core.instrument.binder.system.ProcessorMetrics() ) }
// 路由 routing { // 用于提供 Prometheus 指标的端点 get("/metrics") { call.respond(prometheusRegistry.scrape()) }
// 测试端点 get("/hello") { call.respondText("Hello, World!") }
// 带人为延迟的端点 get("/slow") { Thread.sleep(500) call.respondText("Slow response") } } }.start(wait = true)}启动服务器后,打开 http://localhost:8080/metrics — 您将看到 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高级配置:自定义指标
您可以添加自己的计数器和计时器。例如,已处理订单的计数器:
import io.micrometer.core.instrument.Counterimport io.micrometer.core.instrument.MeterRegistry