Files
MicroServices/scripts/load-test-site-analyzer
T

97 lines
2.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
endpoint="${SITE_ANALYZER_ENDPOINT:-http://localhost:8090/analyze}"
site_url="https://example.com"
requests="100"
concurrency="10"
usage() {
cat <<'USAGE'
Usage:
scripts/load-test-site-analyzer [--endpoint URL] [--url SITE_URL] [--requests N] [--concurrency N]
Examples:
scripts/load-test-site-analyzer --url https://example.com --requests 100 --concurrency 10
scripts/load-test-site-analyzer --endpoint http://site-analyzer.example.com/analyze --url example.com --requests 1000 --concurrency 50
USAGE
}
while [ "$#" -gt 0 ]; do
case "$1" in
-h|--help)
usage
exit 0
;;
--endpoint)
endpoint="$2"
shift 2
;;
--endpoint=*)
endpoint="${1#--endpoint=}"
shift
;;
--url)
site_url="$2"
shift 2
;;
--url=*)
site_url="${1#--url=}"
shift
;;
--requests)
requests="$2"
shift 2
;;
--requests=*)
requests="${1#--requests=}"
shift
;;
--concurrency)
concurrency="$2"
shift 2
;;
--concurrency=*)
concurrency="${1#--concurrency=}"
shift
;;
*)
echo "Unknown option: $1" >&2
usage >&2
exit 1
;;
esac
done
payload=$(jq -cn --arg url "$site_url" '{url: $url}' 2>/dev/null || printf '{"url":"%s"}' "$site_url")
results_file=$(mktemp)
start_epoch=$(date +%s%N)
cleanup() {
rm -f "$results_file"
}
trap cleanup EXIT
export endpoint payload results_file
seq "$requests" | xargs -n 1 -P "$concurrency" sh -c '
result=$(curl -sS -o /dev/null -w "%{http_code} %{time_total}" -H "Content-Type: application/json" -X POST --data "$payload" "$endpoint" || printf "000 0")
printf "%s\n" "$result" >>"$results_file"
'
end_epoch=$(date +%s%N)
elapsed_ns=$((end_epoch - start_epoch))
elapsed=$(awk -v ns="$elapsed_ns" 'BEGIN { printf "%.3f", ns / 1000000000 }')
rps=$(awk -v requests="$requests" -v ns="$elapsed_ns" 'BEGIN { printf "%.2f", requests / (ns / 1000000000) }')
echo "endpoint: $endpoint"
echo "url: $site_url"
echo "requests: $requests"
echo "concurrency: $concurrency"
echo "elapsed_seconds: $elapsed"
echo "requests_per_second: $rps"
echo "status_codes:"
cut -d ' ' -f 1 "$results_file" | sort | uniq -c
echo "latency_seconds:"
awk '{ count++; sum += $2; if ($2 > max) max = $2 } END { if (count > 0) printf "avg %.3f\nmax %.3f\n", sum / count, max }' "$results_file"