51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
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
|