Files
Lotty/infrastructure/k6/run-decide.sh
T
2026-02-24 20:35:01 +03:00

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"