from __future__ import annotations import asyncio import pytest from daena.api.metrics import MetricsServer, MetricsSnapshot, render_prometheus def test_render_prometheus_includes_sink_state() -> None: text = render_prometheus( MetricsSnapshot( running=True, stored_records=3, oldest_inflight_seconds=12, deliveries={("central", "pending"): 2, ("central", "delivered"): 1}, sink_results={"central": {"delivered": 4, "failed": 1, "dead": 0}}, ) ) assert "daena_up 1" in text assert "daena_records 3" in text assert "daena_oldest_inflight_seconds 12" in text assert 'daena_delivery_records{sink="central",state="pending"} 2' in text assert 'daena_sink_deliveries_total{sink="central",result="failed"} 1' in text @pytest.mark.asyncio async def test_metrics_server_serves_text() -> None: snapshot = MetricsSnapshot( running=True, stored_records=0, oldest_inflight_seconds=0, deliveries={}, sink_results={}, ) server = MetricsServer("127.0.0.1", 0, lambda: snapshot, lambda: {"status": "ok"}) await server.start() assert server._server is not None sockets = server._server.sockets assert sockets is not None port = sockets[0].getsockname()[1] reader, writer = await asyncio.open_connection("127.0.0.1", port) writer.write(b"GET /metrics HTTP/1.1\r\nHost: localhost\r\n\r\n") await writer.drain() data = await reader.read() writer.close() await writer.wait_closed() await server.stop() assert b"200 OK" in data assert b"daena_up 1" in data