Files
daena/tests/test_metrics.py
T

51 lines
1.6 KiB
Python
Raw Permalink Normal View History

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