From 52db59626fcb9cce312565f6f8ade9cd4782658b Mon Sep 17 00:00:00 2001 From: chaeda Date: Sun, 31 Mar 2024 08:31:12 +0900 Subject: [PATCH] =?UTF-8?q?=ED=94=84=EB=A1=9C=EB=A9=94=ED=85=8C=EC=9A=B0?= =?UTF-8?q?=EC=8A=A4=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 3 ++ gradle.properties | 1 + src/main/kotlin/com/example/Application.kt | 2 ++ .../kotlin/com/example/config/Monitoring.kt | 31 +++++++++++++++++++ src/main/kotlin/com/example/config/Routing.kt | 2 ++ .../kotlin/com/example/route/MonitorRoute.kt | 12 +++++++ 6 files changed, 51 insertions(+) create mode 100644 src/main/kotlin/com/example/config/Monitoring.kt create mode 100644 src/main/kotlin/com/example/route/MonitorRoute.kt diff --git a/build.gradle.kts b/build.gradle.kts index 195b8b2..c75b5e0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,6 +7,7 @@ val h2_version: String by project val hikaricp_version: String by project val koin_version: String by project val jbcrypt_version: String by project +val prometeus_version: String by project plugins { kotlin("jvm") version "1.9.23" @@ -37,6 +38,7 @@ dependencies { implementation("io.ktor:ktor-server-sessions-jvm") implementation("io.ktor:ktor-server-auth-jvm") implementation("io.ktor:ktor-server-status-pages-jvm") + implementation("io.ktor:ktor-server-metrics-micrometer-jvm") implementation("io.ktor:ktor-serialization-kotlinx-json-jvm") implementation("ch.qos.logback:logback-classic:$logback_version") implementation("org.jetbrains.exposed:exposed-core:$exposed_version") @@ -47,6 +49,7 @@ dependencies { implementation("io.insert-koin:koin-ktor:$koin_version") implementation("io.insert-koin:koin-logger-slf4j:$koin_version") implementation("org.mindrot:jbcrypt:$jbcrypt_version") + implementation("io.micrometer:micrometer-registry-prometheus:$prometeus_version") testImplementation("io.ktor:ktor-server-tests-jvm") testImplementation("org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version") } diff --git a/gradle.properties b/gradle.properties index cdf0eb4..146a4a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,3 +7,4 @@ h2_version=2.1.214 hikaricp_version=5.1.0 koin_version=3.5.0 jbcrypt_version=0.4 +prometeus_version=1.6.3 diff --git a/src/main/kotlin/com/example/Application.kt b/src/main/kotlin/com/example/Application.kt index 2f8556f..b05ee1f 100644 --- a/src/main/kotlin/com/example/Application.kt +++ b/src/main/kotlin/com/example/Application.kt @@ -5,6 +5,7 @@ import com.example.config.configureDependencyInjection import com.example.config.configureErrorHandling import com.example.config.configureHttp import com.example.config.configureLogging +import com.example.config.configureMonitoring import com.example.config.configureRouting import com.example.config.configureSecurity import com.example.config.configureSerialization @@ -28,4 +29,5 @@ fun Application.module() { configureRouting() configureErrorHandling() configureLogging() + configureMonitoring() } diff --git a/src/main/kotlin/com/example/config/Monitoring.kt b/src/main/kotlin/com/example/config/Monitoring.kt new file mode 100644 index 0000000..8e29d2a --- /dev/null +++ b/src/main/kotlin/com/example/config/Monitoring.kt @@ -0,0 +1,31 @@ +package com.example.config + +import io.ktor.server.application.* +import io.ktor.server.metrics.micrometer.* +import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics +import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics +import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics +import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics +import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics +import io.micrometer.core.instrument.binder.system.ProcessorMetrics +import io.micrometer.core.instrument.binder.system.UptimeMetrics +import io.micrometer.prometheus.PrometheusConfig +import io.micrometer.prometheus.PrometheusMeterRegistry + + +val appMicrometerRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT) +fun Application.configureMonitoring() { + install(MicrometerMetrics) { + registry = appMicrometerRegistry + meterBinders = + listOf( + ClassLoaderMetrics(), + JvmMemoryMetrics(), + JvmGcMetrics(), + ProcessorMetrics(), + JvmThreadMetrics(), + FileDescriptorMetrics(), + UptimeMetrics() + ) + } +} diff --git a/src/main/kotlin/com/example/config/Routing.kt b/src/main/kotlin/com/example/config/Routing.kt index 1bfa286..0539e46 100644 --- a/src/main/kotlin/com/example/config/Routing.kt +++ b/src/main/kotlin/com/example/config/Routing.kt @@ -1,6 +1,7 @@ package com.example.config import com.example.route.menuRoute +import com.example.route.monitorRoute import com.example.route.orderRoute import com.example.route.userRoute import io.ktor.server.application.* @@ -15,6 +16,7 @@ fun Application.configureRouting() { orderRoute() } + monitorRoute() singlePageApplication { react("frontend") } diff --git a/src/main/kotlin/com/example/route/MonitorRoute.kt b/src/main/kotlin/com/example/route/MonitorRoute.kt new file mode 100644 index 0000000..3dd3e6a --- /dev/null +++ b/src/main/kotlin/com/example/route/MonitorRoute.kt @@ -0,0 +1,12 @@ +package com.example.route + +import com.example.config.appMicrometerRegistry +import io.ktor.server.application.* +import io.ktor.server.response.* +import io.ktor.server.routing.* + +fun Route.monitorRoute() { + get("/metrics") { + call.respond(appMicrometerRegistry.scrape()) + } +}