Files
awoooi/apps/api/tests/test_alertmanager_webhook_metrics.py
Your Name d30436573b
Some checks failed
CD Pipeline / workflow-shape (push) Successful in 0s
CD Pipeline / cancel-stale-cd (push) Has been skipped
CD Pipeline / tests (push) Failing after 2m0s
CD Pipeline / build-and-deploy (push) Has been skipped
CD Pipeline / post-deploy-checks (push) Has been skipped
fix(alerts): expose alertmanager webhook request metrics
2026-07-02 20:25:33 +08:00

78 lines
2.1 KiB
Python

from __future__ import annotations
import pytest
from fastapi import BackgroundTasks, HTTPException
from prometheus_client import generate_latest
from starlette.requests import Request
from src.api.v1.webhooks import AlertmanagerPayload, alertmanager_webhook
from src.core.metrics import WEBHOOK_REQUESTS_TOTAL
def _request(
*,
client_host: str = "127.0.0.1",
headers: list[tuple[bytes, bytes]] | None = None,
) -> Request:
return Request(
{
"type": "http",
"method": "POST",
"path": "/api/v1/webhooks/alertmanager",
"scheme": "http",
"server": ("testserver", 80),
"client": (client_host, 50000),
"query_string": b"",
"headers": headers or [],
}
)
def _webhook_count(status: str) -> float:
return WEBHOOK_REQUESTS_TOTAL.labels(
source="alertmanager",
status=status,
)._value.get()
def _metrics_text() -> str:
return generate_latest().decode("utf-8")
@pytest.mark.asyncio
async def test_alertmanager_no_firing_payload_records_success_metric() -> None:
before = _webhook_count("success")
response = await alertmanager_webhook(
_request(),
AlertmanagerPayload(status="resolved", alerts=[]),
BackgroundTasks(),
)
assert response.success is True
assert response.message == "No firing alerts to process"
assert _webhook_count("success") == before + 1
assert (
'awoooi_webhook_requests_total{source="alertmanager",status="success"}'
in _metrics_text()
)
@pytest.mark.asyncio
async def test_alertmanager_external_reject_records_error_metric() -> None:
before = _webhook_count("error")
with pytest.raises(HTTPException) as exc_info:
await alertmanager_webhook(
_request(client_host="8.8.8.8"),
AlertmanagerPayload(status="resolved", alerts=[]),
BackgroundTasks(),
)
assert exc_info.value.status_code == 403
assert _webhook_count("error") == before + 1
assert (
'awoooi_webhook_requests_total{source="alertmanager",status="error"}'
in _metrics_text()
)