feat(ranking): 랭킹 조회 관측 로그를 추가한다

This commit is contained in:
2026-06-09 00:09:17 +09:00
parent 5f08165239
commit 394786e6bc
2 changed files with 89 additions and 17 deletions

View File

@@ -4,6 +4,7 @@ import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingItem
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingBlockPort
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotPort
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotRecord
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@@ -15,28 +16,59 @@ class CreatorRankingQueryService(
@Value("\${cloud.aws.cloud-front.host}")
private val cloudFrontHost: String
) {
private val log = LoggerFactory.getLogger(javaClass)
@Transactional(readOnly = true)
fun getCreatorRankings(viewerMemberId: Long?): CreatorRankingResult {
val latestItems = snapshotPort.findLatestSnapshots().toRankedItems()
if (latestItems.isEmpty()) {
return CreatorRankingResult(showRankChange = false, items = emptyList())
}
val startedAt = System.currentTimeMillis()
return runCatching {
val latestItems = snapshotPort.findLatestSnapshots().toRankedItems()
if (latestItems.isEmpty()) {
return@runCatching QueryLogResult(
result = CreatorRankingResult(showRankChange = false, items = emptyList()),
blockedCreatorCount = 0
)
}
val previousItems = snapshotPort.findPreviousCompletedSnapshots().toRankedItems()
val previousRankByCreatorId = previousItems.associate { it.creatorId to it.rank }
val showRankChange = previousRankByCreatorId.isNotEmpty()
val blockedCreatorIds = findBlockedCreatorIds(viewerMemberId = viewerMemberId, items = latestItems)
val items = latestItems.map { item ->
val previousRank = previousRankByCreatorId[item.creatorId]
item.copy(
rankChange = if (showRankChange && previousRank != null) previousRank - item.rank else null,
isNew = showRankChange && previousRank == null
).maskIfBlocked(blockedCreatorIds)
}
val previousItems = snapshotPort.findPreviousCompletedSnapshots().toRankedItems()
val previousRankByCreatorId = previousItems.associate { it.creatorId to it.rank }
val showRankChange = previousRankByCreatorId.isNotEmpty()
val blockedCreatorIds = findBlockedCreatorIds(viewerMemberId = viewerMemberId, items = latestItems)
val items = latestItems.map { item ->
val previousRank = previousRankByCreatorId[item.creatorId]
item.copy(
rankChange = if (showRankChange && previousRank != null) previousRank - item.rank else null,
isNew = showRankChange && previousRank == null
).maskIfBlocked(blockedCreatorIds)
}
return CreatorRankingResult(showRankChange = showRankChange, items = items)
QueryLogResult(
result = CreatorRankingResult(showRankChange = showRankChange, items = items),
blockedCreatorCount = blockedCreatorIds.size
)
}.onSuccess { logResult ->
log.info(
"event=creator_ranking_query_success showRankChange={} itemCount={} blockedCreatorCount={} elapsedMs={}",
logResult.result.showRankChange,
logResult.result.items.size,
logResult.blockedCreatorCount,
System.currentTimeMillis() - startedAt
)
}.onFailure { ex ->
log.warn(
"event=creator_ranking_query_failure elapsedMs={} error={}",
System.currentTimeMillis() - startedAt,
ex.message,
ex
)
}.getOrThrow().result
}
private data class QueryLogResult(
val result: CreatorRankingResult,
val blockedCreatorCount: Int
)
private fun List<CreatorRankingSnapshotRecord>.toRankedItems(): List<CreatorRankingItem> {
return groupBy { it.finalScore }
.toSortedMap(compareByDescending { it })