From 5b706bfc33ee6830682081a879ca25b5d8021e13 Mon Sep 17 00:00:00 2001 From: rtgs Date: Thu, 16 Jul 2026 14:29:47 +0900 Subject: [PATCH] =?UTF-8?q?feat(report):=20=EC=B2=98=EB=A6=AC=EB=9F=89(TPS?= =?UTF-8?q?)=20=EC=A7=80=ED=91=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /admin/report에 throughput(초당 버킷): 접수/완결 최대 TPS, 완결 평균 TPS(활성구간), 활성 초수 - 보고서 화면에 🚀 처리량(TPS) 섹션(지연시간 아래) + 드라이버 부하 기준 주의 문구 Co-Authored-By: Claude Opus 4.8 --- .../kr/or/bok/rtgs/louisvuitton/AdminController.kt | 13 +++++++++++++ frontend/src/Report.tsx | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/backend/louisvuitton/src/main/kotlin/kr/or/bok/rtgs/louisvuitton/AdminController.kt b/backend/louisvuitton/src/main/kotlin/kr/or/bok/rtgs/louisvuitton/AdminController.kt index 5dbca0a..cbc92e2 100644 --- a/backend/louisvuitton/src/main/kotlin/kr/or/bok/rtgs/louisvuitton/AdminController.kt +++ b/backend/louisvuitton/src/main/kotlin/kr/or/bok/rtgs/louisvuitton/AdminController.kt @@ -148,6 +148,18 @@ class AdminController( AND t.created_at >= r.received_at -- 인과 정합(접수≤순번) 행만: BMI 재사용 등 시계 역전 건 제외 """.trimIndent()) + // 처리량(TPS) — 초 단위 버킷의 최대/평균. 접수(수용) vs 완결(처리) 관측치. + // active_secs = 완결이 있었던 초 개수 → settled_avg는 활성 구간 평균(유휴 제외). + val tps = jdbc.queryForMap( + """ + WITH recv AS (SELECT received_at/1000 AS s, count(*) c FROM raw_message WHERE received_at > 0 GROUP BY received_at/1000), + done AS (SELECT updated_at/1000 AS s, count(*) c FROM transfer WHERE status='ACCC' GROUP BY updated_at/1000) + SELECT COALESCE((SELECT max(c) FROM recv),0) AS received_peak, + COALESCE((SELECT max(c) FROM done),0) AS settled_peak, + COALESCE((SELECT round(avg(c)) FROM done),0) AS settled_avg, + COALESCE((SELECT count(*) FROM done),0) AS active_secs + """.trimIndent()) + // 기관별 송·수신 집계(ACCC 기준) + 현재 잔액 val byInstitution = jdbc.queryForList( """ @@ -172,6 +184,7 @@ class AdminController( ), "amount" to amt, "latency" to lat, + "throughput" to tps, "byInstitution" to byInstitution, ) } diff --git a/frontend/src/Report.tsx b/frontend/src/Report.tsx index 490b9db..572ea5c 100644 --- a/frontend/src/Report.tsx +++ b/frontend/src/Report.tsx @@ -32,6 +32,7 @@ function ReportInner() { const rec = rep.reconciliation ?? {} const amt = rep.amount ?? {} const lat = rep.latency ?? {} + const tp = rep.throughput ?? {} const cnt = (st: string) => n((t.byStatus ?? []).find((b: any) => b.status === st)?.cnt) const total = n(t.transfers) const accc = cnt('ACCC'), rjct = cnt('RJCT') @@ -106,6 +107,18 @@ function ReportInner() { + {/* 처리량(TPS) */} +
+

🚀 처리량 (TPS) (초당 건수 관측치 · 테스트 드라이버 부하 기준, 시스템 한계 아님)

+
+
완결 최대 TPS
{num(tp.settled_peak)} /s
+
완결 평균 TPS (활성구간)
{num(tp.settled_avg)} /s
+
접수 최대 TPS
{num(tp.received_peak)} /s
+
활성 구간
{num(tp.active_secs)} s
+
+

※ 접수·완결 최대 TPS가 비슷하면 파이프라인이 부하를 따라온 것(=드라이버 한계). 진짜 최대 용량은 k6 부하시험으로 측정.

+
+ {/* 기관별 */}

🏛 기관별 송·수신 (완결 ACCC 기준)