feat(awooop): add source provider freshness heartbeat
This commit is contained in:
@@ -6,7 +6,6 @@ import time
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
SCRIPT_PATH = Path(__file__).resolve().parents[3] / "scripts" / "alert_chain_smoke_test.py"
|
||||
SPEC = importlib.util.spec_from_file_location("alert_chain_smoke_test", SCRIPT_PATH)
|
||||
alert_chain_smoke_test = importlib.util.module_from_spec(SPEC)
|
||||
@@ -79,6 +78,61 @@ class AlertChainSmokeMetricTest(unittest.TestCase):
|
||||
self.assertFalse(result.passed)
|
||||
self.assertTrue(result.critical)
|
||||
|
||||
def test_source_provider_heartbeat_requires_operator_key(self):
|
||||
result = alert_chain_smoke_test.send_source_provider_heartbeat(
|
||||
"https://awoooi.example",
|
||||
providers=["sentry", "signoz"],
|
||||
operator_key=None,
|
||||
operator_id="gitea-e2e-health",
|
||||
)
|
||||
|
||||
self.assertFalse(result.passed)
|
||||
self.assertTrue(result.critical)
|
||||
self.assertIn("AWOOOP_OPERATOR_API_KEY", result.message)
|
||||
|
||||
def test_source_provider_heartbeat_posts_expected_payload(self):
|
||||
calls = []
|
||||
|
||||
def fake_post(url, payload, *, headers=None, timeout=None):
|
||||
calls.append(
|
||||
{
|
||||
"url": url,
|
||||
"payload": payload,
|
||||
"headers": headers,
|
||||
"timeout": timeout,
|
||||
}
|
||||
)
|
||||
return alert_chain_smoke_test.HttpGetResult(
|
||||
200,
|
||||
(
|
||||
'{"status":"recorded","items":['
|
||||
'{"provider":"sentry"},{"provider":"signoz"}]}'
|
||||
),
|
||||
)
|
||||
|
||||
original_post = alert_chain_smoke_test.http_post_json
|
||||
try:
|
||||
alert_chain_smoke_test.http_post_json = fake_post
|
||||
result = alert_chain_smoke_test.send_source_provider_heartbeat(
|
||||
"https://awoooi.example",
|
||||
providers=["sentry", "signoz"],
|
||||
operator_key="secret",
|
||||
operator_id="gitea-e2e-health",
|
||||
run_ref="run-123",
|
||||
)
|
||||
finally:
|
||||
alert_chain_smoke_test.http_post_json = original_post
|
||||
|
||||
self.assertTrue(result.passed)
|
||||
self.assertEqual(
|
||||
calls[0]["url"],
|
||||
"https://awoooi.example/api/v1/platform/events/dossier/provider-heartbeat",
|
||||
)
|
||||
self.assertEqual(calls[0]["payload"]["providers"], ["sentry", "signoz"])
|
||||
self.assertEqual(calls[0]["payload"]["run_ref"], "run-123")
|
||||
self.assertEqual(calls[0]["headers"]["X-AwoooP-Operator-Id"], "gitea-e2e-health")
|
||||
self.assertEqual(calls[0]["headers"]["X-AwoooP-Operator-Key"], "secret")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -274,6 +274,32 @@ def test_sentry_and_signoz_source_refs_keep_raw_event_ids() -> None:
|
||||
assert signoz_envelope["source_refs"]["signoz_alerts"] == ["HighLatency", "fp-456"]
|
||||
|
||||
|
||||
def test_source_provider_heartbeat_refs_do_not_claim_real_provider_alerts() -> None:
|
||||
sentry_envelope = build_inbound_source_envelope(
|
||||
provider="sentry",
|
||||
stage="heartbeat",
|
||||
provider_event_id="sentry:heartbeat:heartbeat-1",
|
||||
raw_event_id="heartbeat-1",
|
||||
raw_content="Sentry heartbeat",
|
||||
alertname="SourceProviderHeartbeat",
|
||||
fingerprint="source-provider-heartbeat:sentry",
|
||||
)
|
||||
signoz_envelope = build_inbound_source_envelope(
|
||||
provider="signoz",
|
||||
stage="heartbeat",
|
||||
provider_event_id="signoz:heartbeat:heartbeat-1",
|
||||
raw_event_id="heartbeat-1",
|
||||
raw_content="SignOz heartbeat",
|
||||
alertname="SourceProviderHeartbeat",
|
||||
fingerprint="source-provider-heartbeat:signoz",
|
||||
)
|
||||
|
||||
assert sentry_envelope["source_refs"]["event_ids"] == ["heartbeat-1"]
|
||||
assert sentry_envelope["source_refs"]["sentry_issue_ids"] == []
|
||||
assert signoz_envelope["source_refs"]["event_ids"] == ["heartbeat-1"]
|
||||
assert signoz_envelope["source_refs"]["signoz_alerts"] == []
|
||||
|
||||
|
||||
async def test_record_outbound_message_sets_sent_at_for_sent_messages() -> None:
|
||||
session = _FakeSession()
|
||||
run_id = build_grouped_alert_run_id("awoooi", "telegram-message-13152")
|
||||
|
||||
51
apps/api/tests/test_platform_events_provider_heartbeat.py
Normal file
51
apps/api/tests/test_platform_events_provider_heartbeat.py
Normal file
@@ -0,0 +1,51 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from uuid import uuid4
|
||||
|
||||
import pytest
|
||||
|
||||
from src.api.v1.platform import events
|
||||
from src.core.awooop_operator_auth import AwoooPOperatorPrincipal
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_create_source_provider_heartbeat_records_low_noise_events(monkeypatch):
|
||||
captured: list[dict] = []
|
||||
|
||||
async def fake_record_external_alert_event(**kwargs):
|
||||
captured.append(kwargs)
|
||||
return uuid4()
|
||||
|
||||
monkeypatch.setattr(events, "record_external_alert_event", fake_record_external_alert_event)
|
||||
|
||||
response = await events.create_source_provider_heartbeat(
|
||||
events.SourceProviderHeartbeatRequest(
|
||||
providers=["sentry", "signoz"],
|
||||
reason="test_provider_freshness",
|
||||
run_ref="run-123",
|
||||
),
|
||||
AwoooPOperatorPrincipal(
|
||||
operator_id="gitea-e2e-health",
|
||||
auth_method="operator_api_key",
|
||||
),
|
||||
)
|
||||
|
||||
assert response["status"] == "recorded"
|
||||
assert [item["provider"] for item in response["items"]] == ["sentry", "signoz"]
|
||||
assert [item["event_id"] for item in response["items"]] == [
|
||||
captured[0]["event_id"],
|
||||
captured[1]["event_id"],
|
||||
]
|
||||
|
||||
for call in captured:
|
||||
assert call["stage"] == "heartbeat"
|
||||
assert call["severity"] == "info"
|
||||
assert call["title"] == "SourceProviderHeartbeat"
|
||||
assert call["target_resource"] == "source-provider-ingestion"
|
||||
assert call["labels"]["telegram"] == "not_sent"
|
||||
assert call["labels"]["incident"] == "not_created"
|
||||
assert call["payload"]["side_effects"] == {
|
||||
"incident_created": False,
|
||||
"telegram_sent": False,
|
||||
"approval_created": False,
|
||||
}
|
||||
Reference in New Issue
Block a user