o
    ]+ i                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZ	 zddl
mZ ddlmZ dZW n( eyT   ejd	ed
d G dd dZG dd dZG dd dZdZY nw G dd deZG dd dZdS )z8OpenTelemetry span processor and exporter for LangSmith.    N)Optional)urljoin)utils)OTLPSpanExporter)BatchSpanProcessorTwOpenTelemetry packages are not installed. Install optional OpenTelemetry dependencies with: pip install langsmith[otel]   )
stacklevelc                   @      e Zd ZdZdd ZdS )r   zMock otlp span exporter class.c                 O      t dzMock init method.r   ImportErrorselfargskwargs r   q/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/langsmith/integrations/otel/processor.py__init__      zOTLPSpanExporter.__init__N__name__
__module____qualname____doc__r   r   r   r   r   r          r   c                   @   r
   )r   z Mock batch span processor class.c                 O   r   r   r   r   r   r   r   r   &   r   zBatchSpanProcessor.__init__Nr   r   r   r   r   r   #   r   r   c                   @   s   e Zd ZdZedd ZdS )tracezMock trace class.c                   C   r   )z Mock get tracer provider method.r   r   r   r   r   r   get_tracer_provider1   s   ztrace.get_tracer_providerN)r   r   r   r   staticmethodr   r   r   r   r   r   .   s    r   Fc                       sT   e Zd ZdZ				d	dee dee dee deeeef  f fddZ  ZS )
OtelExportera  A subclass of OTLPSpanExporter configured for LangSmith.

    Environment Variables:
    - LANGSMITH_API_KEY: Your LangSmith API key.
    - LANGSMITH_ENDPOINT: Base URL for LangSmith API (defaults to https://api.smith.langchain.com).
    - LANGSMITH_PROJECT: Project identifier.
    Nurlapi_keyprojectheadersc           	         s   t d}|ds|d7 }|pt|d}|pt d}|p!t  }|p%i }|s,td|s5d}td d|i|}|rA||d< || _	t
 jd
||d	| dS )a  Initialize the OtelExporter.

        Args:
            url: OTLP endpoint URL. Defaults to {LANGSMITH_ENDPOINT}/otel/v1/traces.
            api_key: LangSmith API key. Defaults to LANGSMITH_API_KEY env var.
            parent: Parent identifier (e.g., "project_name:test").
                Defaults to LANGSMITH_PARENT env var.
            headers: Additional headers to include in requests.
            **kwargs: Additional arguments passed to OTLPSpanExporter.
        N/zotel/v1/tracesz`API key is required. Provide it via api_key parameter or LANGSMITH_API_KEY environment variable.defaultzpNo project specified, using default. Configure with LANGSMITH_PROJECT environment variable or project parameter.z	x-api-keyzLangsmith-Project)endpointr$   r   )ls_utilsZget_api_urlendswithr   Zget_api_keyZget_tracer_project
ValueErrorlogginginfor#   superr   )	r   r!   r"   r#   r$   r   base_urlr'   Zexporter_headers	__class__r   r   r   F   s0   

zOtelExporter.__init__)NNNN)	r   r   r   r   r   strdictr   __classcell__r   r   r/   r   r    =   s    
r    c                   @   s   e Zd ZdZ					ddee dee dee deeeef  dee f
dd	Zdd
dZ	dd Z
dd ZdddZedd Zedd ZdS )OtelSpanProcessora  A span processor for adding LangSmith to OpenTelemetry setups.

    This class combines the OtelExporter and BatchSpanProcessor
    into a single processor that can be added to any TracerProvider.

    Use this when:
    1. You already have OpenTelemetry initialized with other tools
    2. You want to add LangSmith alongside existing OTEL exporters

    Examples:
        # Fresh OpenTelemetry setup (LangSmith only):
        from langsmith.integrations.otel import configure
        configure(api_key="your-key", project="your-project")

        # Add LangSmith to existing OpenTelemetry setup:
        from opentelemetry import trace
        from langsmith.integrations.otel.processor import OtelSpanProcessor

        # Get your existing TracerProvider (already set by other tools)
        provider = trace.get_tracer_provider()

        # Add LangSmith processor alongside existing processors
        langsmith_processor = OtelSpanProcessor(
            project="your-project",
        )
        provider.add_span_processor(langsmith_processor)
    Nr"   r#   r!   r$   SpanProcessorc                 C   sR   d}|r| d d}t||||d| _tstd|du r!t}|| j| _dS )a
  Initialize the OtelSpanProcessor.

        Args:
            api_key: LangSmith API key. Defaults to LANGSMITH_API_KEY env var.
            project: Project identifier. Defaults to LANGSMITH_PROJECT env var.
            url: Base URL for LangSmith API. Defaults to LANGSMITH_ENDPOINT env var
                or https://api.smith.langchain.com.
            headers: Additional headers to include in requests.
            SpanProcessor: Optional span processor class.
                Defaults to BatchSpanProcessor.
        Nr%   z/otel/v1/traces)r!   r"   r#   r$   r   )rstripr    	_exporterOTEL_AVAILABLEr   r   
_processor)r   r"   r#   r!   r$   r5   Zexporter_urlr   r   r   r      s   zOtelSpanProcessor.__init__c                 C   s   | j || dS )z1Forward span start events to the inner processor.N)r9   on_start)r   spanZparent_contextr   r   r   r:      s   zOtelSpanProcessor.on_startc                 C   s   | j | dS )z/Forward span end events to the inner processor.N)r9   on_end)r   r;   r   r   r   r<      s   zOtelSpanProcessor.on_endc                 C   s   | j   dS )zShutdown processor.N)r9   shutdownr   r   r   r   r=      s   zOtelSpanProcessor.shutdown0u  c                 C   s   | j |S )z Force flush the inner processor.)r9   force_flush)r   Ztimeout_millisr   r   r   r@      s   zOtelSpanProcessor.force_flushc                 C      | j S )zThe underlying OtelExporter.)r7   r>   r   r   r   exporter      zOtelSpanProcessor.exporterc                 C   rA   )zThe underlying span processor.)r9   r>   r   r   r   	processor   rC   zOtelSpanProcessor.processor)NNNNN)N)r?   )r   r   r   r   r   r1   r2   typer   r:   r<   r=   r@   propertyrB   rD   r   r   r   r   r4   |   s4    

*

r4   )r   r+   warningstypingr   urllib.parser   Z	langsmithr   r(   Z5opentelemetry.exporter.otlp.proto.http.trace_exporterr   Zopentelemetry.sdk.trace.exportr   r8   r   warnUserWarningr   r    r4   r   r   r   r   <module>   s.    .?