mirror of
https://github.com/hoshikawa2/agent_platform_oci.git
synced 2026-09-07 18:23:46 +00:00
Testes de Carga: /deploy/oke/load-test
This commit is contained in:
131
deploy/oke/load-test/scripts/smoke_test.sh
Normal file
131
deploy/oke/load-test/scripts/smoke_test.sh
Normal file
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/env bash
|
||||
set -Eeuo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)"
|
||||
ENV="$ROOT/deploy/oke/load-test/.env.runtime"
|
||||
[[ -f "$ENV" ]] || { echo "ERROR: $ENV not found" >&2; exit 1; }
|
||||
source "$ENV"
|
||||
|
||||
NS="${K8S_NAMESPACE:-agent-load-test}"
|
||||
MODE="${1:-external}"
|
||||
|
||||
resolve_external_url() {
|
||||
if [[ -n "${LOADTEST_EXTERNAL_URL:-}" ]]; then
|
||||
printf '%s\n' "${LOADTEST_EXTERNAL_URL%/}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
: "${EXISTING_LB_OCID:?Set EXISTING_LB_OCID or LOADTEST_EXTERNAL_URL in .env.runtime}"
|
||||
|
||||
command -v oci >/dev/null 2>&1 || {
|
||||
echo "ERROR: oci CLI not found and LOADTEST_EXTERNAL_URL is not set" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
local oci_args=()
|
||||
[[ -n "${OCI_CLI_PROFILE:-}" ]] && oci_args+=(--profile "$OCI_CLI_PROFILE")
|
||||
|
||||
local ip
|
||||
ip="$(
|
||||
oci lb load-balancer get \
|
||||
--load-balancer-id "$EXISTING_LB_OCID" \
|
||||
"${oci_args[@]}" \
|
||||
--query 'data."ip-addresses"[0]."ip-address"' \
|
||||
--raw-output
|
||||
)"
|
||||
|
||||
[[ -n "$ip" && "$ip" != "null" ]] || {
|
||||
echo "ERROR: could not resolve IP from existing LB $EXISTING_LB_OCID" >&2
|
||||
return 1
|
||||
}
|
||||
|
||||
local proto="${BACKEND_LISTENER_PROTOCOL:-HTTP}"
|
||||
local scheme
|
||||
scheme="$(printf '%s' "$proto" | tr '[:upper:]' '[:lower:]')"
|
||||
[[ "$scheme" == "http" || "$scheme" == "https" ]] || scheme="http"
|
||||
|
||||
local port="${BACKEND_LISTENER_PORT:-8000}"
|
||||
printf '%s://%s:%s\n' "$scheme" "$ip" "$port"
|
||||
}
|
||||
|
||||
if [[ "$MODE" == "external" ]]; then
|
||||
URL="$(resolve_external_url)"
|
||||
elif [[ "$MODE" == "internal" ]]; then
|
||||
# Execute curl inside the cluster because *.svc.cluster.local is not resolvable
|
||||
# from the developer workstation.
|
||||
URL="http://agent-template-backend.${NS}.svc.cluster.local:8000"
|
||||
else
|
||||
echo "Usage: $0 [external|internal]" >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
SID="smoke-$(date +%s)"
|
||||
PAYLOAD="{\"channel\":\"web\",\"agent_id\":\"${LOADTEST_AGENT_ID:-telecom_contas}\",\"tenant_id\":\"loadtest\",\"payload\":{\"text\":\"Olá. Responda apenas OK.\",\"session_id\":\"$SID\",\"user_id\":\"smoke\",\"customer_id\":\"smoke\",\"message_id\":\"smoke-1\"}}"
|
||||
|
||||
|
||||
verify_langfuse_trace() {
|
||||
[[ "${ENABLE_LANGFUSE:-true}" == "true" ]] || return 0
|
||||
local checkpod="langfuse-trace-check-$(date +%s)"
|
||||
local needle="$SID"
|
||||
echo "Verifying trace ingestion in Langfuse for session $needle ..."
|
||||
kubectl -n "$NS" delete pod "$checkpod" --ignore-not-found >/dev/null 2>&1 || true
|
||||
kubectl -n "$NS" run "$checkpod" --restart=Never --image=docker.io/curlimages/curl:latest \
|
||||
--overrides="$(cat <<JSON
|
||||
{"spec":{"containers":[{"name":"$checkpod","image":"docker.io/curlimages/curl:latest","env":[
|
||||
{"name":"LANGFUSE_HOST","valueFrom":{"secretKeyRef":{"name":"langfuse-client","key":"LANGFUSE_HOST"}}},
|
||||
{"name":"LANGFUSE_PUBLIC_KEY","valueFrom":{"secretKeyRef":{"name":"langfuse-client","key":"LANGFUSE_PUBLIC_KEY"}}},
|
||||
{"name":"LANGFUSE_SECRET_KEY","valueFrom":{"secretKeyRef":{"name":"langfuse-client","key":"LANGFUSE_SECRET_KEY"}}}
|
||||
],"command":["sh","-c"],"args":["set -eu; i=0; while [ \$i -lt 12 ]; do body=\$(curl -fsS -u \"\$LANGFUSE_PUBLIC_KEY:\$LANGFUSE_SECRET_KEY\" \"\$LANGFUSE_HOST/api/public/traces?limit=100\" || true); echo \"\$body\" | grep -F '$needle' >/dev/null && { echo LANGFUSE_TRACE_OK; exit 0; }; i=\$((i+1)); sleep 5; done; echo LANGFUSE_TRACE_NOT_FOUND >&2; exit 1"]}]}}
|
||||
JSON
|
||||
)" >/dev/null
|
||||
if ! kubectl -n "$NS" wait --for=jsonpath='{.status.phase}'=Succeeded "pod/$checkpod" --timeout=90s >/dev/null 2>&1; then
|
||||
kubectl -n "$NS" logs "$checkpod" || true
|
||||
kubectl -n "$NS" delete pod "$checkpod" --ignore-not-found >/dev/null 2>&1 || true
|
||||
return 1
|
||||
fi
|
||||
kubectl -n "$NS" logs "$checkpod"
|
||||
kubectl -n "$NS" delete pod "$checkpod" --ignore-not-found >/dev/null
|
||||
}
|
||||
|
||||
echo "Smoke target: $URL ($MODE)"
|
||||
|
||||
if [[ "$MODE" == "external" ]]; then
|
||||
echo "Health:"
|
||||
curl -fsS --connect-timeout 10 --max-time 30 "$URL/health"
|
||||
echo
|
||||
echo "Gateway message:"
|
||||
curl -fsS --connect-timeout 10 --max-time 120 \
|
||||
-X POST "$URL/gateway/message" \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H "X-Request-ID: smoke-$SID" \
|
||||
-d "$PAYLOAD"
|
||||
echo
|
||||
else
|
||||
pod="backend-smoke-$(date +%s)"
|
||||
kubectl -n "$NS" run "$pod" \
|
||||
--restart=Never \
|
||||
--image=docker.io/curlimages/curl:latest \
|
||||
--command -- sh -c \
|
||||
"set -e;
|
||||
echo 'Health:';
|
||||
curl -fsS --connect-timeout 10 --max-time 30 '$URL/health';
|
||||
echo;
|
||||
echo 'Gateway message:';
|
||||
curl -fsS --connect-timeout 10 --max-time 120 -X POST '$URL/gateway/message' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'X-Request-ID: smoke-$SID' \
|
||||
-d '$PAYLOAD';
|
||||
echo" >/dev/null
|
||||
|
||||
if ! kubectl -n "$NS" wait --for=jsonpath='{.status.phase}'=Succeeded "pod/$pod" --timeout=180s >/dev/null 2>&1; then
|
||||
kubectl -n "$NS" logs "$pod" || true
|
||||
kubectl -n "$NS" describe pod "$pod" || true
|
||||
kubectl -n "$NS" delete pod "$pod" --ignore-not-found >/dev/null 2>&1 || true
|
||||
exit 1
|
||||
fi
|
||||
|
||||
kubectl -n "$NS" logs "$pod"
|
||||
kubectl -n "$NS" delete pod "$pod" --ignore-not-found >/dev/null
|
||||
fi
|
||||
|
||||
verify_langfuse_trace
|
||||
Reference in New Issue
Block a user