From 5571df1a544346d7496c1e09dae6c560bcc2b6f5 Mon Sep 17 00:00:00 2001 From: Christophe Vila Date: Fri, 29 May 2026 16:22:05 +0200 Subject: [PATCH] add test script --- generate-traffic.sh | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 generate-traffic.sh diff --git a/generate-traffic.sh b/generate-traffic.sh new file mode 100755 index 0000000..ac2d0b8 --- /dev/null +++ b/generate-traffic.sh @@ -0,0 +1,95 @@ +#!/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\"}"