From a60703ebdce1317939c75a5f6be214e5e39fab78 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Tue, 24 Oct 2023 12:52:15 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20=E3=83=AD=E3=82=B0=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hideout/controller/InboxControllerImpl.kt | 17 ++++++++++++++--- .../controller/wellknown/WebFingerController.kt | 14 +++++++++++++- .../dev/usbharu/hideout/service/ap/APService.kt | 14 ++++++++++++-- .../hideout/service/post/PostServiceImpl.kt | 14 +++++++++++++- .../service/reaction/ReactionServiceImpl.kt | 4 +--- src/main/resources/logback.xml | 1 + 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/dev/usbharu/hideout/controller/InboxControllerImpl.kt b/src/main/kotlin/dev/usbharu/hideout/controller/InboxControllerImpl.kt index 7afc1871..235c821f 100644 --- a/src/main/kotlin/dev/usbharu/hideout/controller/InboxControllerImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/controller/InboxControllerImpl.kt @@ -10,13 +10,24 @@ import org.springframework.web.bind.annotation.RestController @RestController class InboxControllerImpl(private val apService: APService) : InboxController { override suspend fun inbox(@RequestBody string: String): ResponseEntity { - val parseActivity = apService.parseActivity(string) + val parseActivity = try { + apService.parseActivity(string) + } catch (e: Exception) { + LOGGER.warn("FAILED Parse Activity", e) + return ResponseEntity.accepted().build() + } LOGGER.info("INBOX Processing Activity Type: {}", parseActivity) - apService.processActivity(string, parseActivity) + try { + apService.processActivity(string, parseActivity) + } catch (e: Exception) { + LOGGER.warn("FAILED Process Activity $parseActivity", e) + return ResponseEntity(HttpStatus.ACCEPTED) + } + LOGGER.info("SUCCESS Processing Activity Type: {}", parseActivity) return ResponseEntity(HttpStatus.ACCEPTED) } companion object { - val LOGGER = LoggerFactory.getLogger(InboxControllerImpl::class.java) + private val LOGGER = LoggerFactory.getLogger(InboxControllerImpl::class.java) } } diff --git a/src/main/kotlin/dev/usbharu/hideout/controller/wellknown/WebFingerController.kt b/src/main/kotlin/dev/usbharu/hideout/controller/wellknown/WebFingerController.kt index 070b82fa..a8032d1a 100644 --- a/src/main/kotlin/dev/usbharu/hideout/controller/wellknown/WebFingerController.kt +++ b/src/main/kotlin/dev/usbharu/hideout/controller/wellknown/WebFingerController.kt @@ -5,6 +5,7 @@ import dev.usbharu.hideout.domain.model.wellknown.WebFinger import dev.usbharu.hideout.service.api.WebFingerApiService import dev.usbharu.hideout.util.AcctUtil import kotlinx.coroutines.runBlocking +import org.slf4j.LoggerFactory import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.stereotype.Controller @@ -18,7 +19,13 @@ class WebFingerController( ) { @GetMapping("/.well-known/webfinger") fun webfinger(@RequestParam("resource") resource: String): ResponseEntity = runBlocking { - val acct = AcctUtil.parse(resource.replace("acct:", "")) + logger.info("WEBFINGER Lookup webfinger resource: {}", resource) + val acct = try { + AcctUtil.parse(resource.replace("acct:", "")) + } catch (e: IllegalArgumentException) { + logger.warn("FAILED Parse acct.", e) + return@runBlocking ResponseEntity.badRequest().build() + } val user = webFingerApiService.findByNameAndDomain(acct.username, acct.domain ?: applicationConfig.url.host) val webFinger = WebFinger( @@ -31,6 +38,11 @@ class WebFingerController( ) ) ) + logger.info("SUCCESS Lookup webfinger resource: {} acct: {}", resource, acct) ResponseEntity(webFinger, HttpStatus.OK) } + + companion object { + private val logger = LoggerFactory.getLogger(WebFingerController::class.java) + } } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/ap/APService.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APService.kt index 0e14909c..9ea98a66 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/ap/APService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APService.kt @@ -188,11 +188,21 @@ class APServiceImpl( val logger: Logger = LoggerFactory.getLogger(APServiceImpl::class.java) override fun parseActivity(json: String): ActivityType { val readTree = objectMapper.readTree(json) - logger.trace("readTree: {}", readTree) + logger.trace( + """ + | + |***** Trace Begin Activity ***** + | + |{} + | + |***** Trace End Activity ***** + | + """.trimMargin(), readTree.toPrettyString() + ) if (readTree.isObject.not()) { throw JsonParseException("Json is not object.") } - val type = readTree["type"] + val type = readTree["type"] ?: throw JsonParseException("Type is null") if (type.isArray) { return type.firstNotNullOf { jsonNode: JsonNode -> ActivityType.values().firstOrNull { it.name.equals(jsonNode.asText(), true) } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/post/PostServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/post/PostServiceImpl.kt index c98ee233..a22666fa 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/post/PostServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/post/PostServiceImpl.kt @@ -7,6 +7,7 @@ import dev.usbharu.hideout.query.PostQueryService import dev.usbharu.hideout.repository.PostRepository import dev.usbharu.hideout.repository.UserRepository import org.jetbrains.exposed.exceptions.ExposedSQLException +import org.slf4j.LoggerFactory import org.springframework.stereotype.Service import java.time.Instant import java.util.* @@ -22,12 +23,19 @@ class PostServiceImpl( private val interceptors = Collections.synchronizedList(mutableListOf()) override suspend fun createLocal(post: PostCreateDto): Post { + logger.info("START Create Local Post user: {}, media: {}", post.userId, post.mediaIds.size) val create = internalCreate(post, true) interceptors.forEach { it.run(create) } + logger.info("SUCCESS Create Local Post url: {}", create.url) return create } - override suspend fun createRemote(post: Post): Post = internalCreate(post, false) + override suspend fun createRemote(post: Post): Post { + logger.info("START Create Remote Post user: {}, remote url: {}", post.userId, post.apId) + val createdPost = internalCreate(post, false) + logger.info("SUCCESS Create Remote Post url: {}", createdPost.url) + return createdPost + } override fun addInterceptor(postCreateInterceptor: PostCreateInterceptor) { interceptors.add(postCreateInterceptor) @@ -58,4 +66,8 @@ class PostServiceImpl( ) return internalCreate(createPost, isLocal) } + + companion object { + private val logger = LoggerFactory.getLogger(PostServiceImpl::class.java) + } } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionServiceImpl.kt index 4ccac212..134e0ba6 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionServiceImpl.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionServiceImpl.kt @@ -20,9 +20,7 @@ class ReactionServiceImpl( reactionRepository.save( Reaction(reactionRepository.generateId(), 0, postId, userId) ) - } catch (e: ExposedSQLException) { - LOGGER.warn("FAILED Failure to persist reaction information.") - LOGGER.debug("FAILED", e) + } catch (_: ExposedSQLException) { } } } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 73cc4b4a..5e4e2bc3 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -14,4 +14,5 @@ + From 3d795bbd8aea932479af6ec239efbdea91f6f2e5 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:05:53 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E3=81=AEMDC?= =?UTF-8?q?=E3=82=92kotlinx.coroutine=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + .../kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt | 5 +++-- .../dev/usbharu/hideout/service/core/ExposedTransaction.kt | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 0269b222..34f81ca1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -137,6 +137,7 @@ dependencies { implementation("software.amazon.awssdk:s3:2.20.157") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-slf4j:1.7.3") implementation("dev.usbharu:http-signature:1.0.0") implementation("io.ktor:ktor-client-logging-jvm:$ktor_version") diff --git a/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt index 26a6306b..9f4f87e2 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt @@ -29,6 +29,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async +import kotlinx.coroutines.slf4j.MDCContext import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Qualifier @@ -43,8 +44,8 @@ interface APNoteService { @Cacheable("fetchNote") fun fetchNoteAsync(url: String, targetActor: String? = null): Deferred { - return CoroutineScope(Dispatchers.IO).async { - newSuspendedTransaction { + return CoroutineScope(Dispatchers.IO + MDCContext()).async { + newSuspendedTransaction(MDCContext()) { fetchNote(url, targetActor) } } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/core/ExposedTransaction.kt b/src/main/kotlin/dev/usbharu/hideout/service/core/ExposedTransaction.kt index bcd95261..f0ed0568 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/core/ExposedTransaction.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/core/ExposedTransaction.kt @@ -1,18 +1,19 @@ package dev.usbharu.hideout.service.core +import kotlinx.coroutines.slf4j.MDCContext import org.jetbrains.exposed.sql.transactions.experimental.newSuspendedTransaction import org.springframework.stereotype.Service @Service class ExposedTransaction : Transaction { override suspend fun transaction(block: suspend () -> T): T { - return newSuspendedTransaction { + return newSuspendedTransaction(MDCContext()) { block() } } override suspend fun transaction(transactionLevel: Int, block: suspend () -> T): T { - return newSuspendedTransaction(transactionIsolation = transactionLevel) { + return newSuspendedTransaction(MDCContext(), transactionIsolation = transactionLevel) { block() } } From 22d0f8b16081e69fc449d62aaa5a044c8d9c2185 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Tue, 24 Oct 2023 20:19:22 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E3=82=BB=E3=82=AD=E3=83=A5?= =?UTF-8?q?=E3=83=AA=E3=83=86=E3=82=A3=E3=83=95=E3=82=A3=E3=83=AB=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=81=AE=E5=89=8D=E3=81=ABMDC=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usbharu/hideout/service/core/MdcXrequestIdFilter.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/dev/usbharu/hideout/service/core/MdcXrequestIdFilter.kt b/src/main/kotlin/dev/usbharu/hideout/service/core/MdcXrequestIdFilter.kt index 2ad64bd9..ddbc8a01 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/core/MdcXrequestIdFilter.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/core/MdcXrequestIdFilter.kt @@ -5,10 +5,13 @@ import jakarta.servlet.FilterChain import jakarta.servlet.ServletRequest import jakarta.servlet.ServletResponse import org.slf4j.MDC -import org.springframework.stereotype.Service +import org.springframework.boot.autoconfigure.security.SecurityProperties +import org.springframework.core.annotation.Order +import org.springframework.stereotype.Component import java.util.* -@Service +@Component +@Order(SecurityProperties.DEFAULT_FILTER_ORDER - 1) class MdcXrequestIdFilter : Filter { override fun doFilter(request: ServletRequest?, response: ServletResponse?, chain: FilterChain) { val uuid = UUID.randomUUID()