ci: publish lesavka gate metrics with stable status labels

This commit is contained in:
Brad Stein 2026-04-10 16:38:41 -03:00
parent de122b86e8
commit 5cd4ec05dd
2 changed files with 57 additions and 4 deletions

2
Jenkinsfile vendored
View File

@ -8,7 +8,7 @@ pipeline {
parameters { parameters {
booleanParam(name: 'PUSH_IMAGES', defaultValue: true, description: 'Push images to registry') booleanParam(name: 'PUSH_IMAGES', defaultValue: true, description: 'Push images to registry')
string(name: 'QUALITY_GATE_PUSHGATEWAY_URL', defaultValue: '', description: 'Optional Pushgateway base URL for quality gate metrics') string(name: 'QUALITY_GATE_PUSHGATEWAY_URL', defaultValue: 'http://platform-quality-gateway.monitoring.svc.cluster.local:9091', description: 'Pushgateway base URL for quality gate metrics')
string(name: 'REGISTRY_CREDENTIALS_ID', defaultValue: 'registry-bstein-dev', description: 'Jenkins credentials id for registry.bstein.dev') string(name: 'REGISTRY_CREDENTIALS_ID', defaultValue: 'registry-bstein-dev', description: 'Jenkins credentials id for registry.bstein.dev')
} }

View File

@ -14,9 +14,61 @@ mkdir -p "${REPORT_DIR}"
cat >"${METRICS_FILE}" <<'METRICS' cat >"${METRICS_FILE}" <<'METRICS'
# HELP platform_quality_gate_runs_total Number of quality gate runs by result. # HELP platform_quality_gate_runs_total Number of quality gate runs by result.
# TYPE platform_quality_gate_runs_total counter # TYPE platform_quality_gate_runs_total counter
platform_quality_gate_runs_total{suite="lesavka",status="fail"} 1 platform_quality_gate_runs_total{suite="lesavka",status="ok"} 0
platform_quality_gate_runs_total{suite="lesavka",status="failed"} 1
METRICS METRICS
fetch_remote_counter() {
local status="$1"
if [[ -z "${PUSHGATEWAY_URL}" ]]; then
echo 0
return 0
fi
curl --silent --show-error --fail "${PUSHGATEWAY_URL%/}/metrics" 2>/dev/null | awk -v suite="lesavka" -v status="${status}" '
/^platform_quality_gate_runs_total\{/ {
if (index($0, "job=\"platform-quality-ci\"") == 0) next
if (index($0, "suite=\"" suite "\"") == 0) next
if (index($0, "status=\"" status "\"") == 0) next
print int($2)
found = 1
exit
}
END {
if (!found) print 0
}'
}
refresh_counter_metrics() {
local outcome status_line ok_count failed_count tmp_file
status_line="$(awk '/^platform_quality_gate_runs_total\{suite="lesavka"/ {print; exit}' "${METRICS_FILE}" 2>/dev/null || true)"
outcome="$(printf '%s' "${status_line}" | sed -n 's/.*status="\([^"]*\)".*/\1/p')"
[[ -n "${outcome}" ]] || outcome="failed"
ok_count="$(fetch_remote_counter ok)"
failed_count="$(fetch_remote_counter failed)"
if [[ "${outcome}" == "ok" ]]; then
ok_count=$((ok_count + 1))
else
failed_count=$((failed_count + 1))
fi
tmp_file="$(mktemp "${REPORT_DIR}/metrics.prom.XXXXXX")"
{
echo '# HELP platform_quality_gate_runs_total Number of quality gate runs by result.'
echo '# TYPE platform_quality_gate_runs_total counter'
echo "platform_quality_gate_runs_total{suite=\"lesavka\",status=\"ok\"} ${ok_count}"
echo "platform_quality_gate_runs_total{suite=\"lesavka\",status=\"failed\"} ${failed_count}"
awk '
/^# HELP platform_quality_gate_runs_total / {next}
/^# TYPE platform_quality_gate_runs_total / {next}
/^platform_quality_gate_runs_total\{suite="lesavka"/ {next}
{print}
' "${METRICS_FILE}"
} >"${tmp_file}"
mv "${tmp_file}" "${METRICS_FILE}"
}
publish_metrics() { publish_metrics() {
if [[ -z "${PUSHGATEWAY_URL}" ]]; then if [[ -z "${PUSHGATEWAY_URL}" ]]; then
echo "Skipping Pushgateway publish: QUALITY_GATE_PUSHGATEWAY_URL is not set" echo "Skipping Pushgateway publish: QUALITY_GATE_PUSHGATEWAY_URL is not set"
@ -25,7 +77,7 @@ publish_metrics() {
curl --fail --silent --show-error \ curl --fail --silent --show-error \
--data-binary @"${METRICS_FILE}" \ --data-binary @"${METRICS_FILE}" \
"${PUSHGATEWAY_URL%/}/metrics/job/platform_quality_gate/suite/lesavka" "${PUSHGATEWAY_URL%/}/metrics/job/platform-quality-ci/suite/lesavka"
} }
status=0 status=0
@ -94,7 +146,7 @@ over_500 = sum(1 for item in files if item['loc'] > 500)
metrics = [] metrics = []
metrics.append('# HELP platform_quality_gate_runs_total Number of quality gate runs by result.') metrics.append('# HELP platform_quality_gate_runs_total Number of quality gate runs by result.')
metrics.append('# TYPE platform_quality_gate_runs_total counter') metrics.append('# TYPE platform_quality_gate_runs_total counter')
status_label = 'pass' if not regressions and not missing_from_baseline else 'fail' status_label = 'ok' if not regressions and not missing_from_baseline else 'failed'
metrics.append(f'platform_quality_gate_runs_total{{suite="lesavka",status="{status_label}"}} 1') metrics.append(f'platform_quality_gate_runs_total{{suite="lesavka",status="{status_label}"}} 1')
metrics.append('# HELP platform_quality_gate_workspace_line_coverage_percent Workspace line coverage percent.') metrics.append('# HELP platform_quality_gate_workspace_line_coverage_percent Workspace line coverage percent.')
metrics.append('# TYPE platform_quality_gate_workspace_line_coverage_percent gauge') metrics.append('# TYPE platform_quality_gate_workspace_line_coverage_percent gauge')
@ -178,6 +230,7 @@ else
fi fi
publish_status=0 publish_status=0
refresh_counter_metrics
if publish_metrics; then if publish_metrics; then
: :
else else