class documentation

class ReplaySafeLoggerProvider(LoggerProvider): (source)

Constructor: ReplaySafeLoggerProvider(logger_provider)

View In Hierarchy

A logger provider that is safe for use during workflow replay.

Warning

This class is experimental and may change in future versions. Use with caution in production environments. It wraps the OpenTelemetry Python logs bridge API, which upstream still ships under the private opentelemetry._logs namespace (stabilization is tracked in opentelemetry-python#3361); if that surface moves when upstream stabilizes it, this class will follow it in a minor release.

This logger provider wraps an OpenTelemetry LoggerProvider and drops log records emitted (Logger.emit()) from workflow code while the workflow is replaying history events. Without this, libraries that emit OpenTelemetry log records from workflow code (e.g. google-adk's gen_ai.* events) re-emit every record on each replay, duplicating telemetry.

Emissions are therefore first-execution-only: a workflow task retry re-executes live and can emit again. Queries and update validators are live, at-most-once-per-request operations even when they execute while the workflow is replaying, so their emissions are kept. Emissions outside workflows are unaffected.

Install this as the process-global logger provider before any library (e.g. google-adk) obtains loggers:

opentelemetry._logs.set_logger_provider(
    ReplaySafeLoggerProvider(my_logger_provider)
)

OpenTelemetry proxy loggers late-bind, so calling set_logger_provider after such libraries are imported still routes their loggers through this wrapper. However, set_logger_provider only takes effect once per process, so this wrapper must be the one and only global logger provider ever set.

Method __getattr__ Delegate all other attributes (e.g. shutdown, force_flush) to the underlying logger provider.
Method __init__ Initialize the replay-safe logger provider.
Method get_logger Get a replay-safe logger from the underlying provider.
Instance Variable _logger_provider Undocumented
def __getattr__(self, name: str) -> Any: (source)

Delegate all other attributes (e.g. shutdown, force_flush) to the underlying logger provider.

def __init__(self, logger_provider: LoggerProvider): (source)

Initialize the replay-safe logger provider.

Parameters
logger_provider:LoggerProviderThe underlying OpenTelemetry LoggerProvider to wrap.
def get_logger(self, name: str, version: str | None = None, schema_url: str | None = None, attributes: _ExtendedAttributes | None = None) -> Logger: (source)

Get a replay-safe logger from the underlying provider.

Parameters
name:strThe name of the instrumenting module.
version:str | NoneThe version string of the instrumenting library.
schema_url:str | NoneThe schema URL for the logger.
attributes:_ExtendedAttributes | NoneInstrumentation scope attributes for the logger.
Returns
LoggerA replay-safe logger instance.
_logger_provider = (source)

Undocumented