mirror of
https://github.com/langgenius/dify.git
synced 2026-08-30 12:35:37 +08:00
24 lines
760 B
Python
24 lines
760 B
Python
"""Utilities for propagating OpenTelemetry context across execution boundaries."""
|
|
|
|
import contextvars
|
|
import functools
|
|
from collections.abc import Callable
|
|
|
|
from opentelemetry import context as otel_context
|
|
|
|
|
|
def propagate_context[**P, R](func: Callable[P, R]) -> Callable[P, R]:
|
|
"""Capture the current context and attach it whenever ``func`` executes."""
|
|
captured_context = otel_context.get_current()
|
|
captured_contextvars = contextvars.copy_context()
|
|
|
|
@functools.wraps(func)
|
|
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
|
|
token = otel_context.attach(captured_context)
|
|
try:
|
|
return captured_contextvars.run(func, *args, **kwargs)
|
|
finally:
|
|
otel_context.detach(token)
|
|
|
|
return wrapper
|