#!/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}"