From d19a33b23351ae13b7c1b1e3afa05e80e1d3e8af Mon Sep 17 00:00:00 2001 From: htlee Date: Fri, 27 Mar 2026 07:04:36 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix(dashboard):=20Top=20=ED=81=B4=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EC=96=B8=ED=8A=B8=20IP/ID=20=ED=86=A0=EA=B8=80=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A9=94=ED=8A=B8=EB=A6=AD=20=ED=91=9C=EC=8B=9C=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 토글 활성 상태 시각적 구분 강화 (bg-secondary + font-medium) - IP 모드 "-" 표시 수정 — 백엔드 client 필드명 매핑 보정 - ID 데이터 없을 때 섹션 사라지는 대신 안내 메시지 표시 - 쿼리 이력(ApiMetrics)에 client_id 컬럼 추가 - history SQL에 client_id 컬럼 포함 Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/src/api/types.ts | 5 ++- frontend/src/pages/ApiMetrics.tsx | 4 ++ frontend/src/pages/Dashboard.tsx | 45 ++++++++++--------- .../controller/QueryMetricsController.java | 2 +- 4 files changed, 34 insertions(+), 22 deletions(-) diff --git a/frontend/src/api/types.ts b/frontend/src/api/types.ts index e8b52ab..2970e5b 100644 --- a/frontend/src/api/types.ts +++ b/frontend/src/api/types.ts @@ -208,6 +208,7 @@ export interface QueryMetricRow { cache_hit_days: number db_query_days: number client_ip: string | null + client_id: string | null } export interface QueryMetricsPage { @@ -252,7 +253,8 @@ export interface TimeSeriesBucket { } export interface TopClient { - client_ip: string + client: string + client_ip?: string query_count: number avg_elapsed_ms: number } @@ -261,6 +263,7 @@ export interface QueryMetricsTimeSeries { buckets: TimeSeriesBucket[] topClients: TopClient[] granularity: 'HOURLY' | 'DAILY' + groupBy?: 'ip' | 'id' } export interface QueryMetricsParams { diff --git a/frontend/src/pages/ApiMetrics.tsx b/frontend/src/pages/ApiMetrics.tsx index 264ec8d..c3e95fc 100644 --- a/frontend/src/pages/ApiMetrics.tsx +++ b/frontend/src/pages/ApiMetrics.tsx @@ -136,6 +136,10 @@ export default function ApiMetrics() { key: 'client_ip', label: t('metrics.clientIp'), sortable: false, render: (row) => row.client_ip ? {row.client_ip} : '-', }, + { + key: 'client_id', label: 'ID', sortable: false, + render: (row) => row.client_id ? {row.client_id} : '-', + }, ] return ( diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index 42db6a9..e2c6e06 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -326,30 +326,31 @@ export default function Dashboard() { {/* Top Clients */} - {queryTs.topClients.length > 0 && ( -
-
- {t('dashboard.topClients')} -
- - -
+
+
+ {t('dashboard.topClients')} +
+ +
+
+ {queryTs.topClients.length > 0 ? (
{queryTs.topClients.map((c, i) => { const maxCount = queryTs.topClients[0].query_count const pct = maxCount > 0 ? (c.query_count / maxCount) * 100 : 0 + const label = c.client ?? c.client_ip ?? '-' return ( -
- {c.client_ip ?? '-'} +
+ {label}
-
- )} + ) : ( +
+ {clientGroupBy === 'id' ? '사용자 ID 데이터가 없습니다' : '클라이언트 데이터가 없습니다'} +
+ )} +
) : (
{t('dashboard.noChartData')}
diff --git a/src/main/java/gc/mda/signal_batch/monitoring/controller/QueryMetricsController.java b/src/main/java/gc/mda/signal_batch/monitoring/controller/QueryMetricsController.java index 5afd5fc..eb18a0b 100644 --- a/src/main/java/gc/mda/signal_batch/monitoring/controller/QueryMetricsController.java +++ b/src/main/java/gc/mda/signal_batch/monitoring/controller/QueryMetricsController.java @@ -106,7 +106,7 @@ public class QueryMetricsController { zoom_level, requested_mmsi, unique_vessels, total_tracks, total_points, points_after_simplify, total_chunks, response_bytes, elapsed_ms, db_query_ms, simplify_ms, - cache_hit_days, db_query_days, client_ip + cache_hit_days, db_query_days, client_ip, client_id FROM signal.t_query_metrics """ + whereClause + " ORDER BY " + sortBy + " " + direction + From 13c263e6493106b890b53b4813515be94d7a629c Mon Sep 17 00:00:00 2001 From: htlee Date: Fri, 27 Mar 2026 07:12:50 +0900 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20=EB=A6=B4=EB=A6=AC=EC=A6=88=20?= =?UTF-8?q?=EB=85=B8=ED=8A=B8=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/RELEASE-NOTES.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/RELEASE-NOTES.md b/docs/RELEASE-NOTES.md index 832d68f..4a115d0 100644 --- a/docs/RELEASE-NOTES.md +++ b/docs/RELEASE-NOTES.md @@ -4,6 +4,10 @@ ## [Unreleased] +### 수정 +- Top 클라이언트 IP/ID 토글 활성 상태 구분 및 표시 오류 수정 +- 쿼리 이력(메트릭 페이지)에 사용자 ID 컬럼 추가 + ## [2026-03-27] ### 추가