import uuid from datetime import datetime, timezone from src.api.schemas.anatel_schemas import TicketRequestEvent from src.core.config import settings from src.core.logging import ( set_conversation_start_ts, set_request_id, set_requesting_agent, set_session_id, set_source_channel, set_trace_id, set_user_id, ) def set_ticket_log_context(event: TicketRequestEvent, transaction_id: str = None) -> None: """ Populates logging contextvars from a TicketRequestEvent. Centralised so both the FastAPI dependency and the OCI streaming worker call the same logic. Covers correlation IDs (request/session/ trace/user) plus the conversation-context fields required by the OCI Logging policy (source_channel, conversation_start_time_ts, requesting_agent). """ transaction_id = transaction_id or event.transactionId origin = event.origin submitted_by = origin.submittedBy if origin else None set_request_id(str(uuid.uuid4())) set_session_id(transaction_id) set_trace_id(transaction_id) set_user_id(submitted_by.userId if submitted_by else "") set_requesting_agent(settings.AGENT_TYPE) if origin and origin.sourceSystem: set_source_channel(origin.sourceSystem) set_conversation_start_ts(datetime.now(timezone.utc).isoformat(timespec="milliseconds").replace("+00:00", "Z")) def inject_log_context(event: TicketRequestEvent) -> TicketRequestEvent: """FastAPI dependency: calls set_ticket_log_context before entering the route handler.""" set_ticket_log_context(event) return event def set_emulator_log_context(transaction_id: str, user_id: str = "cms") -> None: """Populates logging contextvars for emulator REST endpoints.""" set_request_id(str(uuid.uuid4())) set_session_id(transaction_id) set_trace_id(transaction_id) set_user_id(user_id) set_requesting_agent(settings.AGENT_TYPE) set_source_channel("cms") set_conversation_start_ts( datetime.now(timezone.utc).isoformat(timespec="milliseconds").replace("+00:00", "Z") )