from __future__ import annotations import httpx from ...redaction import redact from ...timeutil import payload_with_display_times from .base import DeliveryResult from .http import classify_response class AlertmanagerNotifier: name = "alertmanager" def __init__(self, client: httpx.AsyncClient, url: str, time_zone: str) -> None: self._client = client self._url = url.rstrip("/") self._time_zone = time_zone async def deliver(self, event_type: str, payload: dict) -> DeliveryResult: display_payload = payload_with_display_times(payload, self._time_zone) labels = { "alertname": "monlet_incident", "agent_id": str(payload.get("agent_id", "")), "check_id": str(payload.get("check_id", "")), "incident_key": str(payload.get("incident_key", "")), } annotations = { "severity": str(payload.get("severity", "unknown")), "status": str(payload.get("status", "")), "summary": redact(payload.get("summary") or "") or "", "time_zone": display_payload["time_zone"], } for key in ("observed_at_display", "opened_at_display", "resolved_at_display"): if display_payload.get(key): annotations[key.removesuffix("_display")] = display_payload[key] if payload.get("output"): annotations["output"] = (redact(payload["output"]) or "")[:1024] alert = { "labels": labels, "annotations": annotations, "startsAt": payload.get("opened_at") or payload.get("observed_at"), } if event_type == "resolved" and payload.get("resolved_at"): alert["endsAt"] = payload["resolved_at"] try: resp = await self._client.post(f"{self._url}/api/v2/alerts", json=[alert]) except httpx.HTTPError as exc: return DeliveryResult(ok=False, permanent=False, error=type(exc).__name__) ok, perm = classify_response(resp.status_code) if ok: return DeliveryResult(ok=True) return DeliveryResult(ok=False, permanent=perm, error=f"http_{resp.status_code}")