test_observability.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import asyncio
  2. import httpx
  3. from core_shared.observability import add_observability
  4. from fastapi import FastAPI
  5. def test_observability_records_http_metrics() -> None:
  6. asyncio.run(_run_observability_smoke())
  7. async def _run_observability_smoke() -> None:
  8. app = FastAPI()
  9. add_observability(app, "test-service")
  10. @app.get("/health")
  11. async def health() -> dict[str, str]:
  12. return {"status": "ok"}
  13. transport = httpx.ASGITransport(app=app)
  14. async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
  15. health_response = await client.get("/health")
  16. metrics_response = await client.get("/metrics")
  17. assert health_response.status_code == 200
  18. assert metrics_response.status_code == 200
  19. assert health_response.headers["x-trace-id"]
  20. assert health_response.headers["x-span-id"]
  21. assert 'agent_platform_service_info{service="test-service"} 1' in metrics_response.text
  22. assert "agent_platform_http_requests_total" in metrics_response.text
  23. assert 'method="GET"' in metrics_response.text
  24. assert 'path="/health"' in metrics_response.text
  25. assert 'status_code="200"' in metrics_response.text
  26. def test_observability_preserves_incoming_trace_id() -> None:
  27. asyncio.run(_run_trace_propagation_smoke())
  28. async def _run_trace_propagation_smoke() -> None:
  29. app = FastAPI()
  30. add_observability(app, "test-service")
  31. @app.get("/health")
  32. async def health() -> dict[str, str]:
  33. return {"status": "ok"}
  34. transport = httpx.ASGITransport(app=app)
  35. async with httpx.AsyncClient(transport=transport, base_url="http://testserver") as client:
  36. response = await client.get("/health", headers={"x-trace-id": "trace-123"})
  37. assert response.status_code == 200
  38. assert response.headers["x-trace-id"] == "trace-123"
  39. assert response.headers["x-span-id"]