Kotlin 应用监控:Ktor Metrics 与 Micrometer 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

推荐