#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" RUN_ID="${RUN_ID:-$(date -u +%Y%m%d%H%M%S)}" K6_IMAGE="${K6_IMAGE:-grafana/k6:0.50.0}" K6_BASE_URL="${K6_BASE_URL:-http://host.docker.internal}" START_RPS="${START_RPS:-20}" RAMP_UP_RPS="${RAMP_UP_RPS:-100}" HOLD_RPS="${HOLD_RPS:-100}" PRE_ALLOCATED_VUS="${PRE_ALLOCATED_VUS:-100}" MAX_VUS="${MAX_VUS:-600}" RAMP_UP_DURATION="${RAMP_UP_DURATION:-30s}" HOLD_DURATION="${HOLD_DURATION:-2m}" RAMP_DOWN_DURATION="${RAMP_DOWN_DURATION:-20s}" THRESHOLD_ERROR_RATE="${THRESHOLD_ERROR_RATE:-0.01}" THRESHOLD_P95_MS="${THRESHOLD_P95_MS:-250}" THRESHOLD_P99_MS="${THRESHOLD_P99_MS:-500}" RESULTS_DIR="${RESULTS_DIR:-$ROOT_DIR/artifacts/k6/$RUN_ID}" mkdir -p "$RESULTS_DIR" prepare_fixture() { local output="" if ( cd "$ROOT_DIR" && docker compose exec -T backend true >/dev/null 2>&1 ); then if output="$( cd "$ROOT_DIR" && docker compose exec -T backend python manage.py prepare_k6_fixture \ --run-id "$RUN_ID" \ --json )"; then echo "$output" return fi fi output="$( cd "$ROOT_DIR/src/backend" uv run python manage.py prepare_k6_fixture \ --run-id "$RUN_ID" \ --json )" echo "$output" } if ! command -v jq >/dev/null 2>&1; then echo "jq is required" >&2 exit 1 fi FIXTURE_JSON="$(prepare_fixture)" echo "$FIXTURE_JSON" >"$RESULTS_DIR/fixture.json" FLAG_KEY="$(echo "$FIXTURE_JSON" | jq -r '.flag_key')" SUBJECT_COUNTRY="$( echo "$FIXTURE_JSON" | jq -r '.subject_attributes.country // "US"' )" if [[ -z "$FLAG_KEY" || "$FLAG_KEY" == "null" ]]; then echo "failed to resolve FLAG_KEY from fixture" >&2 exit 1 fi cat >"$RESULTS_DIR/run.env" <