[INFRA-01] k6 공통 라이브러리 — 일주기 곡선·유저 풀·격차 리포트
작업 내용 (설계 의도)
변경 사항
근거 TDD: ../TDD.md “인터페이스·계약”, ADR-001. 모든 상시 스크립트(INFRA-04~07)가 import하는 공통 계약을 한 티켓으로 확립한다(연관 병목 → 단일 선행). 기존 lib/auth.js·lib/metrics.js는 무변경 재사용, 신규 3개 모듈만 추가.
lib/diurnal.js— 시간대별 목표 TPS 배율표(JSON) →ramping-arrival-ratestages[{target,duration}]확장기.buildStages(peakRate, curve, {timeScale}),b2cReadStages/b2cWriteStages/b2bStages(timeScale),spikeStages()(0→20000, 30초 내). 배율표는 TDD 계약표(심야 0.05 ~ 점심·저녁 1.0)를 그대로 인코딩.TIME_SCALEenv로 24h↔압축.lib/pool.js— FR-9.syntheticUserId(vu)(X-User-Id, 900000+ 범위),partnerAuthHeaders()(env 주입Bearer partner_<keyId>_<random>전 VU 공유), 토큰 재발급 없이 재사용.lib/gapreport.js— FR-8.handleSummary(data,{targetPeak,scenarioId})→ 달성률(%)=도달 rate/targetPeak, 병목 추정(dropped_iterations>0|vus==maxVUs→“client(k6)”, 5xx율·p95↑→“server”),results/<scenarioId>-gap.json+ stdout.
의존
- 없음 (wave 1 기반)
다이어그램
클래스 의존
flowchart LR Curve["배율표 JSON"] --> Diurnal["lib/diurnal.js"] Env["env(TIME_SCALE·PARTNER_KEY)"] --> Pool["lib/pool.js"] Diurnal --> Script["상시 스크립트(04~07)"] Pool --> Script Summary["k6 summary data"] --> Gap["lib/gapreport.js"] Gap --> Report["results/*-gap.json"]
테스트 케이스
- 배율표를
buildStages에 넣으면 점심·저녁 시각 stage의 target이 peak과 같고 심야 stage는 약 0.05×peak이다. b2cReadStages와b2cWriteStages피크 합이 B2C 목표(3000)의 70:30 비율(2100:900)이다.timeScale=0.2면 전체 stage duration 합이 실시간의 1/5로 비례 축소되고 곡선 형상(피크 위치 순서)은 보존된다.spikeStages는 첫 stage에서 30초 이내 target 20000에 도달하는 급경사를 만든다.- mock summary(dropped_iterations>0)를
handleSummary에 주면 병목이 “client(k6)“로 분류된다. - mock summary(5xx율 높음·dropped 0)면 병목이 “server”로 분류된다.