
    h                        d dl Z d dlmZ d dlmZ d dlmZmZmZmZm	Z	m
Z
m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mZmZmZ erOd 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 dl'm(Z) e
e!ef   Z e
e#ef   Z"e
eef   Ze
eef   Ze
e)ef   Z(e
e&ef   Z%neZ eZ"eZeZ(eZ%eZ e jT                  dd      Z+dZ,dZ-d Z.e G d d             Z/ G d de      Z0y)    N)	dataclass)datetime)TYPE_CHECKINGAnyDictListOptionalUnioncast)verbose_logger)CustomLogger)
safe_dumps)ServiceLoggerPayload)ChatCompletionMessageToolCallFunctionStandardCallbackDynamicParamsStandardLoggingPayload)SpanExporter)Context)Span)Tracer) ManagementEndpointLoggingPayload)UserAPIKeyAuthOTEL_TRACER_NAMElitellmraw_gen_ai_requestlitellm_requestc            	      4   ddl m} m} t        j                  dd      t        j                  dd      t        j                  dt        j                  dd            d}|j                  |      } |        }|j                         }|j                  |      }|S )	z
    Create a proper OpenTelemetry Resource that respects OTEL_RESOURCE_ATTRIBUTES
    while maintaining backward compatibility with LiteLLM-specific environment variables.
    r   )OTELResourceDetectorResourceOTEL_SERVICE_NAMEr   OTEL_ENVIRONMENT_NAME
productionOTEL_MODEL_ID)zservice.namezdeployment.environmentmodel_id)opentelemetry.sdk.resourcesr   r    osgetenvcreatedetectmerge)r   r    base_attributesbase_resourceotel_resource_detectorenv_resourcemerged_resources          ^/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/integrations/opentelemetry.py_get_litellm_resourcer2   1   s    
 K
 		"5yA"$)),C\"RIIRYY':IF
	1O OOO4M 23)002L $)),7O    c                   ^    e Zd ZU dZeeef   ed<   dZe	e   ed<   dZ
e	e   ed<   ed        Zy)OpenTelemetryConfigconsoleexporterNendpointheadersc                 B   ddl m} t        j                  dt        j                  dd            }t        j                  dt        j                  d            }t        j                  dt        j                  d	            }|d
k(  r |  |             S  | |||      S )z
        OTEL_HEADERS=x-honeycomb-team=B85YgLm9****
        OTEL_EXPORTER="otlp_http"
        OTEL_ENDPOINT="https://api.honeycomb.io/v1/traces"

        OTEL_HEADERS gets sent as headers = {"x-honeycomb-team": "B85YgLm96******"}
        r   )InMemorySpanExporterOTEL_EXPORTER_OTLP_PROTOCOLOTEL_EXPORTERr6   OTEL_EXPORTER_OTLP_ENDPOINTOTEL_ENDPOINTOTEL_EXPORTER_OTLP_HEADERSOTEL_HEADERS	in_memory)r7   )r7   r8   r9   )6opentelemetry.sdk.trace.export.in_memory_span_exporterr;   r'   r(   )clsr;   r7   r8   r9   s        r1   from_envzOpenTelemetryConfig.from_envW   s    	
 99)299_i+P
 99:BIIo<VW))("))N*C
 {" 4 677
 	
r3   )__name__
__module____qualname__r7   r
   strr   __annotations__r8   r	   r9   classmethodrE    r3   r1   r5   r5   Q   sD    )2HeC%&2"Hhsm"!GXc]!
 
r3   r5   c                       e Zd Z	 	 d9dee   dee   f fdZd Zd Zd Z	d Z
d Z	 	 	 	 d:d	ed
ee   deeeef      deeeef      dee   f
dZ	 	 	 	 	 d;d	edee   d
ee   deeeef      deeeef      dee   fdZ	 d<dedededee   fdZdedefdZdee   fdZdefdZdedee   fdZd Zdee   dee   fd Zd! Z d"efd#Z!deee"e#ef   fd$Z$e%d%e&e'   de(ee)f   fd&       Z*d"ed'ee)   fd(Z+deee"e#ef   fd)Z,d"ed*ed+e)fd,Z-d"efd-Z.d. Z/d/ Z0d0 Z1d1 Z2d<dee   fd2Z3e%d3eeeef      de(eef   fd4       Z4	 d<d5e5d
ee   fd6Z6	 d<d5e5d
ee   fd7Z7ded3edee   fd8Z8 xZ9S )=OpenTelemetryconfigcallback_namec                 <   ddl m} ddlm} ddlm} |t        j                         }|| _        | j                  j                  | _
        | j                  j                  | _        | j                  j                  | _         |t                     }|j!                  | j#                                || _        |j'                  |       |j)                  t*              | _        || _        t1        t3        j4                  dd            j7                         }|dk(  radd l}	|	j;                  |	j<                  	       |	j?                  t@               |	j?                  d
      }
