fix(alerts): expose alertmanager webhook request metrics
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
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
This commit is contained in:
77
apps/api/tests/test_alertmanager_webhook_metrics.py
Normal file
77
apps/api/tests/test_alertmanager_webhook_metrics.py
Normal file
@@ -0,0 +1,77 @@
|
||||
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()
|
||||
)
|
||||
Reference in New Issue
Block a user