mirror of
https://github.com/OpenStaticFish/MicroServices.git
synced 2026-10-12 22:25:14 +00:00
97 lines
2.4 KiB
Bash
Executable File
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"
|