|
jC                  |	j<                         tE        |   di | | jI                          y )Nr   traceTracerProvider)SpanKindresource
DEBUG_OTELFalsetrue)levelzopentelemetry.sdk.trace.exportrL   )%opentelemetryrS   opentelemetry.sdk.tracerU   opentelemetry.tracerV   r5   rE   rO   r7   r=   r8   r?   r9   rA   r2   add_span_processor_get_span_processorrP   set_tracer_provider
get_tracerLITELLM_TRACER_NAMEtracer	span_kindrI   r'   r(   lowerloggingbasicConfigDEBUG	getLoggerrF   setLevelsuper__init__"_init_otel_logger_on_litellm_proxy)selfrO   rP   kwargsrS   rU   rV   provider_debug_otelrh   otel_exporter_logger	__class__s              r1   rn   zOpenTelemetry.__init__v   sC    	(:0>(113F![[11![[11 KK//!+@+BC##D$<$<$>?*!!(+&&':;!"))L':;AAC& gmm4h' $+#4#45U#V  ))'--8 	"6"//1r3   c                     	 ddl m} dt
        j                  vrt
        j                  j                  d       t        |d|        y# t        $ r t        j                  d       Y yw xY w)z
        Initializes OpenTelemetry for litellm proxy server

        - Adds Otel as a service callback
        - Sets `proxy_server.open_telemetry_logger` to self
        r   )proxy_serverzEProxy Server is not installed. Skipping OpenTelemetry initialization.Notelopen_telemetry_logger)	litellm.proxyrw   ImportErrorr   warningr   service_callbackappendsetattr)rp   rw   s     r1   ro   z0OpenTelemetry._init_otel_logger_on_litellm_proxy   sb    	2 111$$++F35t<  	""W 		s   A A('A(c                 ,    | j                  ||||       y N_handle_sucessrp   rq   response_obj
start_timeend_times        r1   log_success_eventzOpenTelemetry.log_success_event   s    FL*hGr3   c                 ,    | j                  ||||       y r   _handle_failurer   s        r1   log_failure_eventzOpenTelemetry.log_failure_event   s    V\:xHr3   c                 4   K   | j                  ||||       y wr   r   r   s        r1   async_log_success_eventz%OpenTelemetry.async_log_success_event   s     FL*hG   c                 4   K   | j                  ||||       y wr   r   r   s        r1   async_log_failure_eventz%OpenTelemetry.async_log_failure_event   s     V\:xHr   payloadparent_otel_spanr   r   event_metadatac                   K   ddl m} ddlm}m} d}	d}
t        |t              rt        |dz        }	n| j                  |      }	t        |t              rt        |dz        }
n| j                  |      }
||j                  }| j                  j                  ||j                  |      |	      }| j                  |d|j                         | j                  |d|j                  j                         |rL|j!                         D ]9  \  }}|d	}t        |t"              r	 t%        |      }| j                  |||       ; |j)                   ||j*                               |j-                  |
       y y # t&        $ r d
}Y Xw xY ww)Nr   rR   Status
StatusCode    eAnamecontextr   	call_typespankeyvalueserviceNonez0litellm logging error - could_not_json_serializer   )r]   rS   r_   r   r   
isinstancefloatint_to_nsr   re   
start_spanset_span_in_contextsafe_set_attributer   r   itemsdictrI   	Exception
set_statusOKend)rp   r   r   r   r   r   rS   r   r   _start_time_ns_end_time_ns
_span_nameservice_logging_spanr   r   s                  r1   async_service_success_hookz(OpenTelemetry.async_service_success_hook   s     	(:j%( c!12N![[4Nh&x#~.L;;x0L' J#';;#9#9112BC) $: $ 
 ##)'' $ 
 ##)oo++ $  "0"6"6"8JC} &!%.W$'JE ++1# ,  #9 !++F:==,AB $$l$;C (2  ) W$VEWs+   D!F$E:/AF:FFFFerrorc                 b  K   ddl m} ddlm}m}	 d}
d}t        |t              rt        t        |      dz        }
n| j                  |      }
t        |t              rt        t        |      dz        }n| j                  |      }||j                  }| j                  j                  ||j                  |      |
      }| j                  |d|j                         | j                  |d|j                  j                         |r| j                  |d	|       |rH|j!                         D ]5  \  }}t        |t"              r	 t%        |      }| j                  |||       7 |j)                   ||	j*                               |j-                  |       y y # t&        $ r d
}Y Xw xY ww)Nr   rR   r   r   r   r   r   r   r   z/litllm logging error - could_not_json_serializer   )r]   rS   r_   r   r   r   r   r   r   r   re   r   r   r   r   r   r   r   rI   r   r   ERRORr   )rp   r   r   r   r   r   r   rS   r   r   r   r   r   r   r   r   s                   r1   async_service_failure_hookz(OpenTelemetry.async_service_failure_hook   s     	(:j%( Z3!67N![[4Nh&s8}s23L;;x0L' J#';;#9#9112BC) $: $ 
 ##)'' $ 
 ##)oo++ $ 
 ''- ( 
 "0"6"6"8JC!%.V$'JE ++1# ,  #9 !++F:3C3C,DE $$l$;K (8  ) V$UEVs+   EF/FAF/F,)F/+F,,F/request_dataoriginal_exceptionuser_api_key_dicttraceback_strc                 ,  K   ddl m} ddlm}m} |j
                  }||j                   ||j                               d}	| j                  j                  |	|j                  |            }
| j                  |
dt        |             |
j                   ||j                               |
j                  | j                  t        j                                       |j                  | j                  t        j                                       y y w)	Nr   rR   r   zFailed Proxy Server Request)r   r   	exceptionr   r   )r]   rS   r_   r   r   r   r   r   re   r   r   r   rI   r   r   r   now)rp   r   r   r   r   rS   r   r   r   r   exception_logging_spans              r1   async_post_call_failure_hookz*OpenTelemetry.async_post_call_failure_hook<  s      	(:,=='''z/?/?(@A6J &*[[%;%;112BC &< &" ##+,- $ 
 #--fZ5E5E.FG"&&HLLN0K&L   $++hlln*E F% (s   DDrq   returnc                     | j                  |      }|)| j                  |      }t        j                  d|       |S | j                  }|S )a  
        Get the tracer to use for this request

        If dynamic headers are present, a temporary tracer is created with the dynamic headers.
        Otherwise, the default tracer is used.

        Returns:
            Tracer: The tracer to use for this request
        z*Using dynamic headers for this request: %s)%_get_dynamic_otel_headers_from_kwargs _get_tracer_with_dynamic_headersr   debugre   )rp   rq   dynamic_headerstracer_to_uses       r1   get_tracer_to_use_for_requestz+OpenTelemetry.get_tracer_to_use_for_request^  sV     DDVL& AA/RM  <o  !KKMr3   c                 Z    |j                  d      }|sy| j                  |      }|r|S dS )z1Extract dynamic headers from kwargs if available. standard_callback_dynamic_paramsN)r   )getconstruct_dynamic_otel_headers)rp   rq   r   r   s       r1   r   z3OpenTelemetry._get_dynamic_otel_headers_from_kwargsu  sE     JJ9: 	) 0==-M > 
 #2;t;r3   r   c                     ddl m}  |t                     }|j                  | j	                  |             |j                  t              S )zECreate a temporary tracer with dynamic headers for this request only.r   rT   rW   )r   )r^   rU   r2   r`   ra   rc   rd   )rp   r   rU   temp_providers       r1   r   z.OpenTelemetry._get_tracer_with_dynamic_headers  sH    : '0E0GH(($$_$E	
 ''(;<<r3   r   c                      y)a  
        Construct dynamic headers from standard callback dynamic params

        Note: You just need to override this method in Arize, Langfuse Otel if you want to allow team/key based logging.

        Returns:
            dict: A dictionary of dynamic headers
        NrL   )rp   r   s     r1   r   z,OpenTelemetry.construct_dynamic_otel_headers  s     r3   c                    ddl m} ddlm}m} t        j                  d|| j                         | j                  |      \  }}	| j                  |      }
|
j                  | j                  |      | j                  |      |      }|j                   ||j                               | j                  |||       t         j"                  du rn| j$                  durn|
j                  t&        | j                  |      |j)                  |            }|j                   ||j                               | j+                  |||       |j-                  | j                  |             |j-                  | j                  |             | j/                  ||       |	4|	j-                  | j                  t1        j2                                      y y )	Nr   rR   r   zAOpenTelemetry Logger: Logging kwargs: %s, OTEL config settings=%sr   r   r   Tr   rq   r   )r]   rS   r_   r   r   r   r   rO   _get_span_contextr   r   _get_span_namer   r   r   set_attributesr   turn_off_message_loggingmessage_loggingRAW_REQUEST_SPAN_NAMEr   set_raw_request_attributesr   _create_guardrail_spanr   r   )rp   rq   r   r   r   rS   r   r   _parent_contextr   otel_tracerr   raw_request_spans                r1   r   zOpenTelemetry._handle_sucess  s   ':OKK	
 -1,B,B6,J))"@@H%%$$V,{{:.# & 

 	z}}-.D&,7++t3!!-  +55*;;z211$7  6   ''z}}(=>++,<flS  $++h*? @$++h/0 	##6?#K'  $++hlln*E F (r3   r   c                 (   |xs i }|j                  d      }|y|j                  d      }|y|j                  d      }|j                  d      }t        j                         }|t        j                  |      }t        j                         }|t        j                  |      }| j	                  |      }	|	j                  d| j                  |      |      }
| j                  |
d|j                  d      	       | j                  |
d
|j                  d
      	       |j                  d      }||
j                  dt        |             | j                  |
d|j                  d      	       |
j                  | j                  |             y)zr
        Creates a span for Guardrail, if any guardrail information is present in standard_logging_object
        standard_logging_objectNguardrail_informationr   r   	guardrailr   guardrail_namer   guardrail_modemasked_entity_countguardrail_responser   )r   r   r   fromtimestampr   r   r   r   set_attributer   r   )rp   rq   r   standard_logging_payloadr   start_time_floatend_time_floatstart_time_datetimeend_time_datetimer   guardrail_spanr   s               r1   r   z$OpenTelemetry._create_guardrail_span  s    2EKZZ%F
  $+ 8 < <=T U (044\B.22:>&lln'"*"8"89I"J$LLN% ( 6 6~ F"@@H$//{{#67 0 
 	 '++,<= 	  	
 	 '++,<= 	  	
 4778MN*((%z2E'F 	$'++,@A 	  	
 	DKK0A$BCr3   c                 @   ddl m}m} t        j                  d|| j
                         | j                  |      \  }}| j                  |      }	|	j                  | j                  |      | j                  |      |      }
|
j                   ||j                               | j                  |
||       |
j                  | j                  |             | j                  ||       |4|j                  | j                  t!        j"                                      y y )Nr   r   zPOpenTelemetry Logger: Failure HandlerLogging kwargs: %s, OTEL config settings=%sr   r   r   )r_   r   r   r   r   rO   r   r   r   r   r   r   r   r   r   r   r   r   )rp   rq   r   r   r   r   r   r   r   r   r   s              r1   r   zOpenTelemetry._handle_failure  s    :^KK	

 -1,B,B6,J)) #@@H%%$$V,{{:.# & 

 	z//01D&,7$++h/0 	##6?#K'  $++hlln*E F (r3   r   c           
         dd l }ddlm} |sy 	 t        |      D ]  \  }}|j	                  d      }|s|j
                  j                   d| }| j                  || d|j	                  d             | j                  || d|j	                  d	             | j                  || d
|j                  |j	                  d                    y # t        $ r)}	t        j                  dt        |	             Y d }	~	y d }	~	ww xY w)Nr   SpanAttributesfunction.z.namer   r   z.descriptiondescriptionz.parameters
parametersz1OpenTelemetry: Error setting tools attributes: %s)jsonlitellm.proxy._typesr   	enumerater   LLM_REQUEST_FUNCTIONSr   r   dumpsr   r   r   rI   )
rp   r   toolsr   r   itoolr   prefixes
             r1   set_tools_attributesz"OpenTelemetry.set_tools_attributes&  s   7	$U+488J/*@@FFGqL''!(%(",,v. ( 
 ''!(,/",,}5 ( 
 ''!(+.**X\\,%?@ ( ! ,*  	  CSV 		s   CC 	DD  Dc                     |yt        |t        t        t        t        f      r|S 	 t        |      S # t
        $ r Y yw xY wz
        Casts the value to a primitive OTEL type if it is not already a primitive type.

        OTEL supports - str, bool, int, float

        If it's not a primitive type, then it's converted to a string
         r   rI   boolr   r   r   rp   r   s     r1   cast_as_primitive_value_typez*OpenTelemetry.cast_as_primitive_value_typeJ  E     =ec4e45L	u: 		   
2 	>>
tool_callsc           	         ddl m} i }t        |       D ]s  \  }}|j                  d      }|st        j
                  j                         }|D ]7  }|j                  |      }|s|||j                  j                   d| d| <   9 u |S )Nr   r   r   r   z.function_call.)	r   r   r   r   r   rJ   keysLLM_COMPLETIONSr   )	r  r   kv_pairsidx	tool_call	_functionr  r   _values	            r1   _tool_calls_kv_pairz!OpenTelemetry._tool_calls_kv_pair[  s     	8#%'
3NC!j1I++002D"s+  )99??@#oVYUZ[  4 r3   r   c           
      2   	 | j                   dk(  rddlm} |j                  |||       y | j                   dk(  rddlm}  |       j                  |||       y | j                   dk(  rddlm} |j                  |||       y ddl
m} |j                  d	i       }|j                  d
i       xs i }	|j                  d      }
|
t        d      |
d   }|j                         D ](  \  }}| j                  |dj!                  |      |       * |j                  d      r7| j                  ||j"                  j$                  |j                  d             | j                  ||j&                  j$                  |
d          | j                  ||j(                  j$                  |	j                  dd             |j                  d      r7| j                  ||j*                  j$                  |j                  d             |j                  d      r7| j                  ||j,                  j$                  |j                  d             |j                  d      r7| j                  ||j.                  j$                  |j                  d             | j                  ||j0                  j$                  t3        |j                  dd                   |j                  d      r7| j                  ||j4                  j$                  |j                  d             |r4|j                  d      r#| j                  |d|j                  d             |rH|j                  d      r7| j                  ||j6                  j$                  |j                  d             |xr |j                  d      }|r| j                  ||j8                  j$                  |j                  d             | j                  ||j:                  j$                  |j                  d             | j                  ||j<                  j$                  |j                  d             t>        j@                  d u ry | jB                  d ury |j                  d!      r|d!   }| jE                  ||       |j                  d"      rtG        |j                  d"            D ]  \  }}|j                  d#      r=| j                  ||jH                  j$                   d$| d%|j                  d#             |j                  d&      sftK        |j                  d&      t2              st3        |j                  d&            |d&<   | j                  ||jH                  j$                   d$| d'|j                  d&              |4|j                  d(      r!tG        |j                  d(            D ]  \  }}|j                  d)      r=| j                  ||jL                  j$                   d$| d*|j                  d)             |j                  d+      sg|j                  d+      j                  d#      rL| j                  ||jL                  j$                   d$| d%|j                  d+      j                  d#             |j                  d+      j                  d&      rtK        |j                  d+      j                  d&      t2              s/t3        |j                  d+      j                  d&            |d+   d&<   | j                  ||jL                  j$                   d$| d'|j                  d+      j                  d&             |j                  d+      }|j                  d,      }|stN        jQ                  |      }|j                         D ]  \  }}| j                  |||         y y y # tR        $ r)}tU        jV                  d-t3        |             Y d }~y d }~ww xY w).Narize_phoenixr   )ArizePhoenixLogger	langtrace)LangtraceAttributeslangfuse_otel)LangfuseOtelLoggerr   optional_paramslitellm_paramsr   z+standard_logging_object not found in kwargsmetadatazmetadata.{}r   modelr   custom_llm_providerUnknown
max_tokenstemperaturetop_pstreamFuseridzgen_ai.response.idusagetotal_tokenscompletion_tokensprompt_tokensTr   messagesroler   z.rolecontentz.contentchoicesfinish_reasonz.finish_reasonmessager  z0OpenTelemetry logging error in set_attributes %s),rP   (litellm.integrations.arize.arize_phoenixr  set_arize_phoenix_attributeslitellm.integrations.langtracer  set_langtrace_attributes+litellm.integrations.langfuse.langfuse_otelr  set_langfuse_otel_attributesr   r   r   
ValueErrorr   r   formatLLM_REQUEST_MODELr   LLM_REQUEST_TYPE
LLM_SYSTEMLLM_REQUEST_MAX_TOKENSLLM_REQUEST_TEMPERATURELLM_REQUEST_TOP_PLLM_IS_STREAMINGrI   LLM_USERLLM_RESPONSE_MODELLLM_USAGE_TOTAL_TOKENSLLM_USAGE_COMPLETION_TOKENSLLM_USAGE_PROMPT_TOKENSr   r   r   r  r   LLM_PROMPTSr   r  rN   r  r   r   r   )rp   r   rq   r   r  r  r  r   r  r  r   r   r   r   r*  r   r  promptchoicer3  r  r  r  s                          r1   r   zOpenTelemetry.set_attributesq  s   \	!!_4W"??&, ##{2N#%>>&, ##6 #??&, ;$jj):B?O#ZZ(8"=CNIO)J$ (/ !NOO 0
;H&nn.
U''=#7#7#<E (  / zz'"''&88>> **W- (  ##"3399.{; $  ##"--33$(()>	J $  ""<0''&==CC)--l; (  ""=1''&>>DD)--m< (  ""7+''&88>>)--g6 (  ##"3399/--h>? $  ""6*''&//55)--f5 (   0 0 6''#7|?O?OPT?U ( 
  0 0 9''&99??&**73 (  !>\%5%5g%>E''&==CC))N3 (  ''&BBHH))$78 (  ''&>>DD))O4 (  //47##4/""7+'0))$6zz*%#,VZZ
-C#DKCzz&)//!%#1#=#=#C#C"DAcU% P"(**V"4 0  zz),)&**Y*?E03FJJy4I0JF9-//!%#1#=#=#C#C"DAcU( S"(**Y"7 0  $E& '##I.'01A1A)1L'MV!::o6 33%)'5'E'E'K'K&LAcUR`$a&,jj&A 4 
 "::i0%zz)488@ $ 7 7)-+9+I+I+O+O*PPQRUQVV[(\*0**Y*?*C*CF*K !8 !"
  &zz)488C'1$*JJy$9$=$=i$H#(" DG(.

9(=(A(A)(LD&F9$5i$@ !% 7 7)-+9+I+I+O+O*PPQRUQVV^(_*0**Y*?*C*CI*N !8 !" '-jj&;G)0\)BJ)+8+L+LZ+X2:..2BJC$($;$;-1,/.3 %< %& 3C? (N / (P  	$$BCF 	sK   (_$ -_$ (_$ O&_$ )_$ 8B8_$ 1D_$ E_$ A_$ $	`-``c                     |yt        |t        t        t        t        f      r|S 	 t        |      S # t
        $ r Y yw xY wr  r  r	  s     r1   _cast_as_primitive_value_typez+OpenTelemetry._cast_as_primitive_value_typeR  r  r  r   r   c                 J    | j                  |      }|j                  ||       y)z_
        Safely sets an attribute on the span, ensuring the value is a primitive type.
        N)rL  r   )rp   r   r   r   primitive_values        r1   r   z OpenTelemetry.safe_set_attributec  s$     <<UC30r3   c                    |j                  di        |j                  di       xs i }|j                  dd      }|j                  d      }|j                  di       xs i }|j                  d      }|rBt        |t              r2|j                         D ]  \  }	}
| j	                  |d| d	|	 |

       ! |rZt        |t
              rIdd l}	 |j                  |      }|j                         D ]  \  }	}
| j	                  |d| d	|	 |

       ! y y y # |j                  $ r? t        j                  dj                  |             | j	                  |d| d|
       Y y w xY w)Nr  r  r"  r#  original_responseadditional_argscomplete_input_dictzllm.r   r   r   zglitellm.integrations.opentelemetry.py::set_raw_request_attributes() - raw_response not json string - {}z.stringified_raw_response)r   r   r   r   r   rI   r   loadsJSONDecodeErrorr   r   r;  )rp   r   rq   r   r  r"  _raw_response_additional_argsrR  paramvalr   s               r1   r   z(OpenTelemetry.set_raw_request_attributesj  s   

$b)$4b9?R,001F	R

#67!::&7<B.223HI :.A4#H1779
s''T*=)>aw#Gs (  : Zs; $

= 9"/"5"5"7JE3++!"#6"7q@! ,  #8 <= '' $$}  E  E% ''233LM' ( s   AD AE"!E"c                 :    t        |j                         dz        S )Nr   )r   	timestamp)rp   dts     r1   r   zOpenTelemetry._to_ns  s    2<<>C'((r3   c                     t         S r   )LITELLM_REQUEST_SPAN_NAME)rp   rq   s     r1   r   zOpenTelemetry._get_span_name  s    ((r3   c                 |    |y |j                  dd       }|y ddlm}  |       }d|i}|j                  |      }|S )Ntraceparentr   TraceContextTextMapPropagatorcarrier)r   ,opentelemetry.trace.propagation.tracecontextra  extract)rp   r9   _traceparentra  
propagatorrc  r   s          r1   get_traceparent_from_headerz)OpenTelemetry.get_traceparent_from_header  sU    ?{{=$7	
 34
 ,/$,,W,=r3   c                 ~   ddl m} ddlm} |j	                  di       xs i }|j	                  di       xs i }|j	                  di       xs i }|j	                  dd       }|j	                  di       xs i }|j	                  d	d       }		 |	|j                  |	      |	fS |y
d|i}
 |       j                  |
      d fS )Nr   rR   r`  r  proxy_server_requestr9   r_  r   litellm_parent_otel_spanNNrb  )r]   rS   rd  ra  r   r   re  )rp   rq   rS   ra  r  rj  r9   r_  	_metadatar   rc  s              r1   r   zOpenTelemetry._get_span_context  s    '	
  $4b9?R-112H"MSQS&**9b9?Rkk-6"&&z26<"	$==)CTJ	
 ',,-=>@PPP$k2G02::7:KTQQr3   c                    ddl m} ddlm} ddlm}m}m}m} t        j                  d| j                  | j                  | j                         t        j                  |xs | j                        }t        | j                  d      r<t        j                  d| j                          |t!        || j                              S | j                  dk(  r-t        j                  d	| j                          | |             S | j                  d
k(  s| j                  dk(  s| j                  dk(  r:t        j                  d| j                          | || j                  |            S | j                  dk(  s| j                  dk(  r:t        j                  d| j                          | || j                  |            S t        j                  d	| j                          | |             S )Nr   )OTLPSpanExporter)BatchSpanProcessorConsoleSpanExporterSimpleSpanProcessorr   zvOpenTelemetry Logger, initializing span processor 
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %sr9   exportzDOpenTelemetry: intiializing SpanExporter. Value of OTEL_EXPORTER: %sr6   zHOpenTelemetry: intiializing console exporter. Value of OTEL_EXPORTER: %s	otlp_httpzhttp/protobufz	http/jsonzEOpenTelemetry: intiializing http exporter. Value of OTEL_EXPORTER: %s)r8   r9   	otlp_grpcgrpczEOpenTelemetry: intiializing grpc exporter. Value of OTEL_EXPORTER: %s)5opentelemetry.exporter.otlp.proto.grpc.trace_exporterro  5opentelemetry.exporter.otlp.proto.http.trace_exporteropentelemetry.sdk.trace.exportrp  rq  rr  r   r   r   r=   r?   rA   rN   _get_headers_dictionaryhasattrr   )	rp   r   OTLPSpanExporterGRPCOTLPSpanExporterHTTPrp  rq  rr  r   _split_otel_headerss	            r1   ra   z!OpenTelemetry._get_span_processor  s   	
	
	
 	
 	 H		
 ,CC#8t'8'8 D 
 
   V"" 'tL$:L:L'MNN*  Z"" &&9&;<<+-!!_4!![0  W"" &$!//9L 
 ;.$2D2D2N  W"" &$!//9L    Z"" &&9&;<<r3   r9   c                     i }| rRt        | t              r0| j                  dd      }t        |      dk(  r|d   |d   i}|S i }|S t        | t              r| }|S )zY
        Convert a string or dictionary of headers into a dictionary of headers.
        =      r   )r   rI   splitlenr   )r9   r  partss      r1   r{  z%OpenTelemetry._get_headers_dictionary  sw    
 /1'3'  c1-u:?+08U1X*>'
 #" +-' #" GT*&-#""r3   logging_payloadc                   K   ddl m} ddlm}m} d}d}|j
                  }|j                  }	t        |t              rt        |dz        }n| j                  |      }t        |	t              rt        |	dz        }n| j                  |	      }||j                  }
| j                  j                  |
|j                  |      |      }|j                  }|/|j!                         D ]  \  }}| j#                  |d| |        |j$                  }|/|j!                         D ]  \  }}| j#                  |d| |        |j'                   ||j(                               |j+                  |	       y y w)
Nr   rR   r   r   r   request.r   z	response.r   )r]   rS   r_   r   r   r   r   r   r   r   r   routere   r   r   r   r   r   responser   r   r   )rp   r  r   rS   r   r   r   r   r   r   r   management_endpoint_span_request_datar   r   	_responses                   r1   &async_management_endpoint_success_hookz4OpenTelemetry.async_management_endpoint_success_hook$  s    
 	(:$//
"++j%( c!12N![[4Nh&x#~.L;;x0L'(..J'+{{'='=112BC) (> ($ ,88M("/"5"5"7JC++5&se,# ,  #8 (00I$"+//"3JC++5'u-# ,  #4 %//z}}0EF$((,(?7 (s   E5E7c                   K   ddl m} ddlm}m} d}d}|j
                  }|j                  }	t        |t              rt        t        |      dz        }n| j                  |      }t        |	t              rt        t        |	      dz        }n| j                  |	      }||j                  }
| j                  j                  |
|j                  |      |      }|j                  }|/|j!                         D ]  \  }}| j#                  |d| |        |j$                  }| j#                  |dt'        |             |j)                   ||j*                               |j-                  |	       y y w)
Nr   rR   r   r   r   r  r   r   r   )r]   rS   r_   r   r   r   r   r   r   r   r   r  re   r   r   r   r   r   r   rI   r   r   r   )rp   r  r   rS   r   r   r   r   r   r   r   r  r  r   r   
_exceptions                   r1   &async_management_endpoint_failure_hookz4OpenTelemetry.async_management_endpoint_failure_hookY  so    
 	(:$//
"++j%( Z3!67N![[4Nh&s8}s23L;;x0L'(..J'+{{'='=112BC) (> ($ ,88M("/"5"5"7JC++5&se,# ,  #8 )22J##-*o $ 
 %//z7G7G0HI$((,(?1 (s   E3E5c                     | j                   j                  d| j                  |      | j                  |      | j                  j
                        S )zF
        Create a span for the received proxy server request.
        zReceived Proxy Server Requestrs  )r   r   r   kind)re   r   r   rh  rf   SERVER)rp   r   r9   s      r1   )create_litellm_proxy_request_started_spanz7OpenTelemetry.create_litellm_proxy_request_started_span  sM     {{%%0{{:.44W4E&&	 & 
 	
r3   rl  )NNNN)r  NNNNr   ):rF   rG   rH   r	   r5   rI   rn   ro   r   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r
  staticmethodr   r   r   r   r  r   rL  r   r   r   r   rh  r   ra   r{  r   r  r  r  __classcell__)ru   s   @r1   rN   rN   u   sa    15'+)2,-)2  })2V=(HIHI ,07;59)-9<%9< #4.9< U8U?34	9<
 55129< !9<|  "+/7;59)-><%>< }>< #4.	><
 U8U?34>< 512>< !><J (,GG &G *	G
  }GDD V .<x~ <
= 
=0M	$"+GZ;Dtn;D/7/@;DzG6" "HU3c5;P5Q " 67	c3h *__08_BeCsE<Q6R "1t 1# 1c 1-t -^))"R6D=8D> D=L #%T	2B)C #SRUX # #* ,03@93@ #4.3@p ,00@90@ #4.0@d

 
 
$	
r3   rN   )1r'   dataclassesr   r   typingr   r   r   r   r	   r
   r   r   litellm._loggingr   "litellm.integrations.custom_loggerr   *litellm.litellm_core_utils.safe_json_dumpsr   litellm.types.servicesr   litellm.types.utilsr   r   r   r   rz  r   _SpanExporterr_   r   _Contextr   _Spanr   _Tracerr   r   !_ManagementEndpointLoggingPayloadlitellm.proxy.proxy_serverr   _UserAPIKeyAuthr(   rd   r   r]  r2   r5   rN   rL   r3   r1   <module>r     s   	 !  H H H  + ; A 7  L715 MD7C< FHcM"G+,L?C/0N',-NPS-S'T$DFLN'*$Gbii 2I> , - @  
  
  
Fc
L c
r3   