[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-rate stages[{target,duration}] 확장기. buildStages(peakRate, curve, {timeScale}), b2cReadStages/b2cWriteStages/b2bStages(timeScale), spikeStages()(0→20000, 30초 내). 배율표는 TDD 계약표(심야 0.05 ~ 점심·저녁 1.0)를 그대로 인코딩. TIME_SCALE env로 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이다.
  • b2cReadStagesb2cWriteStages 피크 합이 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”로 분류된다.