Skip to content

Commit 1a07356

Browse files
committed
feat(model-server): enable call logging
This makes it possible to trace individual requests and to see their response times.
1 parent 96afad5 commit 1a07356

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ ktor-server-status-pages = { group = "io.ktor", name = "ktor-server-status-pages
7070
ktor-server-test-host = { group = "io.ktor", name = "ktor-server-test-host", version.ref = "ktor" }
7171
ktor-server-websockets = { group = "io.ktor", name = "ktor-server-websockets", version.ref = "ktor" }
7272
ktor-server-resources = { group = "io.ktor", name = "ktor-server-resources", version.ref = "ktor" }
73+
ktor-server-call-logging = { group = "io.ktor", name = "ktor-server-call-logging", version.ref = "ktor" }
7374
ktor-server-swagger = { group = "io.ktor", name = "ktor-server-swagger", version.ref = "ktor" }
7475
ktor-server-metrics-micrometer = { group = "io.ktor", name = "ktor-server-metrics-micrometer", version.ref = "ktor" }
7576

model-server/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ dependencies {
5050
implementation(libs.ktor.server.websockets)
5151
implementation(libs.ktor.server.content.negotiation)
5252
implementation(libs.ktor.server.resources)
53+
implementation(libs.ktor.server.call.logging)
5354
implementation(libs.ktor.serialization.json)
5455
implementation(libs.ktor.server.swagger)
5556
implementation(libs.ktor.server.metrics.micrometer)

model-server/src/main/kotlin/org/modelix/model/server/Main.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,16 @@ import io.ktor.server.engine.embeddedServer
2828
import io.ktor.server.http.content.staticResources
2929
import io.ktor.server.netty.Netty
3030
import io.ktor.server.netty.NettyApplicationEngine
31+
import io.ktor.server.plugins.callloging.CallLogging
32+
import io.ktor.server.plugins.callloging.processingTimeMillis
3133
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
3234
import io.ktor.server.plugins.cors.routing.CORS
3335
import io.ktor.server.plugins.forwardedheaders.ForwardedHeaders
36+
import io.ktor.server.plugins.origin
3437
import io.ktor.server.plugins.statuspages.StatusPages
3538
import io.ktor.server.plugins.swagger.swaggerUI
39+
import io.ktor.server.request.httpMethod
40+
import io.ktor.server.request.path
3641
import io.ktor.server.resources.Resources
3742
import io.ktor.server.response.respondText
3843
import io.ktor.server.routing.IgnoreTrailingSlash
@@ -192,6 +197,19 @@ object Main {
192197
permissionSchema = ModelServerPermissionSchema.SCHEMA
193198
}
194199
install(ForwardedHeaders)
200+
install(CallLogging) {
201+
format { call ->
202+
// Resemble the default format but include remote host and user agent for easier tracing on who issued a certain request.
203+
// INFO ktor.application - 200 OK: GET - /public/modelix-base.css in 60ms
204+
val status = call.response.status()
205+
val httpMethod = call.request.httpMethod.value
206+
val userAgent = call.request.headers["User-Agent"]
207+
val processingTimeMillis = call.processingTimeMillis()
208+
val path = call.request.path()
209+
val remoteHost = call.request.origin.remoteHost
210+
"$status: $httpMethod - $path in ${processingTimeMillis}ms [Remote host: '$remoteHost', User agent: '$userAgent']"
211+
}
212+
}
195213
install(Resources)
196214
// https://opensource.zalando.com/restful-api-guidelines/#136
197215
install(IgnoreTrailingSlash)

0 commit comments

Comments
 (0)