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()) + } +}