o
    +iC                     @   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   b/var/www/html/psymed-ai/venv/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_utilsget_api_urlendswithr   get_api_keyget_tracer_project
ValueErrorlogginginfor#   superr   )	r   r!   r"   r#   r$   r   base_urlr'   exporter_headers	__class__r   r   r   G   s0   

zOtelExporter.__init__)NNNN)	r   r   r   r   r   strdictr   __classcell__r   r   r3   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$   r9   exporter_urlr   r   r   r      s   zOtelSpanProcessor.__init__c                 C   s   | j || dS )z1Forward span start events to the inner processor.N)r=   on_start)r   span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)r=   on_end)r   r@   r   r   r   rB      s   zOtelSpanProcessor.on_endc                 C   s   | j   dS )zShutdown processor.N)r=   shutdownr   r   r   r   rC      s   zOtelSpanProcessor.shutdown0u  c                 C   s   | j |S )z Force flush the inner processor.)r=   force_flush)r   timeout_millisr   r   r   rF      s   zOtelSpanProcessor.force_flushc                 C      | j S )zThe underlying OtelExporter.)r;   rD   r   r   r   exporter      zOtelSpanProcessor.exporterc                 C   rH   )zThe underlying span processor.)r=   rD   r   r   r   	processor   rJ   zOtelSpanProcessor.processor)NNNNN)N)rE   )r   r   r   r   r   r5   r6   typer   r?   rB   rC   rF   propertyrI   rK   r   r   r   r   r8   ~   s4    

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