diff --git a/langfuse/_client/client.py b/langfuse/_client/client.py index 3ec864204..755184619 100644 --- a/langfuse/_client/client.py +++ b/langfuse/_client/client.py @@ -106,6 +106,7 @@ class Langfuse: mask (Optional[MaskFunction]): Function to mask sensitive data in traces before sending to the API. blocked_instrumentation_scopes (Optional[List[str]]): List of instrumentation scope names to block from being exported to Langfuse. Spans from these scopes will be filtered out before being sent to the API. Useful for filtering out spans from specific libraries or frameworks. For exported spans, you can see the instrumentation scope name in the span metadata in Langfuse (`metadata.scope.name`) additional_headers (Optional[Dict[str, str]]): Additional headers to include in all API requests and OTLPSpanExporter requests. These headers will be merged with default headers. Note: If httpx_client is provided, additional_headers must be set directly on your custom httpx_client as well. + tracer_provider(Optional[TracerProvider]): OpenTelemetry TracerProvider to use for Langfuse. This can be useful to set to have disconnected tracing between Langfuse and other OpenTelemetry-span emitting libraries. Note: To track active spans, the context is still shared between TracerProviders. This may lead to broken trace trees. Example: ```python @@ -165,6 +166,7 @@ def __init__( mask: Optional[MaskFunction] = None, blocked_instrumentation_scopes: Optional[List[str]] = None, additional_headers: Optional[Dict[str, str]] = None, + tracer_provider: Optional[otel_trace_api.TracerProvider] = None, ): self._host = host or os.environ.get(LANGFUSE_HOST, "https://cloud.langfuse.com") self._environment = environment or os.environ.get(LANGFUSE_TRACING_ENVIRONMENT) @@ -228,6 +230,7 @@ def __init__( tracing_enabled=self._tracing_enabled, blocked_instrumentation_scopes=blocked_instrumentation_scopes, additional_headers=additional_headers, + tracer_provider=tracer_provider, ) self._mask = self._resources.mask diff --git a/langfuse/_client/resource_manager.py b/langfuse/_client/resource_manager.py index 041d2ec05..162c76e62 100644 --- a/langfuse/_client/resource_manager.py +++ b/langfuse/_client/resource_manager.py @@ -95,6 +95,7 @@ def __new__( tracing_enabled: Optional[bool] = None, blocked_instrumentation_scopes: Optional[List[str]] = None, additional_headers: Optional[Dict[str, str]] = None, + tracer_provider: Optional[TracerProvider] = None, ) -> "LangfuseResourceManager": if public_key in cls._instances: return cls._instances[public_key] @@ -121,6 +122,7 @@ def __new__( else True, blocked_instrumentation_scopes=blocked_instrumentation_scopes, additional_headers=additional_headers, + tracer_provider=tracer_provider, ) cls._instances[public_key] = instance @@ -145,6 +147,7 @@ def _initialize_instance( tracing_enabled: bool = True, blocked_instrumentation_scopes: Optional[List[str]] = None, additional_headers: Optional[Dict[str, str]] = None, + tracer_provider: Optional[TracerProvider] = None, ): self.public_key = public_key self.secret_key = secret_key @@ -154,7 +157,7 @@ def _initialize_instance( # OTEL Tracer if tracing_enabled: - tracer_provider = _init_tracer_provider( + tracer_provider = tracer_provider or _init_tracer_provider( environment=environment, release=release, sample_rate=sample_rate ) @@ -170,7 +173,6 @@ def _initialize_instance( ) tracer_provider.add_span_processor(langfuse_processor) - tracer_provider = cast(TracerProvider, otel_trace_api.get_tracer_provider()) self._otel_tracer = tracer_provider.get_tracer( LANGFUSE_TRACER_NAME, langfuse_version,