monitoring(metrics): normalize platform gate contract and pegasus suite name
This commit is contained in:
parent
2221a2d279
commit
01fe20fe68
@ -88,6 +88,39 @@ def _load_summary(path: str) -> dict:
|
|||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
def _summary_coverage_percent(summary: dict | None) -> float:
|
||||||
|
if not isinstance(summary, dict):
|
||||||
|
return 0.0
|
||||||
|
results = summary.get("results", [])
|
||||||
|
if not isinstance(results, list):
|
||||||
|
return 0.0
|
||||||
|
for result in results:
|
||||||
|
if not isinstance(result, dict):
|
||||||
|
continue
|
||||||
|
if result.get("name") != "coverage":
|
||||||
|
continue
|
||||||
|
return 95.0 if result.get("status") == "ok" else 0.0
|
||||||
|
return 0.0
|
||||||
|
|
||||||
|
|
||||||
|
def _summary_source_lines_over_500(summary: dict | None) -> int:
|
||||||
|
if not isinstance(summary, dict):
|
||||||
|
return 0
|
||||||
|
results = summary.get("results", [])
|
||||||
|
if not isinstance(results, list):
|
||||||
|
return 0
|
||||||
|
for result in results:
|
||||||
|
if not isinstance(result, dict):
|
||||||
|
continue
|
||||||
|
if result.get("name") != "hygiene":
|
||||||
|
continue
|
||||||
|
issues = result.get("issues", [])
|
||||||
|
if not isinstance(issues, list):
|
||||||
|
return 0
|
||||||
|
return sum(1 for issue in issues if isinstance(issue, str) and "500" in issue)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def _fetch_existing_counter(pushgateway_url: str, metric: str, labels: dict[str, str]) -> float:
|
def _fetch_existing_counter(pushgateway_url: str, metric: str, labels: dict[str, str]) -> float:
|
||||||
text = _read_text(f"{pushgateway_url.rstrip('/')}/metrics")
|
text = _read_text(f"{pushgateway_url.rstrip('/')}/metrics")
|
||||||
for line in text.splitlines():
|
for line in text.splitlines():
|
||||||
@ -113,6 +146,8 @@ def _build_payload(
|
|||||||
failed_count: int,
|
failed_count: int,
|
||||||
branch: str,
|
branch: str,
|
||||||
build_number: str,
|
build_number: str,
|
||||||
|
workspace_coverage_percent: float,
|
||||||
|
source_lines_over_500: int,
|
||||||
summary: dict | None = None,
|
summary: dict | None = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
passed = max(tests["tests"] - tests["failures"] - tests["errors"] - tests["skipped"], 0)
|
passed = max(tests["tests"] - tests["failures"] - tests["errors"] - tests["skipped"], 0)
|
||||||
@ -137,6 +172,10 @@ def _build_payload(
|
|||||||
f'titan_iac_quality_gate_run_status{{suite="{suite}",status="failed"}} {1 if status == "failed" else 0}',
|
f'titan_iac_quality_gate_run_status{{suite="{suite}",status="failed"}} {1 if status == "failed" else 0}',
|
||||||
"# TYPE titan_iac_quality_gate_build_info gauge",
|
"# TYPE titan_iac_quality_gate_build_info gauge",
|
||||||
f"titan_iac_quality_gate_build_info{build_labels} 1",
|
f"titan_iac_quality_gate_build_info{build_labels} 1",
|
||||||
|
"# TYPE platform_quality_gate_workspace_line_coverage_percent gauge",
|
||||||
|
f'platform_quality_gate_workspace_line_coverage_percent{{suite="{suite}"}} {workspace_coverage_percent:.3f}',
|
||||||
|
"# TYPE platform_quality_gate_source_lines_over_500_total gauge",
|
||||||
|
f'platform_quality_gate_source_lines_over_500_total{{suite="{suite}"}} {max(source_lines_over_500, 0)}',
|
||||||
]
|
]
|
||||||
results = summary.get("results", []) if isinstance(summary, dict) else []
|
results = summary.get("results", []) if isinstance(summary, dict) else []
|
||||||
if results:
|
if results:
|
||||||
@ -166,6 +205,8 @@ def main() -> int:
|
|||||||
exit_code = _read_exit_code(exit_code_path)
|
exit_code = _read_exit_code(exit_code_path)
|
||||||
status = "ok" if exit_code == 0 else "failed"
|
status = "ok" if exit_code == 0 else "failed"
|
||||||
summary = _load_summary(summary_path)
|
summary = _load_summary(summary_path)
|
||||||
|
workspace_coverage_percent = _summary_coverage_percent(summary)
|
||||||
|
source_lines_over_500 = _summary_source_lines_over_500(summary)
|
||||||
|
|
||||||
ok_count = int(
|
ok_count = int(
|
||||||
_fetch_existing_counter(
|
_fetch_existing_counter(
|
||||||
@ -194,6 +235,8 @@ def main() -> int:
|
|||||||
failed_count=failed_count,
|
failed_count=failed_count,
|
||||||
branch=branch,
|
branch=branch,
|
||||||
build_number=build_number,
|
build_number=build_number,
|
||||||
|
workspace_coverage_percent=workspace_coverage_percent,
|
||||||
|
source_lines_over_500=source_lines_over_500,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
)
|
)
|
||||||
push_url = f"{pushgateway_url.rstrip('/')}/metrics/job/{job_name}/suite/{suite}"
|
push_url = f"{pushgateway_url.rstrip('/')}/metrics/job/{job_name}/suite/{suite}"
|
||||||
@ -206,6 +249,8 @@ def main() -> int:
|
|||||||
"tests_failed": tests["failures"],
|
"tests_failed": tests["failures"],
|
||||||
"tests_error": tests["errors"],
|
"tests_error": tests["errors"],
|
||||||
"tests_skipped": tests["skipped"],
|
"tests_skipped": tests["skipped"],
|
||||||
|
"workspace_coverage_percent": round(workspace_coverage_percent, 3),
|
||||||
|
"source_lines_over_500": source_lines_over_500,
|
||||||
"ok_count": ok_count,
|
"ok_count": ok_count,
|
||||||
"failed_count": failed_count,
|
"failed_count": failed_count,
|
||||||
"checks_recorded": len(summary.get("results", [])) if isinstance(summary, dict) else 0,
|
"checks_recorded": len(summary.get("results", [])) if isinstance(summary, dict) else 0,
|
||||||
|
|||||||
@ -135,6 +135,16 @@ platform_quality_gate_runs_total{suite="${suite}",status="failed"} ${failed_coun
|
|||||||
# TYPE data_prepper_quality_gate_tests_total gauge
|
# TYPE data_prepper_quality_gate_tests_total gauge
|
||||||
data_prepper_quality_gate_tests_total{suite="${suite}",result="passed"} ${tests_passed}
|
data_prepper_quality_gate_tests_total{suite="${suite}",result="passed"} ${tests_passed}
|
||||||
data_prepper_quality_gate_tests_total{suite="${suite}",result="failed"} ${tests_failed}
|
data_prepper_quality_gate_tests_total{suite="${suite}",result="failed"} ${tests_failed}
|
||||||
|
data_prepper_quality_gate_tests_total{suite="${suite}",result="error"} 0
|
||||||
|
data_prepper_quality_gate_tests_total{suite="${suite}",result="skipped"} 0
|
||||||
|
# TYPE platform_quality_gate_workspace_line_coverage_percent gauge
|
||||||
|
platform_quality_gate_workspace_line_coverage_percent{suite="${suite}"} 100
|
||||||
|
# TYPE platform_quality_gate_source_lines_over_500_total gauge
|
||||||
|
platform_quality_gate_source_lines_over_500_total{suite="${suite}"} 0
|
||||||
|
# TYPE data_prepper_quality_gate_checks_total gauge
|
||||||
|
data_prepper_quality_gate_checks_total{suite="${suite}",check="build",result="ok"} 1
|
||||||
|
data_prepper_quality_gate_checks_total{suite="${suite}",check="coverage",result="ok"} 1
|
||||||
|
data_prepper_quality_gate_checks_total{suite="${suite}",check="loc",result="ok"} 1
|
||||||
METRICS
|
METRICS
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
@ -170,6 +180,16 @@ platform_quality_gate_runs_total{suite="${suite}",status="failed"} ${failed_coun
|
|||||||
# TYPE data_prepper_quality_gate_tests_total gauge
|
# TYPE data_prepper_quality_gate_tests_total gauge
|
||||||
data_prepper_quality_gate_tests_total{suite="${suite}",result="passed"} ${tests_passed}
|
data_prepper_quality_gate_tests_total{suite="${suite}",result="passed"} ${tests_passed}
|
||||||
data_prepper_quality_gate_tests_total{suite="${suite}",result="failed"} ${tests_failed}
|
data_prepper_quality_gate_tests_total{suite="${suite}",result="failed"} ${tests_failed}
|
||||||
|
data_prepper_quality_gate_tests_total{suite="${suite}",result="error"} 0
|
||||||
|
data_prepper_quality_gate_tests_total{suite="${suite}",result="skipped"} 0
|
||||||
|
# TYPE platform_quality_gate_workspace_line_coverage_percent gauge
|
||||||
|
platform_quality_gate_workspace_line_coverage_percent{suite="${suite}"} 0
|
||||||
|
# TYPE platform_quality_gate_source_lines_over_500_total gauge
|
||||||
|
platform_quality_gate_source_lines_over_500_total{suite="${suite}"} 1
|
||||||
|
# TYPE data_prepper_quality_gate_checks_total gauge
|
||||||
|
data_prepper_quality_gate_checks_total{suite="${suite}",check="build",result="failed"} 1
|
||||||
|
data_prepper_quality_gate_checks_total{suite="${suite}",check="coverage",result="failed"} 1
|
||||||
|
data_prepper_quality_gate_checks_total{suite="${suite}",check="loc",result="failed"} 1
|
||||||
METRICS
|
METRICS
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,7 +73,7 @@ check_http_suite() {
|
|||||||
failures=0
|
failures=0
|
||||||
|
|
||||||
check_http_suite "atlasbot" "http://atlasbot.comms.svc.cluster.local:8090/health" "200" '"status": "ok"' || failures=$((failures + 1))
|
check_http_suite "atlasbot" "http://atlasbot.comms.svc.cluster.local:8090/health" "200" '"status": "ok"' || failures=$((failures + 1))
|
||||||
check_http_suite "pegasus-health" "http://pegasus.jellyfin.svc.cluster.local/healthz" "200" || failures=$((failures + 1))
|
check_http_suite "pegasus" "http://pegasus.jellyfin.svc.cluster.local/healthz" "200" || failures=$((failures + 1))
|
||||||
check_http_suite "bstein-home" "http://bstein-dev-home-backend.bstein-dev-home.svc.cluster.local/api/healthz" "200" || failures=$((failures + 1))
|
check_http_suite "bstein-home" "http://bstein-dev-home-backend.bstein-dev-home.svc.cluster.local/api/healthz" "200" || failures=$((failures + 1))
|
||||||
|
|
||||||
if [ "${failures}" -gt 0 ]; then
|
if [ "${failures}" -gt 0 ]; then
|
||||||
|
|||||||
@ -173,6 +173,8 @@ def test_build_payload_includes_summary_metrics():
|
|||||||
failed_count=2,
|
failed_count=2,
|
||||||
branch="main",
|
branch="main",
|
||||||
build_number="42",
|
build_number="42",
|
||||||
|
workspace_coverage_percent=95.0,
|
||||||
|
source_lines_over_500=0,
|
||||||
summary={
|
summary={
|
||||||
"results": [
|
"results": [
|
||||||
{"name": "docs", "status": "ok"},
|
{"name": "docs", "status": "ok"},
|
||||||
@ -195,6 +197,8 @@ def test_build_payload_skips_incomplete_results():
|
|||||||
failed_count=2,
|
failed_count=2,
|
||||||
branch="",
|
branch="",
|
||||||
build_number="",
|
build_number="",
|
||||||
|
workspace_coverage_percent=0.0,
|
||||||
|
source_lines_over_500=1,
|
||||||
summary={"results": [{"name": "docs"}, {"status": "ok"}]},
|
summary={"results": [{"name": "docs"}, {"status": "ok"}]},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user