ADR-004 상태 조회 = ⑤ Grafana(k6 remote-write), 제어 = compose lifecycle
상태
채택 (2026-07-03)
맥락
FR-6은 실시간 상태(현재 목표 TPS·실제 도달 TPS·활성 시나리오) 조회를 최소 보장으로 요구하고 구현 수단은 TDD에 위임했다. FR-7은 온오프 제어(시작/중지/일시정지)를 요구한다. 이 과제는 애플리케이션 코드를 만들지 않는 것이 원칙이며, ⑤가 Prometheus·Grafana를 이미 제공한다.
결정
- 상태 조회: k6가 실시간 메트릭을 Prometheus
remote_write로 push → ⑤ Grafana 대시보드에서 도달 TPS·활성 시나리오(scenario 라벨)·거부율을 조회. 목표 곡선은 참조선으로 표기. 종료 시handleSummary가 달성률·병목 gap report(FR-8)를results/*-gap.json+ Grafana annotation으로 남김. 구조화 로그(→ Loki)를 보조 채널로. - 제어:
make sim-up(k6-runner·reseed up) /sim-pause(러너 stop, reseed·LB 유지) /sim-down(k6gracefulStop으로 도착률 0 수렴 후 down). compose 컨테이너 lifecycle로 실현.
근거
- 앱/신규 서버 코드 0 — ⑤ 스택 재사용. FR-6 “최소 보장(조회)“에 커스텀 상태 API는 불필요(단순함 우선).
- k6 remote-write는 라이브 관측 표준 경로. “시뮬레이터 자체 이상”은
source=simulator라벨로 대상 앱 장애와 구분(Operations). - graceful ramp-to-0(User Scenario 5) = k6
gracefulStop옵션으로 진행 중 iteration 완료 후 수렴.
결과
- ⑤ 의존: Prometheus remote-write receiver 활성 + k6 대시보드 프로비저닝(⑤와 조율, ⑦는 ⑤ 파일 미수정 — 대시보드 JSON을 산출물로 전달).
- 미채택: 커스텀 상태 API 서버(BE 코드 유발).
- receiver 미활성 시 폴백: k6 로컬 summary + 경량 output(임시).