Skip to content

Commit a6b71eb

Browse files
committed
feat(FR-2494): add auto scaling rule UX improvements spec
1 parent 4e0fbf5 commit a6b71eb

1 file changed

Lines changed: 141 additions & 0 deletions

File tree

  • .specs/draft-auto-scaling-rule-ux
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
# Auto Scaling Rule UX 개선 Spec
2+
3+
## 개요
4+
5+
서비스 디테일 페이지의 Auto Scaling Rule 편집/목록 UI를 개선한다. 비교 연산자 방향을 정규화하고, 단일/범위 조건 모드를 추가하며, 백엔드 >=26.4.0에서 Prometheus Query Preset 기반 메트릭 선택을 지원한다.
6+
7+
## 문제 정의
8+
9+
현재 Auto Scaling Rule UI에는 다음 문제점이 있다:
10+
11+
1. **규칙 목록에서 비교 연산자 방향이 혼재**: 규칙 목록 테이블에서 `>`, `>=`, `<`, `<=`가 혼재되어 표시되어 한눈에 조건을 파악하기 어렵다
12+
2. **범위 조건 미지원**: 하한과 상한을 동시에 지정할 수 없어 사용자가 두 개의 개별 Rule을 만들어야 한다
13+
3. **메트릭 선택이 수동 입력 의존**: 사용자가 metric source와 metric name을 직접 입력해야 하며, Prometheus Query Preset을 활용할 수 없다
14+
15+
## 요구사항
16+
17+
### 필수 (Must Have)
18+
19+
#### 1. 규칙 목록 테이블 비교 연산자 표시 정규화
20+
21+
- [ ] `EndpointDetailPage`의 Auto Scaling Rules 테이블에서 조건 컬럼의 비교 연산자를 항상 `<` / `<=` 방향으로 표시
22+
- [ ] GREATER_THAN으로 저장된 Rule: threshold와 metric_name 위치를 교환하여 `[threshold] < [metric_name]` 형태로 표시
23+
- [ ] GREATER_THAN_OR_EQUAL로 저장된 Rule: threshold와 metric_name 위치를 교환하여 `[threshold] <= [metric_name]` 형태로 표시
24+
- [ ] LESS_THAN / LESS_THAN_OR_EQUAL로 저장된 Rule: 기존대로 `[metric_name] < [threshold]` / `[metric_name] <= [threshold]` 형태로 표시
25+
- [ ] 에디터 모달의 비교 연산자 드롭다운은 기존 4가지(`<`, `<=`, `>`, `>=`)를 그대로 유지
26+
27+
#### 2. 조건 모드 선택 (단일/범위)
28+
29+
- [ ] Auto Scaling Rule 에디터 모달에 Ant Design `Segmented` 컴포넌트를 추가하여 "단일" / "범위" 모드 전환
30+
- [ ] **단일 모드**: 현재 UI와 동일하게 하나의 비교 연산자(`<`, `<=`, `>`, `>=`)와 threshold 값을 입력
31+
- [ ] **범위 모드**: 쿼리 키를 기준으로 상한/하한 범위를 동시에 지정
32+
- UI 구성: `[하한값] [< 또는 ≤] [쿼리 키] [< 또는 ≤] [상한값]`
33+
- 왼쪽 비교 연산자: `greater_than` (`<`) 또는 `greater_than_or_equal` (`<=`) — 쿼리 키가 하한값보다 큼
34+
- 오른쪽 비교 연산자: `less_than` (`<`) 또는 `less_than_or_equal` (`<=`) — 쿼리 키가 상한값보다 작음
35+
- 각 비교 연산자는 드롭다운으로 선택
36+
- [ ] 기본 모드: "단일"
37+
- [ ] 범위 모드 저장 시 `CreateAutoScalingRuleInput``minThreshold` / `maxThreshold` 필드를 사용하여 하나의 Rule로 저장 (현재 사용 중인 API에 이미 지원됨)
38+
39+
#### 3. Prometheus Preset 기반 메트릭 선택
40+
41+
- [ ] `baiClient.supports('prometheus-auto-scaling-rule')` (또는 >=26.4.0 대응 키)로 기능 게이팅
42+
- [ ] >=26.4.0: 기존 metric source 드롭다운(KERNEL/INFERENCE_FRAMEWORK)과 metric name AutoComplete를 `prometheusQueryPresets` 기반 Select로 대체
43+
- [ ] 사용자가 Preset의 `metricName`을 선택하면 해당 Preset의 `queryTemplate``timeWindow`가 자동으로 적용
44+
- [ ] <26.4.0: 기존 방식 유지 (metric source 선택 + metric name 수동 입력)
45+
- [ ] **TODO(needs-backend)**: 백엔드 코어 Auto Scaling PR이 머지되면 `metric_source` 필드의 버전별 분기 처리가 필요할 수 있음. 해당 시점에 확인 필요
46+
47+
### 선택 (Nice to Have)
48+
49+
#### 쿼리 결과값 미리보기
50+
51+
- [ ] 메트릭 설정 form item의 `extra` 영역에 `prometheusQueryPresetResult` API 호출 결과를 표시
52+
- [ ] 표시 상태: 로딩 스피너 -> 결과값 텍스트 + 새로고침 아이콘 버튼
53+
- [ ] 새로고침 버튼 클릭 시 최신 결과를 다시 조회
54+
- [ ] Prometheus Preset 모드가 활성화된 경우(>=26.4.0)에만 표시
55+
- [ ] `options` 파라미터(`ExecuteQueryDefinitionOptionsInput`)를 통해 `filterLabels``groupLabels`를 전달하여 쿼리 실행
56+
57+
## 사용자 스토리
58+
59+
- 일반 사용자로서, Auto Scaling Rule의 비교 연산자가 항상 동일한 방향(`<` / `<=`)으로 표시되어 조건을 직관적으로 이해할 수 있다
60+
- 일반 사용자로서, Auto Scaling Rule의 조건을 단일 값 또는 범위로 설정하여 더 유연한 스케일링 기준을 만들 수 있다
61+
- 일반 사용자로서, 어드민이 등록한 Prometheus Query Preset 목록에서 메트릭을 선택하여 복잡한 PromQL을 직접 입력하지 않고 Rule을 설정할 수 있다 (>=26.4.0)
62+
- 일반 사용자로서, Auto Scaling Rule 설정 시 현재 쿼리 결과값을 미리보기하여 설정 값이 적절한지 확인할 수 있다
63+
64+
## 인수 조건 (Acceptance Criteria)
65+
66+
### 비교 연산자 표시 정규화
67+
68+
- [ ] Rules 목록 테이블에서 모든 조건이 `<` / `<=` 방향으로 통일되어 표시된다
69+
- [ ] 단일 모드에서 LESS_THAN으로 저장된 Rule: `[metric_name] < [threshold]` 형태로 표시
70+
- [ ] 단일 모드에서 LESS_THAN_OR_EQUAL로 저장된 Rule: `[metric_name] <= [threshold]` 형태로 표시
71+
- [ ] 단일 모드에서 GREATER_THAN으로 저장된 Rule: `[threshold] < [metric_name]` 형태로 표시 (방향 반전)
72+
- [ ] 단일 모드에서 GREATER_THAN_OR_EQUAL로 저장된 Rule: `[threshold] <= [metric_name]` 형태로 표시 (방향 반전)
73+
- [ ] 범위 모드로 저장된 Rule (minThreshold + maxThreshold): `[minThreshold] < [metric_name] < [maxThreshold]` 형태로 표시
74+
- [ ] 에디터 모달의 비교 연산자 드롭다운에는 기존 4가지(`<`, `<=`, `>`, `>=`)가 그대로 유지된다
75+
76+
### 조건 모드 (단일/범위)
77+
78+
- [ ] Segmented 컴포넌트로 "단일" / "범위" 모드를 전환할 수 있다
79+
- [ ] 단일 모드에서는 하나의 비교 연산자(`<`, `<=`, `>`, `>=`)와 threshold를 입력한다
80+
- [ ] 범위 모드에서는 `[하한값] [< 또는 ≤] [metric_name] [< 또는 ≤] [상한값]` 형태로 입력한다
81+
- [ ] 왼쪽 비교 연산자는 `<` (GREATER_THAN) 또는 `<=` (GREATER_THAN_OR_EQUAL), 오른쪽은 `<` (LESS_THAN) 또는 `<=` (LESS_THAN_OR_EQUAL)이다
82+
- [ ] 범위 모드에서 하한값이 상한값보다 크거나 같으면 validation 에러를 표시한다
83+
- [ ] 기본 모드는 "단일"이다
84+
85+
### Prometheus Preset 기반 메트릭 선택
86+
87+
- [ ] 백엔드 >=26.4.0에서 Prometheus Query Preset 목록이 Select 옵션으로 표시된다
88+
- [ ] Preset 선택 시 `queryTemplate``timeWindow`가 자동으로 반영된다
89+
- [ ] 백엔드 <26.4.0에서는 기존 KERNEL/INFERENCE_FRAMEWORK 기반 수동 입력 방식이 동작한다
90+
- [ ] 버전 게이팅은 `baiClient.supports()` 패턴을 사용한다
91+
92+
### 쿼리 결과값 미리보기 (Nice to Have)
93+
94+
- [ ] 메트릭 설정 form item 하단(`extra`)에 쿼리 결과값이 표시된다
95+
- [ ] 결과값 조회 중에는 로딩 스피너가 표시된다
96+
- [ ] 결과값 옆에 새로고침 아이콘 버튼이 있다
97+
- [ ] Prometheus Preset 모드가 비활성화된 경우 미리보기가 표시되지 않는다
98+
99+
## 버전 게이팅 전략
100+
101+
| 기능 | <26.4.0 | >=26.4.0 |
102+
|---|---|---|
103+
| 비교 연산자 목록 정규화 | 적용 | 적용 |
104+
| 조건 모드 (단일/범위) | 적용 | 적용 |
105+
| Prometheus Preset 메트릭 선택 | 기존 수동 입력 유지 | Preset 기반 Select |
106+
| 쿼리 결과값 미리보기 | 미표시 | 표시 (Nice to Have) |
107+
108+
## 현재 코드 참조
109+
110+
| 파일 | 설명 |
111+
|---|---|
112+
| `react/src/components/AutoScalingRuleEditorModal.tsx` | Rule 추가/편집 모달. `COMPARATOR_LABELS` (line 53-58), `METRIC_NAMES_MAP` (line 60-65) |
113+
| `react/src/pages/EndpointDetailPage.tsx` | Rules 목록 테이블 (line 697-926), `baiClient.supports('auto-scaling-rule')` (line 170) |
114+
115+
## GraphQL API 참조
116+
117+
### 쿼리 (모든 인증된 사용자)
118+
119+
| 쿼리 | 설명 |
120+
|---|---|
121+
| `prometheusQueryPresets(filter, orderBy, limit, offset)` | Preset 목록 조회 |
122+
| `prometheusQueryPreset(id)` | 단일 Preset 조회 |
123+
| `prometheusQueryPresetResult(id, timeRange, options, timeWindow)` | Preset 기반 쿼리 실행 결과 조회 |
124+
125+
### 주요 타입
126+
127+
- **QueryDefinition**: `id`, `name`, `metricName`, `queryTemplate`, `timeWindow`, `options`(`filterLabels`, `groupLabels`), `createdAt`, `updatedAt`
128+
- **ExecuteQueryDefinitionOptionsInput**: `filterLabels`(`[MetricLabelEntryInput!]`), `groupLabels`(`[String!]`)
129+
- **QueryDefinitionExecuteResult**: `status`, `resultType`, `result`(`[QueryDefinitionMetricResult!]!`)
130+
131+
## 범위 외 (Out of Scope)
132+
133+
- Admin Serving 페이지 Prometheus Query Preset CRUD (별도 Spec으로 진행)
134+
- Auto Scaling Rule CRUD 자체 (이미 구현됨)
135+
- Prometheus 서버 연결/인프라 관리
136+
- Rule 실행 이력 조회 및 모니터링 대시보드
137+
- `metric_source` 필드의 백엔드 변경 대응 (백엔드 PR 머지 후 별도 처리)
138+
139+
## 관련 이슈
140+
141+
- draft-auto-scaling-rule-management: 상위 범위의 드래프트 Spec (Admin Serving 페이지 Preset CRUD 포함)

0 commit comments

Comments
 (0)