96 lines
2.8 KiB
Bash
Executable File
96 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# generate-traffic.sh — Sends a mix of orders to the Quarkus demo app
|
|
# to produce metrics, traces, and logs for the troubleshooting session.
|
|
#
|
|
# Usage: bash scripts/generate-traffic.sh [BASE_URL] [ITERATIONS]
|
|
#
|
|
# Prerequisites: curl, jq (optional for pretty output)
|
|
|
|
set -euo pipefail
|
|
|
|
BASE_URL="${1:-http://localhost:8080}"
|
|
ITERATIONS="${2:-100}"
|
|
|
|
PRODUCTS=("laptop" "keyboard" "mouse" "monitor" "headset" "webcam")
|
|
CUSTOMERS=("cust-001" "cust-002" "cust-003" "cust-004" "cust-005")
|
|
|
|
PRICES_laptop=999.99
|
|
PRICES_keyboard=79.99
|
|
PRICES_mouse=49.99
|
|
PRICES_monitor=349.99
|
|
PRICES_headset=129.99
|
|
PRICES_webcam=89.99
|
|
|
|
echo "========================================="
|
|
echo " OTel Demo Traffic Generator"
|
|
echo " Target: ${BASE_URL}"
|
|
echo " Iterations: ${ITERATIONS}"
|
|
echo "========================================="
|
|
echo ""
|
|
|
|
success=0
|
|
errors=0
|
|
|
|
for i in $(seq 1 "$ITERATIONS"); do
|
|
# Pick a random product and customer
|
|
product=${PRODUCTS[$((RANDOM % ${#PRODUCTS[@]}))]}
|
|
customer=${CUSTOMERS[$((RANDOM % ${#CUSTOMERS[@]}))]}
|
|
|
|
# Vary quantity — occasionally large orders to trigger "complex" processing
|
|
if (( RANDOM % 5 == 0 )); then
|
|
quantity=$((RANDOM % 20 + 6)) # 6-25 items (complex)
|
|
else
|
|
quantity=$((RANDOM % 5 + 1)) # 1-5 items (simple)
|
|
fi
|
|
|
|
# Look up price
|
|
price_var="PRICES_${product}"
|
|
unit_price="${!price_var}"
|
|
|
|
# Send the order
|
|
status=$(curl -s -o /dev/null -w "%{http_code}" \
|
|
-X POST "${BASE_URL}/api/orders" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{
|
|
\"customerId\": \"${customer}\",
|
|
\"product\": \"${product}\",
|
|
\"quantity\": ${quantity},
|
|
\"unitPrice\": ${unit_price}
|
|
}" 2>/dev/null || echo "000")
|
|
|
|
if [[ "$status" =~ ^2 ]]; then
|
|
((success++))
|
|
echo "[${i}/${ITERATIONS}] ✓ ${status} — ${product} x${quantity} for ${customer}"
|
|
else
|
|
((errors++))
|
|
echo "[${i}/${ITERATIONS}] ✗ ${status} — ${product} x${quantity} for ${customer}"
|
|
fi
|
|
|
|
# Small delay to spread the load
|
|
sleep "0.$((RANDOM % 5 + 1))"
|
|
done
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo " Results"
|
|
echo " Successful: ${success}"
|
|
echo " Errors: ${errors}"
|
|
echo " Total: ${ITERATIONS}"
|
|
echo "========================================="
|
|
echo ""
|
|
|
|
# Also hit the list and inventory endpoints
|
|
echo "Fetching order list..."
|
|
curl -s "${BASE_URL}/api/orders" | head -c 500
|
|
echo ""
|
|
|
|
echo "Fetching inventory levels..."
|
|
curl -s "${BASE_URL}/api/inventory"
|
|
echo ""
|
|
|
|
echo ""
|
|
echo "Done! Open Grafana at http://localhost:3000 to explore:"
|
|
echo " → Explore → Prometheus: rate(orders_total[5m])"
|
|
echo " → Explore → Tempo: { resource.service.name = \"otel-quarkus-demo\" }"
|
|
echo " → Explore → Loki: {service_name=\"otel-quarkus-demo\"}"
|