114 lines
2.9 KiB
Bash
Executable File
114 lines
2.9 KiB
Bash
Executable File
#!/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" <<EOF
|
|
RUN_ID=$RUN_ID
|
|
K6_IMAGE=$K6_IMAGE
|
|
K6_BASE_URL=$K6_BASE_URL
|
|
FLAG_KEY=$FLAG_KEY
|
|
SUBJECT_COUNTRY=$SUBJECT_COUNTRY
|
|
START_RPS=$START_RPS
|
|
RAMP_UP_RPS=$RAMP_UP_RPS
|
|
HOLD_RPS=$HOLD_RPS
|
|
PRE_ALLOCATED_VUS=$PRE_ALLOCATED_VUS
|
|
MAX_VUS=$MAX_VUS
|
|
RAMP_UP_DURATION=$RAMP_UP_DURATION
|
|
HOLD_DURATION=$HOLD_DURATION
|
|
RAMP_DOWN_DURATION=$RAMP_DOWN_DURATION
|
|
THRESHOLD_ERROR_RATE=$THRESHOLD_ERROR_RATE
|
|
THRESHOLD_P95_MS=$THRESHOLD_P95_MS
|
|
THRESHOLD_P99_MS=$THRESHOLD_P99_MS
|
|
EOF
|
|
|
|
docker run --rm -i \
|
|
--add-host host.docker.internal:host-gateway \
|
|
-v "$ROOT_DIR/infrastructure/k6:/k6:ro" \
|
|
-v "$RESULTS_DIR:/results" \
|
|
-e BASE_URL="$K6_BASE_URL" \
|
|
-e FLAG_KEY="$FLAG_KEY" \
|
|
-e SUBJECT_COUNTRY="$SUBJECT_COUNTRY" \
|
|
-e START_RPS="$START_RPS" \
|
|
-e RAMP_UP_RPS="$RAMP_UP_RPS" \
|
|
-e HOLD_RPS="$HOLD_RPS" \
|
|
-e PRE_ALLOCATED_VUS="$PRE_ALLOCATED_VUS" \
|
|
-e MAX_VUS="$MAX_VUS" \
|
|
-e RAMP_UP_DURATION="$RAMP_UP_DURATION" \
|
|
-e HOLD_DURATION="$HOLD_DURATION" \
|
|
-e RAMP_DOWN_DURATION="$RAMP_DOWN_DURATION" \
|
|
-e THRESHOLD_ERROR_RATE="$THRESHOLD_ERROR_RATE" \
|
|
-e THRESHOLD_P95_MS="$THRESHOLD_P95_MS" \
|
|
-e THRESHOLD_P99_MS="$THRESHOLD_P99_MS" \
|
|
"$K6_IMAGE" run \
|
|
--summary-export /results/summary.json \
|
|
/k6/decide.js
|
|
|
|
echo "results: $RESULTS_DIR"
|