override fun install()

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
        }