in ktor-features/ktor-metrics/jvm/src/io/ktor/metrics/dropwizard/DropwizardMetrics.kt [54:99]
override fun install(pipeline: Application, configure: Configuration.() -> Unit): DropwizardMetrics {
val configuration = Configuration().apply(configure)
val feature = DropwizardMetrics(configuration.registry, configuration.baseName)
configuration.registry.register("jvm.memory", MemoryUsageGaugeSet())
configuration.registry.register("jvm.garbage", GarbageCollectorMetricSet())
configuration.registry.register("jvm.threads", ThreadStatesGaugeSet())
configuration.registry.register("jvm.files", FileDescriptorRatioGauge())
configuration.registry.register("jvm.attributes", JvmAttributeGaugeSet())
val phase = PipelinePhase("DropwizardMetrics")
pipeline.insertPhaseBefore(ApplicationCallPipeline.Monitoring, phase)
pipeline.intercept(phase) {
feature.before(call)
try {
proceed()
} catch (e: Exception) {
feature.exception(call, e)
throw e
} finally {
feature.after(call)
}
}
pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call ->
val name = call.route.toString()
val meter = feature.registry.meter(MetricRegistry.name(name, "meter"))
val timer = feature.registry.timer(MetricRegistry.name(name, "timer"))
meter.mark()
val context = timer.time()
call.attributes.put(
routingMetricsKey,
RoutingMetrics(name, context)
)
}
pipeline.environment.monitor.subscribe(Routing.RoutingCallFinished) { call ->
val routingMetrics = call.attributes.take(routingMetricsKey)
val status = call.response.status()?.value ?: 0
val statusMeter = feature.registry.meter(MetricRegistry.name(routingMetrics.name, status.toString()))
statusMeter.mark()
routingMetrics.context.stop()
}
return feature
}