lesavka/scripts/ci/performance_gate.sh

75 lines
2.5 KiB
Bash
Raw Permalink Normal View History

2026-04-30 08:16:57 -03:00
#!/usr/bin/env bash
# Run deterministic latency/performance contracts and publish gate metrics.
set -euo pipefail
ROOT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
REPORT_DIR="${ROOT_DIR}/target/performance-gate"
TEST_LOG="${REPORT_DIR}/cargo-test.log"
METRICS_FILE="${REPORT_DIR}/metrics.prom"
PUSHGATEWAY_URL=${QUALITY_GATE_PUSHGATEWAY_URL:-}
PUSHGATEWAY_JOB=${LESAVKA_PERFORMANCE_GATE_PUSHGATEWAY_JOB:-lesavka-performance-gate}
mkdir -p "${REPORT_DIR}"
cd "${ROOT_DIR}"
branch=${BRANCH_NAME:-${GIT_BRANCH:-}}
if [[ -z "${branch}" ]]; then
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown)
fi
commit=${GIT_COMMIT:-}
if [[ -z "${commit}" ]]; then
commit=$(git rev-parse --short HEAD 2>/dev/null || echo unknown)
fi
PERFORMANCE_TESTS=(
--test client_uplink_performance_contract
--test client_uplink_freshness_contract
--test client_log_noise_contract
--test video_downstream_feed_contract
--test client_app_include_contract
)
start_seconds=$(date +%s)
status=0
set +e
cargo test -p lesavka_testing "${PERFORMANCE_TESTS[@]}" --color never 2>&1 | tee "${TEST_LOG}"
status=${PIPESTATUS[0]}
set -e
duration_seconds=$(($(date +%s) - start_seconds))
python3 - "${METRICS_FILE}" "${status}" "${duration_seconds}" "${branch}" "${commit}" <<'PY'
import pathlib
import sys
metrics_path = pathlib.Path(sys.argv[1])
status = int(sys.argv[2])
duration_seconds = int(sys.argv[3])
branch = sys.argv[4]
commit = sys.argv[5]
def esc(value: str) -> str:
return value.replace('\\', r'\\').replace('\n', r'\n').replace('"', r'\"')
labels = f'suite="lesavka",branch="{esc(branch)}",commit="{esc(commit)}"'
ok = 1 if status == 0 else 0
failed = 0 if status == 0 else 1
metrics = [
'# HELP platform_quality_gate_checks_total Check outcomes from the latest lesavka gate run.',
'# TYPE platform_quality_gate_checks_total gauge',
f'platform_quality_gate_checks_total{{{labels},check="performance",status="ok"}} {ok}',
f'platform_quality_gate_checks_total{{{labels},check="performance",status="failed"}} {failed}',
'# HELP lesavka_performance_gate_duration_seconds Runtime of the deterministic performance gate.',
'# TYPE lesavka_performance_gate_duration_seconds gauge',
f'lesavka_performance_gate_duration_seconds{{{labels}}} {duration_seconds}',
]
metrics_path.write_text('\n'.join(metrics) + '\n', encoding='utf-8')
PY
if [[ -n "${PUSHGATEWAY_URL}" ]]; then
curl --fail --silent --show-error \
--data-binary @"${METRICS_FILE}" \
"${PUSHGATEWAY_URL%/}/metrics/job/${PUSHGATEWAY_JOB}/suite/lesavka" || status=$?
fi
exit "${status}"