GC_SESSION JWT 쿠키에서 인증된 사용자 email을 추출하여 쿼리 메트릭에 기록. 대시보드 Top 클라이언트를 IP 기준 또는 사용자 ID 기준으로 전환 가능. 백엔드: - WebSocket 핸드셰이크에서 GC_SESSION 쿠키 JWT payload → email 추출 - QueryMetric에 clientId 필드 추가, t_query_metrics에 client_id 컬럼 자동 생성 - timeseries API에 groupBy=ip|id 파라미터 추가 프론트엔드: - Dashboard Top 클라이언트 섹션에 IP/ID 세그먼트 토글 추가 - 토글 전환 시 즉시 재조회 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
75 lines
2.3 KiB
TypeScript
75 lines
2.3 KiB
TypeScript
import { fetchJson } from './httpClient.ts'
|
|
import type {
|
|
CacheDetails,
|
|
CacheStats,
|
|
DataQuality,
|
|
HaeguStat,
|
|
MetricsSummary,
|
|
ProcessingDelay,
|
|
QueryMetricsPage,
|
|
QueryMetricsParams,
|
|
QueryMetricsSummary,
|
|
QueryMetricsTimeSeries,
|
|
ThroughputMetrics,
|
|
} from './types.ts'
|
|
|
|
export const monitorApi = {
|
|
getDelay(): Promise<ProcessingDelay> {
|
|
return fetchJson('/monitor/delay')
|
|
},
|
|
|
|
getMetricsSummary(): Promise<MetricsSummary> {
|
|
return fetchJson('/admin/metrics/summary')
|
|
},
|
|
|
|
getCacheStats(): Promise<CacheStats> {
|
|
return fetchJson('/api/monitoring/cache/stats')
|
|
},
|
|
|
|
getCacheDetails(): Promise<CacheDetails> {
|
|
return fetchJson('/api/monitoring/cache/details')
|
|
},
|
|
|
|
getDailyCacheStatus(): Promise<Record<string, unknown>> {
|
|
return fetchJson('/api/websocket/daily-cache')
|
|
},
|
|
|
|
getThroughput(): Promise<ThroughputMetrics> {
|
|
return fetchJson('/monitor/throughput')
|
|
},
|
|
|
|
getQuality(): Promise<DataQuality> {
|
|
return fetchJson('/monitor/quality')
|
|
},
|
|
|
|
getHaeguRealtimeStats(): Promise<HaeguStat[]> {
|
|
return fetchJson('/monitor/haegu/realtime')
|
|
},
|
|
|
|
getHaeguStats(): Promise<Record<string, unknown>[]> {
|
|
return fetchJson('/admin/haegu/stats')
|
|
},
|
|
|
|
getQueryMetricsHistory(params: QueryMetricsParams): Promise<QueryMetricsPage> {
|
|
const qs = new URLSearchParams()
|
|
if (params.queryType) qs.set('queryType', params.queryType)
|
|
if (params.dataPath) qs.set('dataPath', params.dataPath)
|
|
if (params.status) qs.set('status', params.status)
|
|
if (params.elapsedMsMin != null) qs.set('elapsedMsMin', String(params.elapsedMsMin))
|
|
if (params.elapsedMsMax != null) qs.set('elapsedMsMax', String(params.elapsedMsMax))
|
|
qs.set('page', String(params.page ?? 0))
|
|
qs.set('size', String(params.size ?? 20))
|
|
qs.set('sortBy', params.sortBy ?? 'created_at')
|
|
qs.set('sortDir', params.sortDir ?? 'desc')
|
|
return fetchJson(`/api/monitoring/query-metrics/history?${qs}`)
|
|
},
|
|
|
|
getQueryMetricsSummary(hours = 24): Promise<QueryMetricsSummary> {
|
|
return fetchJson(`/api/monitoring/query-metrics/summary?hours=${hours}`)
|
|
},
|
|
|
|
getQueryMetricsTimeSeries(days = 7, groupBy: 'ip' | 'id' = 'ip'): Promise<QueryMetricsTimeSeries> {
|
|
return fetchJson(`/api/monitoring/query-metrics/timeseries?days=${days}&groupBy=${groupBy}`)
|
|
},
|
|
}
|