[#26] 모니터링 환경 구성 #27

Merged
pricelees merged 14 commits from feature/#26 into main 2025-07-29 06:49:56 +00:00
2 changed files with 64 additions and 1 deletions
Showing only changes of commit e2f77b982b - Show all commits

View File

@ -50,7 +50,7 @@ class ApiLogMessageConverter(
?.let { payload["member_id"] = it }
?: run { payload["member_id"] = "NONE" }
request.startTime?.let { payload["start_time"] = it }
request.startTime?.let { payload["duration_ms"] = System.currentTimeMillis() - it }
request.body?.let { payload["response_body"] = it }
request.exception?.let {
payload["exception"] = mapOf(

View File

@ -0,0 +1,63 @@
package roomescape.common.log
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import io.kotest.core.spec.style.FunSpec
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import io.mockk.every
import io.mockk.mockk
import jakarta.servlet.http.HttpServletRequest
import org.slf4j.MDC
import roomescape.auth.exception.AuthErrorCode
import roomescape.auth.exception.AuthException
class ApiLogMessageConverterTest : StringSpec({
val converter = ApiLogMessageConverter(jacksonObjectMapper())
val request: HttpServletRequest = mockk()
beforeTest {
MDC.remove("member_id")
MDC.put("member_id", "1")
}
afterSpec {
MDC.remove("member_id")
}
"HTTP 요청 메시지를 변환한다." {
val method = "POST".also { every { request.method } returns it }
val requestURI = "/test/sangdol".also { every { request.requestURI } returns it }
val clientIP = "127.0.0.1".also { every { request.remoteAddr } returns it }
val query = "key=value&key1=value1".also { every { request.queryString } returns it }
val userAgent = "Mozilla/5.".also { every { request.getHeader("User-Agent") } returns it }
converter.convertToHttpRequestMessage(request) shouldBe """
{"type":"INCOMING_HTTP_REQUEST","method":"$method","uri":"$requestURI","query_params":"$query","client_ip":"$clientIP","user_agent":"$userAgent"}
""".trimIndent()
}
"Controller 요청 메시지를 변환한다." {
val controllerPayload: Map<String, Any> = mapOf(
"controller_method" to "Controller 요청 메시지를 변환한다.",
"request_body" to mapOf("key1" to "value1")
)
val method = "POST".also { every { request.method } returns it }
val requestURI = "/test/sangdol".also { every { request.requestURI } returns it }
converter.convertToControllerInvokedMessage(request, controllerPayload) shouldBe """
{"type":"CONTROLLER_INVOKED","method":"$method","uri":"$requestURI","member_id":1,"controller_method":"${controllerPayload.get("controller_method")}","request_body":{"key1":"value1"}}
""".trimIndent()
}
"Controller 응답 메시지를 반환한다." {
val request = ConvertResponseMessageRequest(
type = LogType.CONTROLLER_SUCCESS,
httpStatus = 200,
exception = AuthException(AuthErrorCode.MEMBER_NOT_FOUND, "테스트 메시지!")
)
converter.convertToResponseMessage(request) shouldBe """
{"type":"CONTROLLER_SUCCESS","status_code":200,"member_id":1,"exception":{"class":"AuthException","message":"테스트 메시지!"}}
""".trimIndent()
}
})