in ktor-features/ktor-metrics-micrometer/jvm/src/io/ktor/metrics/micrometer/MicrometerMetrics.kt [172:217]
override fun install(pipeline: Application, configure: Configuration.() -> Unit): MicrometerMetrics {
val configuration = Configuration().apply(configure)
if (!configuration.isRegistryInitialized()) {
throw IllegalArgumentException(
"Meter registry is missing. Please initialize the field 'registry'"
)
}
val feature = MicrometerMetrics(
configuration.registry,
configuration.distributionStatisticConfig,
configuration.timerBuilder
)
configuration.meterBinders.forEach { it.bindTo(configuration.registry) }
val phase = PipelinePhase("MicrometerMetrics")
pipeline.insertPhaseBefore(ApplicationCallPipeline.Monitoring, phase)
pipeline.intercept(phase) {
feature.before(call)
try {
proceed()
} catch (e: Throwable) {
feature.throwable(call, e)
throw e
}
}
val postSendPhase = PipelinePhase("MicrometerMetricsPostSend")
pipeline.sendPipeline.insertPhaseAfter(ApplicationSendPipeline.After, postSendPhase)
pipeline.sendPipeline.intercept(ApplicationSendPipeline.After) {
try {
proceed()
} finally {
feature.after(call)
}
}
pipeline.environment.monitor.subscribe(Routing.RoutingCallStarted) { call ->
call.attributes[measureKey].route = call.route.parent.toString()
}
return feature
}