audit.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. from time import perf_counter
  2. from fastapi import Request
  3. from sqlalchemy.orm import sessionmaker
  4. from app.domain.repositories import GatewayRequestAuditRepository
  5. from app.infrastructure.request_context import get_gateway_request_context
  6. def mark_gateway_target(
  7. request: Request,
  8. *,
  9. target_service: str,
  10. target_url: str,
  11. ) -> None:
  12. context = get_gateway_request_context(request)
  13. context.target_service = target_service
  14. context.target_url = target_url
  15. def persist_gateway_audit(
  16. *,
  17. request: Request,
  18. session_factory: sessionmaker,
  19. status_code: int | None,
  20. error_message: str | None = None,
  21. ) -> None:
  22. context = get_gateway_request_context(request)
  23. duration_ms = int((perf_counter() - context.started_perf_counter) * 1000)
  24. client_host = request.client.host if request.client is not None else None
  25. query_string = request.url.query or None
  26. user_agent = request.headers.get("user-agent")
  27. db = session_factory()
  28. try:
  29. GatewayRequestAuditRepository(db).create(
  30. tenant_id=context.tenant_id,
  31. request_id=context.request_id,
  32. method=request.method,
  33. path=request.url.path,
  34. query_string=query_string,
  35. target_service=context.target_service,
  36. target_url=context.target_url,
  37. status_code=status_code,
  38. duration_ms=duration_ms,
  39. client_host=client_host,
  40. user_agent=user_agent,
  41. error_message=error_message,
  42. )
  43. finally:
  44. db.close()