audit.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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) -> None:
  11. context = get_gateway_request_context(request)
  12. context.target_service = target_service
  13. context.target_url = target_url
  14. def persist_gateway_audit(
  15. *,
  16. request: Request,
  17. session_factory: sessionmaker,
  18. status_code: int | None,
  19. error_message: str | None = None) -> None:
  20. context = get_gateway_request_context(request)
  21. duration_ms = int((perf_counter() - context.started_perf_counter) * 1000)
  22. client_host = request.client.host if request.client is not None else None
  23. query_string = request.url.query or None
  24. user_agent = request.headers.get("user-agent")
  25. db = session_factory()
  26. try:
  27. GatewayRequestAuditRepository(db).create(
  28. request_id=context.request_id,
  29. method=request.method,
  30. path=request.url.path,
  31. query_string=query_string,
  32. target_service=context.target_service,
  33. target_url=context.target_url,
  34. status_code=status_code,
  35. duration_ms=duration_ms,
  36. client_host=client_host,
  37. user_agent=user_agent,
  38. error_message=error_message)
  39. finally:
  40. db.close()