
    h                        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	 	 ddl
mZ ddlmZ dZ G d de      Z G d d      Zy# e$ r8  ej                   d	ed
        G d d      Z G d d      Z G d d      ZdZY Rw xY w)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 Zy)r   zMock otlp span exporter class.c                     t        d      zMock init method.r   ImportErrorselfargskwargss      c/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/langsmith/integrations/otel/processor.py__init__zOTLPSpanExporter.__init__       .     N__name__
__module____qualname____doc__r    r   r   r   r      s
    ,	r   r   c                       e Zd ZdZd Zy)r   z Mock batch span processor class.c                     t        d      r   r   r   s      r   r   zBatchSpanProcessor.__init__&   r   r   Nr   r   r   r   r   r   #   s
    .	r   r   c                        e Zd ZdZed        Zy)tracezMock trace class.c                      t        d      )z Mock get tracer provider method.r   r   r   r   r   get_tracer_providerztrace.get_tracer_provider1   s     . r   N)r   r   r   r   staticmethodr#   r   r   r   r!   r!   .   s    		 
	r   r!   Fc                   `     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Z x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.
    urlapi_keyprojectheadersc                    t        j                  d      }|j                  d      s|dz  }|xs t        |d      }|xs t        j                  d      }|xs t        j
                         }|xs i }|st        d      |sd}t        j                  d       d|i|}|r||d<   || _	        t        	| ,  d
||d	| y)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__s
            r   r   zOtelExporter.__init__F   s    $ ''-  %OH='(,<=7X11$7:X88:-R: 
 GLL% 


 4;01O(4DOOr   )NNNN)	r   r   r   r   r   strdictr   __classcell__)r:   s   @r   r&   r&   =   se     "!%!%,03Pc]3P #3P #	3P
 $sCx.)3P 3Pr   r&   c                       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Zdd	Z	d
 Z
d ZddZed        Zed        Zy)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                     d}|r|j                  d       d}t        ||||      | _        t        st	        d      |t
        } || j                        | _        y)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*   r@   exporter_urls          r   r   zOtelSpanProcessor.__init__   sj    * !jjo.o>L%gw

 .   .M'7r   c                 <    | j                   j                  ||       y)z1Forward span start events to the inner processor.N)rE   on_start)r   spanparent_contexts      r   rH   zOtelSpanProcessor.on_start   s      ~6r   c                 :    | j                   j                  |       y)z/Forward span end events to the inner processor.N)rE   on_end)r   rI   s     r   rL   zOtelSpanProcessor.on_end   s    t$r   c                 8    | j                   j                          y)zShutdown processor.N)rE   shutdownr   s    r   rN   zOtelSpanProcessor.shutdown   s      "r   c                 8    | j                   j                  |      S )z Force flush the inner processor.)rE   force_flush)r   timeout_milliss     r   rQ   zOtelSpanProcessor.force_flush   s    **>::r   c                     | j                   S )zThe underlying OtelExporter.)rC   rO   s    r   exporterzOtelSpanProcessor.exporter   s     ~~r   c                     | j                   S )zThe underlying span processor.)rE   rO   s    r   	processorzOtelSpanProcessor.processor   s     r   )NNNNN)N)i0u  )r   r   r   r   r   r;   r<   typer   rH   rL   rN   rQ   propertyrT   rV   r   r   r   r?   r?   |   s    < "&!%!,0(,(8#(8 #(8 c]	(8
 $sCx.)(8  ~(8T7%#;    r   r?   )r   r5   warningstypingr   urllib.parser   	langsmithr   r/   5opentelemetry.exporter.otlp.proto.http.trace_exporterr   opentelemetry.sdk.trace.exportr   rD   r   warnUserWarningr!   r&   r?   r   r   r   <module>ra      s    >      '0VAN^<P# <P~_ _[  +HMM	& 		 		 	
 
 NW+s   A :A?>A?