Skip to content
Server Plugin

Dropwizard Metrics

必需的依赖项: io.ktor:ktor-server-metrics

代码示例: dropwizard-metrics

原生服务器
Ktor 支持 Kotlin/Native 并允许你在没有额外运行时或虚拟机的情况下运行服务器。
支持: ✖️

DropwizardMetrics 插件允许你配置 Metrics 库,以获取关于服务器和传入请求的有用信息。

添加依赖项

要启用 DropwizardMetrics,你需要将以下 artifact 包含在构建脚本中:

  • 添加 ktor-server-metrics 依赖项:

    Kotlin
    Groovy
    XML
  • 可选地,添加特定 reporter 所需的依赖项。下面的示例展示了如何添加一个通过 JMX 报告 metrics 所需的 artifact:

    Kotlin
    Groovy
    XML

    你可以将 $dropwizard_version 替换为 metrics-jmx artifact 的所需版本,例如 4.2.15

安装 DropwizardMetrics

要将 DropwizardMetrics 插件安装到应用程序中, 请将它传递给指定

模块
模块允许你通过分组路由来组织应用程序。
中的 install 函数。 下面的代码片段展示了如何安装 DropwizardMetrics ...

  • ... 在 embeddedServer 函数调用内部。
  • ... 在显式定义的 module 内部,该 moduleApplication 类的一个扩展函数。
kotlin
kotlin

配置 DropwizardMetrics

DropwizardMetrics 允许你使用 registry 属性来使用任何支持的 Metric reporter。让我们看看如何配置 SLF4J 和 JMX reporter。

SLF4J reporter

SLF4J reporter 允许你定期向 SLF4J 支持的任何输出发送报告。 例如,要每 10 秒输出一次 metrics,你可以:

kotlin
install(DropwizardMetrics) {
    Slf4jReporter.forRegistry(registry)
        .outputTo(this@module.log)
        .convertRatesTo(TimeUnit.SECONDS)
        .convertDurationsTo(TimeUnit.MILLISECONDS)
        .build()
        .start(10, TimeUnit.SECONDS)
}

你可以在这里找到完整示例:dropwizard-metrics

如果你运行应用程序并打开 http://0.0.0.0:8080,输出将如下所示:

Bash
[DefaultDispatcher-worker-1] INFO  Application - Responding at http://0.0.0.0:8080
... type=COUNTER, name=ktor.calls.active, count=0
... type=METER, name=ktor.calls./(method:GET).200, count=6, m1_rate=1.2, m5_rate=1.2, m15_rate=1.2, mean_rate=0.98655785084844, rate_unit=events/second
... type=METER, name=ktor.calls./(method:GET).meter, count=6, m1_rate=1.2, m5_rate=1.2, m15_rate=1.2, mean_rate=0.9841134429134598, rate_unit=events/second
... type=METER, name=ktor.calls.exceptions, count=0, m1_rate=0.0, m5_rate=0.0, m15_rate=0.0, mean_rate=0.0, rate_unit=events/second
... type=METER, name=ktor.calls.status.200, count=6, m1_rate=1.2, m5_rate=1.2, m15_rate=1.2, mean_rate=0.9866015088545449, rate_unit=events/second
... type=TIMER, name=ktor.calls./(method:GET).timer, count=6, min=0.359683, max=14.213046, mean=2.691307542732234, stddev=5.099546889849414, p50=0.400967, p75=0.618972, p95=14.213046, p98=14.213046, p99=14.213046, p999=14.213046, m1_rate=1.2, m5_rate=1.2, m15_rate=1.2, mean_rate=0.9830677128229028, rate_unit=events/second, duration_unit=milliseconds
... type=TIMER, name=ktor.calls.duration, count=6, min=0.732149, max=33.735719, mean=6.238046092985701, stddev=12.169258340009847, p50=0.778864, p75=1.050454, p95=33.735719, p98=33.735719, p99=33.735719, p999=33.735719, m1_rate=0.2, m5_rate=0.2, m15_rate=0.2, mean_rate=0.6040311229887146, rate_unit=events/second, duration_unit=milliseconds

JMX reporter

JMX reporter 允许你将所有 metrics 暴露给 JMX,从而允许你使用 jconsole 查看这些 metrics。

kotlin
install(DropwizardMetrics) {
    JmxReporter.forRegistry(registry)
        .convertRatesTo(TimeUnit.SECONDS)
        .convertDurationsTo(TimeUnit.MILLISECONDS)
        .build()
        .start()
}

你可以在这里找到完整示例:dropwizard-metrics

如果你运行应用程序并使用 JConsole 连接到其进程,metrics 将如下所示:

Ktor Metrics: JMX

暴露的 metrics

DropwizardMetrics 暴露以下 metrics:

全局 metrics

全局 metrics 包括以下 Ktor 特有的 metrics:

  • ktor.calls.active:Count - 未完成的活跃请求的数量。
  • ktor.calls.duration - 关于调用持续时间的信息。
  • ktor.calls.exceptions - 关于异常数量的信息。
  • ktor.calls.status.NNN - 关于特定 HTTP 状态码 NNN 发生的次数的信息。

请注意,metric 名称以 ktor.calls 前缀开头。你可以使用 baseName 属性自定义它:

kotlin
install(DropwizardMetrics) {
    baseName = "my.prefix"
}

每个端点的 metrics

  • "/uri(method:VERB).NNN" - 关于特定 HTTP 状态码 NNN 发生的次数的信息,针对此路径和动词。
  • "/uri(method:VERB).meter" - 关于此路径和动词的调用次数信息。
  • "/uri(method:VERB).timer" - 关于此端点持续时间的信息。

JVM metrics

除了 HTTP metrics,Ktor 还暴露了一组用于监控 JVM 的 metrics。你可以使用 registerJvmMetricSets 属性禁用这些 metrics:

kotlin
install(DropwizardMetrics) {
    registerJvmMetricSets = false
}

你可以在这里找到完整示例:dropwizard-metrics