feat: add pipeline observability and stats
This commit is contained in:
@@ -38,6 +38,35 @@ class FakePublisher:
|
||||
)
|
||||
|
||||
|
||||
class FakeWorkerStatsClient:
|
||||
async def get_stats(
|
||||
self,
|
||||
) -> dict[str, Any]:
|
||||
return {
|
||||
"pipeline": {
|
||||
"total_processed": 10,
|
||||
"total_dlq": 2,
|
||||
"in_flight_buffer": 3,
|
||||
"last_flush_at":
|
||||
"2026-09-20T12:00:00Z",
|
||||
},
|
||||
"breakdown": {
|
||||
"by_service_type": {
|
||||
"4G_DATA": 10,
|
||||
},
|
||||
"by_radio_access_type": {
|
||||
"LTE_4G": 10,
|
||||
},
|
||||
"dlq_by_reason": {
|
||||
"invalid_rat_value": 2,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
async def close(self) -> None:
|
||||
pass
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def publisher() -> FakePublisher:
|
||||
return FakePublisher()
|
||||
@@ -49,6 +78,7 @@ def client(
|
||||
):
|
||||
app = create_app(
|
||||
publisher=publisher,
|
||||
worker_stats_client=FakeWorkerStatsClient(),
|
||||
)
|
||||
|
||||
with TestClient(app) as test_client:
|
||||
@@ -226,3 +256,74 @@ def test_kafka_failure_returns_503(
|
||||
assert response.status_code == 503
|
||||
|
||||
assert response.json()["error"] == "kafka_unavailable"
|
||||
|
||||
|
||||
def test_metrics_endpoint(
|
||||
client: TestClient,
|
||||
) -> None:
|
||||
response = client.get(
|
||||
"/metrics"
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
|
||||
assert (
|
||||
"cdr_api_received_total"
|
||||
in response.text
|
||||
)
|
||||
|
||||
|
||||
def test_stats_endpoint(
|
||||
client: TestClient,
|
||||
) -> None:
|
||||
response = client.get(
|
||||
"/stats"
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
|
||||
body = response.json()
|
||||
|
||||
assert (
|
||||
body["pipeline"]["total_processed"]
|
||||
== 10
|
||||
)
|
||||
|
||||
assert (
|
||||
body["pipeline"]["total_dlq"]
|
||||
== 2
|
||||
)
|
||||
|
||||
assert (
|
||||
body["pipeline"]["in_flight_buffer"]
|
||||
== 3
|
||||
)
|
||||
|
||||
assert (
|
||||
body["breakdown"]
|
||||
["by_service_type"]
|
||||
["4G_DATA"]
|
||||
== 10
|
||||
)
|
||||
|
||||
|
||||
def test_successful_request_increments_api_metric(
|
||||
client: TestClient,
|
||||
) -> None:
|
||||
response = client.post(
|
||||
"/api/v1/cdr/raw",
|
||||
json=valid_payload(),
|
||||
)
|
||||
|
||||
assert response.status_code == 202
|
||||
|
||||
metrics = client.get(
|
||||
"/metrics"
|
||||
)
|
||||
|
||||
assert (
|
||||
'cdr_api_received_total 1.0'
|
||||
in metrics.text
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user