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(k6 gracefulStop으로 도착률 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(임시).