feat(Analytics): d3 based visualization

This commit is contained in:
Kyush 2026-03-26 19:01:33 +09:00
commit b6152cd6d0
19 changed files with 2088 additions and 79 deletions

30
docs/analytics.md Normal file
View file

@ -0,0 +1,30 @@
# Analytics
현재 관리자 Analytics 화면은 표 중심 조회가 아니라 운영 지표를 빠르게 훑을 수 있는 D3 기반 시계열 대시보드로 구성된다.
## UI
- 경로: `/dashboard/analytics`
- 공통 필터: 기간(`7`, `30`, `90`일), backend 선택
- 상단 요약: requests, tokens, 평균 응답 시간, errors
- 주요 패널
- Daily Volume: 일별 requests + tokens
- Backend Reliability: success rate + error count
- Backend Response Time: backend별 평균 응답 시간
- Model Request Trends: 상위 모델 요청 추이
- Response Length Distribution: `completion_tokens` histogram
- Daily Response Length Spread: `completion_tokens` box plot
## API
- `GET /admin/analytics/daily-totals`
- `GET /admin/analytics/backend-quality`
- `GET /admin/analytics/model-trends`
- `GET /admin/analytics/response-length-histogram`
- `GET /admin/analytics/response-length-box-plot`
## 집계 규칙
- 모델 추이의 모델 키는 `response_model -> routed_model -> request_model -> unknown` 순서로 결정한다.
- response length 계열 시각화는 `completion_tokens` 값이 있는 요청만 집계한다.
- 상세 요청 단위의 latency/body 확인은 계속 `DetailLogs` 화면에서 담당한다.

View file

@ -118,9 +118,18 @@
| GET | `/admin/analytics/usage` | userId, backendId, days | 사용량 통계 |
| GET | `/admin/analytics/requests` | month, date, limit, offset, q, userId, backendId, endpoint, detailLogged | 월별 상세 요청 로그 조회 |
| GET | `/admin/analytics/metrics` | backendId, days | 백엔드 성능 메트릭 |
| GET | `/admin/analytics/daily-totals` | backendId, days | 일별 전체 request/token 합계 |
| GET | `/admin/analytics/backend-quality` | backendId, days | 일별 backend response time / error / success rate 시계열 |
| GET | `/admin/analytics/model-trends` | backendId, days, limit | 모델별 일별 요청 추이 |
| GET | `/admin/analytics/response-length-histogram` | backendId, days, bins | `completion_tokens` 분포 histogram |
| GET | `/admin/analytics/response-length-box-plot` | backendId, days | `completion_tokens` 일별 box plot 요약 |
상세 로그는 `users.detail_logging=1` 또는 `backends.detail_logging=1`일 때만 request/response header/body가 저장된다.
- `model-trends``response_model -> routed_model -> request_model -> unknown` 순서로 모델 키를 결정한다.
- response length 계열 endpoint는 `completion_tokens` 가 있는 요청만 집계한다.
- 자세한 내용은 [docs/analytics.md](./analytics.md) 참고.
참고:
- 관리자 인증과 세션/토큰 정책은 [docs/admin-auth.md](./admin-auth.md) 참고
- OpenID Connect 설정은 [docs/oidc.md](./oidc.md) 참고

View file

@ -15,10 +15,9 @@ client/src/
index.ts # TypeScript 타입 정의
routes/
Dashboard.tsx # 운영 요약, 최근 요청, 관리자 토큰 관리
Users.tsx # 사용자 CRUD
Users.tsx # 사용자 CRUD / 권한 매핑 관리
Backends.tsx # 백엔드 CRUD
Models.tsx # 모델 캐시/리라이트 규칙 관리
Permissions.tsx # 권한 매핑 관리
Analytics.tsx # 분석 화면
DetailLogs.tsx # 상세 요청 로그 탐색
Scripts.tsx # 스크립트 관리 및 테스트
@ -40,10 +39,9 @@ client/src/
| `/dashboard/users` | Users | 사용자 관리 |
| `/dashboard/backends` | Backends | 백엔드 관리 |
| `/dashboard/models` | Models | 모델 캐시/리라이트 관리 |
| `/dashboard/permissions` | Permissions | 권한 관리 |
| `/dashboard/analytics` | Analytics | 분석 대시보드 |
| `/dashboard/detail-logs` | DetailLogs | 상세 요청 로그 탐색 |
| `/dashboard/scripts` | Scripts | 스크립트 관리 |
| `/dashboard/detail-logs` | DetailLogs | 상세 요청 로그 탐색 |
| `/dashboard/analytics` | Analytics | 분석 대시보드 |
모든 관리자 라우트는 로그인 게이트 아래에서 렌더링된다.
@ -66,6 +64,14 @@ SPA는 `/dashboard`를 라우터 base로 사용하고, 관리자 API는 계속 `
- 세션 기반 쓰기 요청에는 `X-CSRF-Token`이 자동 포함된다
- 401 응답이 오면 UI는 로그인 상태로 되돌아간다
## Analytics 메모
- `Analytics` 화면은 D3 기반 시계열 대시보드로 동작한다.
- 공통 필터는 기간(`7`, `30`, `90`일)과 backend 선택이다.
- 상단 summary strip 뒤에 일별 volume, reliability, response time, model trends, response length 분포 패널이 배치된다.
- 상세 raw request 확인은 계속 `DetailLogs` 화면이 담당한다.
- 자세한 내용은 [docs/analytics.md](./analytics.md) 참고.
## Model Management UI
- `Backends` 화면은 백엔드별 모델 캐시 상태, 모델 수, 마지막 sync 상태를 표시한다

View file

@ -66,6 +66,15 @@ server/src/
참고:
- 세부 라우팅 규칙과 캐시 트리거는 [docs/model-routing.md](./model-routing.md) 참고
## Analytics 메모
- `/admin/analytics` 는 기존 usage/requests/metrics 외에 chart 전용 집계 endpoint를 함께 제공한다.
- 추가 endpoint: `daily-totals`, `backend-quality`, `model-trends`, `response-length-histogram`, `response-length-box-plot`
- `AnalyticsService``analytics.db` 의 일별 집계와 `request_logs_YYYY-MM.db` 의 범위 조회를 함께 사용해 시계열/분포 데이터를 만든다.
- 모델 추이 키는 `response_model -> routed_model -> request_model -> unknown` 순서로 결정한다.
- response length 계열 집계는 `completion_tokens` 가 있는 요청만 포함한다.
- 자세한 화면/API 설명은 [docs/analytics.md](./analytics.md) 참고.
## Deployment Notes
- 권장 런타임은 단일 OCI 이미지다