from contextlib import contextmanager from contextvars import ContextVar from typing import Any, ClassVar, Generator class RunContext: RUN_CONTEXT_VAR: ClassVar[ContextVar] = ContextVar("RUN_CONTEXT_VAR") @classmethod @contextmanager def populate_context(cls, run_id) -> Generator[None, Any, None]: token = RunContext.RUN_CONTEXT_VAR.set(run_id) try: yield finally: RunContext.RUN_CONTEXT_VAR.reset(token) @classmethod def current_run_id(cls) -> str: try: return cls.RUN_CONTEXT_VAR.get() except LookupError as e: raise RuntimeError("Error getting run id") from e