signal-batch/frontend/src/api/monitorApi.ts
htlee 7852f840e4 feat: 쿼리 메트릭 수집 확장 + 대시보드 성능 차트 추가
- client IP 수집 (REST: X-Forwarded-For 체인, WS: 세션 속성)
- 응답 크기 추정 (uniqueVessels*200 + points*40)
- timeseries API (/api/monitoring/query-metrics/timeseries)
- Dashboard 쿼리 성능 차트 5종 (응답시간, 볼륨, 캐시경로, 응답크기, Top 클라이언트)
2026-03-10 11:15:00 +09:00

75 lines
2.2 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): Promise<QueryMetricsTimeSeries> {
return fetchJson(`/api/monitoring/query-metrics/timeseries?days=${days}`)
},
}