
    Mi                       S SK r S SKJr  S SKJr  S SKJrJrJrJrJ	r	J
r
Jr  S SKrS SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJrJrJr  \(       aO  S S
KJr  S SKJr   S SKJ!r"  S SKJ#r$  S SK%J&r'  S SK(J)r*  \
\"\4   r!\
\$\4   r#\
\ \4   r\
\\4   r\
\*\4   r)\
\'\4   r&O\r!\r#\r\r)\r&\r\ RV                  " SS5      r,\ RV                  " SS5      r-\ RV                  " SS5      r.Sr/Sr0S r1\ " S S5      5       r2 " S S\5      r3g)    N)	dataclass)datetime)TYPE_CHECKINGAnyDictListOptionalUnioncast)verbose_logger)CustomLogger)
safe_dumps)ServiceLoggerPayload)ChatCompletionMessageToolCallCostBreakdownFunctionStandardCallbackDynamicParamsStandardLoggingPayload)SpanExporter)Context)Span)Tracer) ManagementEndpointLoggingPayload)UserAPIKeyAuthOTEL_TRACER_NAMElitellmLITELLM_METER_NAMELITELLM_LOGGER_NAMEraw_gen_ai_requestlitellm_requestc            	      <   SSK Jn Jn  [        R                  " SS5      [        R                  " SS5      [        R                  " S[        R                  " SS5      5      S.nUR                  U5      nU " 5       nUR                  5       nUR                  U5      nU$ )	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/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/litellm/integrations/opentelemetry.py_get_litellm_resourcer5   6   s    
 K
 		"5yA"$)),C\"RIIRYY':IF
	1O OOO4M 23)002L $)),7O    c                       \ rS rSr% Sr\\\4   \S'   Sr	\
\   \S'   Sr\
\   \S'   Sr\\S'   Sr\\S	'   \S
 5       rSrg)OpenTelemetryConfigV   consoleexporterNendpointheadersFenable_metricsenable_eventsc                    SSK Jn  [        R                  " S[        R                  " SS5      5      n[        R                  " S[        R                  " S5      5      n[        R                  " S[        R                  " S	5      5      n[        R                  " S
S5      R	                  5       S:H  n[        R                  " SS5      R	                  5       S:H  nUS:X  a  U " U" 5       S9$ U " UUUUUS9$ )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_EXPORTERr:   OTEL_EXPORTER_OTLP_ENDPOINTOTEL_ENDPOINTOTEL_EXPORTER_OTLP_HEADERSOTEL_HEADERS'LITELLM_OTEL_INTEGRATION_ENABLE_METRICSfalsetrue&LITELLM_OTEL_INTEGRATION_ENABLE_EVENTS	in_memory)r;   )r;   r<   r=   r>   r?   )6opentelemetry.sdk.trace.export.in_memory_span_exporterrA   r*   r+   lower)clsrA   r;   r<   r=   r>   r?   s          r4   from_envOpenTelemetryConfig.from_env^   s    	
 99)299_i+P
 99:BIIo<VW))("))N*C
 II?IOOQ 	
 II>HNNP 	
 {" 4 677)'
 	
r6    )__name__
__module____qualname____firstlineno__r;   r
   strr   __annotations__r<   r	   r=   r>   boolr?   classmethodrP   __static_attributes__rR   r6   r4   r8   r8   V   sX    )2HeC%&2"Hhsm"!GXc]! ND M4$
 $
r6   r8   c                     ^  \ rS rSr     SJS\\   S\\   S\\   S\\   S\\   4
U 4S jjjrS r	S	 r
S
 rS rS rS rS rS r    SKS\S\\   S\\\\4      S\\\\4      S\\   4
S jjr     SLS\S\\   S\\   S\\\\4      S\\\\4      S\\   4S jjr SMS\S\S\S\\   4S jjrS\S\4S jrS\\   4S  jrS!\4S" jrS#\ S\\   4S$ jr!S% r"S& r#S' r$S( r%S)\4S* jr&S\\   S+\\'   4S, jr(S- r)S)\S\4S. jr*S)\4S/ jr+S\\\,\-\4   4S0 jr.\/S1\0\1   S\2\\4   4S2 j5       r3S)\S3\\   4S4 jr4S\\\,\-\4   4S5 jr5S)\S6\S7\4S8 jr6S)\4S9 jr7S: r8S; r9S< r:S= r;SMS!\\   4S> jjr<S? r=S@\\   SA\S\\   4SB jr>\/SC\\\\4      S\2\\4   4SD j5       r? SMSE\@S\\   4SF jjrA SMSE\@S\\   4SG jjrBS\SC\S\\   4SH jrCSIrDU =rE$ )NOpenTelemetry   configcallback_nametracer_providerlogger_providermeter_providerc                   > Uc  [         R                  5       nXl        X l        U R                  R                  U l        U R                  R                  U l        U R                  R                  U l	        U R                  U5        [        [        R                  " SS5      5      R                  5       nUS:X  a^  SS KnUR!                  UR"                  S9  UR%                  [&        5        UR%                  S5      n	U	R)                  UR"                  5        [*        T
U ]X  " S0 UD6  U R/                  U5        U R1                  U5        U R3                  5         g )N
DEBUG_OTELFalserJ   r   )levelzopentelemetry.sdk.trace.exportrR   )r8   rP   r_   r`   r;   rC   r<   rE   r=   rG   _init_tracingrW   r*   r+   rN   loggingbasicConfigDEBUG	getLoggerrS   setLevelsuper__init___init_metrics
_init_logs"_init_otel_logger_on_litellm_proxy)selfr_   r`   ra   rb   rc   kwargs_debug_otelri   otel_exporter_logger	__class__s             r4   ro   OpenTelemetry.__init__   s    >(113F*![[11![[11 KK//?+"))L':;AAC& gmm4h' $+#4#45U#V  ))'--8 	"6">*(//1r6   c                 (    SSK Jn  S[
        R                  ;  aD  [        S [
        R                   5       5      (       a  [
        R                  R                  U 5        [        USU 5        g! [         a    [        R                  " S5         gf = f)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otelc              3   L   #    U  H  n[        U[        5      (       + v   M     g 7fN)
isinstancer]   ).0cbs     r4   	<genexpr>COpenTelemetry._init_otel_logger_on_litellm_proxy.<locals>.<genexpr>   s!      :
8P"
2}---8Ps   "$open_telemetry_logger)
litellm.proxyrz   ImportErrorr   warningr   service_callbackallappendsetattr)rs   rz   s     r4   rr   0OpenTelemetry._init_otel_logger_on_litellm_proxy   s    	2 111c :
8?8P8P:
 7
 7
 $$++D15t<  	""W 		s   A. . BBc                     SSK Jn  SSKJn  SSKJn  Uc   SSKJn  UR                  5       n[        Xe5      (       d-  [        R                  " S[        U5      R                  5        UnO[        R                  " S5        U" [        5       S9nUR                  U R                  5       5        UR!                  U5        O;[        R                  " S
[        U5      R                  5        UR!                  U5        UR'                  [(        5      U l        X@l        g ! ["         ah  n[        R                  " S	[%        U5      5        U" [        5       S9nUR                  U R                  5       5        UR!                  U5         S nANS nAff = f)Nr   traceTracerProvider)SpanKind)ProxyTracerProviderz0OpenTelemetry: Using existing TracerProvider: %sz*OpenTelemetry: Creating new TracerProviderresourcezIOpenTelemetry: Exception checking existing provider, creating new one: %sz0OpenTelemetry: Using provided TracerProvider: %s)opentelemetryr   opentelemetry.sdk.tracer   opentelemetry.tracer   r   get_tracer_providerr~   r   debugtyperS   r5   add_span_processor_get_span_processorset_tracer_provider	ExceptionrW   
get_tracerLITELLM_TRACER_NAMEtracer	span_kind)rs   ra   r   r   r   r   existing_provideres           r4   rh   OpenTelemetry._init_tracing   sP   ':0 ";C$)$=$=$?! ""3II"((J./88 '8O #(()UV&4>S>U&VO#66t7O7O7QR--o>   B_%.. %%o6 &&':;!'  ;$$_F #1:O:Q"R2243K3K3MN))/::;s    AD *AD 
F%AFFc                    U R                   R                  (       d  S U l        S U l        S U l        g SSKJn  SSKJnJ	n  Uc  SSK
Jn  SSKJnJn  U R                  U R                   R                   S5      nU" U["        R%                  U R                   R&                  5      X6R(                  0S9n	U" U	SS	9n
U" U
/[+        5       S
9nUR-                  [.        5      nOUR-                  [.        5      nUR1                  U5        UR3                  SSSS9U l        UR3                  SSSS9U l        UR3                  SSSS9U l        g )Nr   )metrics)	HistogramMeterProvider)OTLPMetricExporter)AggregationTemporalityPeriodicExportingMetricReaderr   )r<   r=   preferred_temporalityi'  )export_interval_millis)metric_readersr   z gen_ai.client.operation.durationzGenAI operation durations)namedescriptionunitzgen_ai.client.token.usagezGenAI token usagez{token}zgen_ai.client.token.costzGenAI request costUSD)r_   r>   _operation_duration_histogram_token_usage_histogram_cost_histogramr   r   opentelemetry.sdk.metricsr   r   6opentelemetry.exporter.otlp.proto.grpc.metric_exporterr    opentelemetry.sdk.metrics.exportr   r   _normalize_otel_endpointr<   r]   _get_headers_dictionaryr=   DELTAr5   	get_meterrS   set_meter_providercreate_histogram)rs   rc   r   r   r   r   r   r   normalized_endpoint_metric_exporter_metric_readermeters               r4   rp   OpenTelemetry._init_metrics   s[   {{))15D.*.D'#'D )F !
 #'"?"?$$i#  2,%==dkk>Q>QR'02N2N&O 
 ; N + ./:O:QN #,,X6E #,,X6E"">2-2-C-C32 .D .
*
 ',&<&<,+ '= '
#
  %55+,  6  
r6   c                     U R                   R                  (       d  g SSKJn  SSKJn  SSKJn  Uc>  [        5       nU" US9nU R                  5       nU(       a  UR                  U" U5      5        U" U5        g )Nr   )set_logger_provider)LoggerProvider)BatchLogRecordProcessorr   )r_   r?   opentelemetry._logsr   opentelemetry.sdk._logsr   opentelemetry.sdk._logs.exportr   r5   _get_log_exporteradd_log_record_processor)rs   rb   r   OTLoggerProviderr   litellm_resourcelog_exporters          r4   rq   OpenTelemetry._init_logs.  sh    {{((;NJ "46.8HIO113L88+L9 	O,r6   c                 (    U R                  XX45        g r}   _handle_successrs   rt   response_obj
start_timeend_times        r4   log_success_eventOpenTelemetry.log_success_eventD      V:Hr6   c                 (    U R                  XX45        g r}   _handle_failurer   s        r4   log_failure_eventOpenTelemetry.log_failure_eventG  r   r6   c                 0   #    U R                  XX45        g 7fr}   r   r   s        r4   async_log_success_event%OpenTelemetry.async_log_success_eventJ       V:H   c                 0   #    U R                  XX45        g 7fr}   r   r   s        r4   async_log_failure_event%OpenTelemetry.async_log_failure_eventM  r   r   payloadparent_otel_spanr   r   event_metadatac                 *  #    SSK Jn  SSKJnJn  Sn	Sn
[        U[        5      (       a  [        US-  5      n	OU R                  U5      n	[        U[        5      (       a  [        US-  5      n
OU R                  U5      n
Ub  UR                  nU R                  R                  UUR                  U5      U	S9nU R                  USUR                  S9  U R                  USUR                  R                  S9  U(       aP  UR!                  5        H<  u  pUc  S	n[        U["        5      (       a   [%        U5      nU R                  UUUS9  M>     UR)                  U" UR*                  5      5        UR-                  U
S9  g g ! [&         a    S
n NUf = f7f)Nr   r   Status
StatusCode    eAr   contextr   	call_typespankeyvalueserviceNonez0litellm logging error - could_not_json_serializer   )r   r   r   r   r   r~   floatint_to_nsr   r   
start_spanset_span_in_contextsafe_set_attributer   r   itemsdictrW   r   
set_statusOKend)rs   r   r   r   r   r   r   r   r   _start_time_ns_end_time_ns
_span_nameservice_logging_spanr   r   s                  r4   async_service_success_hook(OpenTelemetry.async_service_success_hookP  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/F:AFFFFFerrorc                 v  #    SSK Jn  SSKJnJn	  Sn
Sn[        U[        5      (       a  [        [        U5      S-  5      n
OU R                  U5      n
[        U[        5      (       a  [        [        U5      S-  5      nOU R                  U5      nUGb  UR                  nU R                  R                  UUR                  U5      U
S9nU R                  USUR                  S9  U R                  USUR                  R                  S9  U(       a  U R                  US	US9  U(       aK  UR!                  5        H7  u  p[        U["        5      (       a   [%        U5      nU R                  UUUS9  M9     UR)                  U" U	R*                  5      5        UR-                  US9  g g ! [&         a    S
n NUf = f7f)Nr   r   r   r   r   r   r   r   r  z/litllm logging error - could_not_json_serializer   )r   r   r   r   r   r~   r   r   r   r   r   r   r   r  r   r   r  r  rW   r   r  ERRORr  )rs   r   r  r   r   r   r   r   r   r   r  r  r	  r
  r   r   s                   r4   async_service_failure_hook(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F9F' AF9'F63F95F66F9request_dataoriginal_exceptionuser_api_key_dicttraceback_strc                   #    SSK Jn  SSKJnJn  UR
                  nUb  UR                  U" UR                  5      5        Sn	U R                  R                  U	UR                  U5      S9n
U R                  U
S[        U5      S9  U
R                  U" UR                  5      5        U
R                  U R                  [        R                   " 5       5      S9  UR                  U R                  [        R                   " 5       5      S9  g g 7f)	Nr   r   r   zFailed Proxy Server Request)r   r   	exceptionr   r   )r   r   r   r   r   r   r  r  r   r   r   r  rW   r  r   r   now)rs   r  r  r  r  r   r   r   r   r	  exception_logging_spans              r4   async_post_call_failure_hook*OpenTelemetry.async_post_call_failure_hook  s      	(:,=='''z/?/?(@A6J &*[[%;%;112BC &< &" ##+,- $ 
 #--fZ5E5E.FG"&&HLLN0K&L   $++hlln*E F% (s   D	Drt   returnc                     U R                  U5      nUb*  U R                  U5      n[        R                  " SU5        U$ U R                  nU$ )z
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   r   r   )rs   rt   dynamic_headerstracer_to_uses       r4   get_tracer_to_use_for_request+OpenTelemetry.get_tracer_to_use_for_request  sV     DDVL& AA/RM  <o  !KKMr6   c                 h    UR                  S5      nU(       d  gU R                  US9nU(       a  U$ S$ )z1Extract dynamic headers from kwargs if available. standard_callback_dynamic_paramsN)r%  )getconstruct_dynamic_otel_headers)rs   rt   r%  r   s       r4   r  3OpenTelemetry._get_dynamic_otel_headers_from_kwargs  sE     JJ9: 	) 0==-M > 
 #2;t;r6   r   c                     SSK Jn  U" [        5       S9nUR                  U R	                  US95        UR                  [        5      $ )zECreate a temporary tracer with dynamic headers for this request only.r   r   r   )r   )r   r   r5   r   r   r   r   )rs   r   r   temp_providers       r4   r  .OpenTelemetry._get_tracer_with_dynamic_headers  sH    : '0E0GH(($$_$E	
 ''(;<<r6   r%  c                     g)z
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
NrR   )rs   r%  s     r4   r'  ,OpenTelemetry.construct_dynamic_otel_headers  s     r6   c                    [         R                  " SUU R                  5        U R                  U5      u  pVU R	                  XX4U5      nU R                  XX4U5        U R                  XS9  U R                  XX45        U R                  R                  (       a  U R                  XU5        Ub2  UR                  U R                  [        R                  " 5       5      S9  g g )NzAOpenTelemetry Logger: Logging kwargs: %s, OTEL config settings=%srt   r   r   )r   r   r_   _get_span_context_start_primary_span_maybe_log_raw_request_create_guardrail_span_record_metricsr?   _emit_semantic_logsr  r   r   r  )rs   rt   r   r   r   ctxparent_spanr   s           r4   r   OpenTelemetry._handle_success0  s    OKK	

  11&9 ''jTWX 	##F*PTU 	##6#? 	V:H ;;$$$$V4@ "OOT[[%@OA #r6   c                 8   SSK JnJn  U R                  U5      nUR	                  U R                  U5      U R                  U5      US9n	U	R                  U" UR                  5      5        U R                  XU5        U	R                  U R                  U5      S9  U	$ )Nr   r   r   r   r   r   )r   r   r   r"  r   _get_span_namer   r  r  set_attributesr  )
rs   rt   r   r   r   r   r   r   otel_tracerr   s
             r4   r1  !OpenTelemetry._start_primary_spanL  s    :"@@H%%$$V,{{:. & 

 	z}}-.D,7$++h/0r6   c                 (   SSK Jn  SSKJnJn  [
        R                  (       d  U R                  (       d  g UR                  S0 5      n	U	R                  S5      =(       d    0 n
U
R                  S5      nU(       a  UO[        nU R                  U5      nUR                  UU R                  U5      UR                  U5      S9nUR                  U" UR                  5      5        U R!                  XU5        UR#                  U R                  U5      S9  g )	Nr   r   r   litellm_paramsmetadatageneration_namer:  r   )r   r   r   r   r   r   turn_off_message_loggingmessage_loggingr&  RAW_REQUEST_SPAN_NAMEr"  r   r   r   r  r  set_raw_request_attributesr  )rs   rt   r   r   r   r7  r   r   r   r@  rA  rB  raw_span_namer=  raw_spans                  r4   r2  $OpenTelemetry._maybe_log_raw_requestZ  s     	(: ++43G3G$4b9!%%j17R",,'89+:@U"@@H)){{:.--k: * 

 	F:==12'',Gdkk(34r6   c                    XC-
  R                  5       nUR                  S5      =(       d    0 nUR                  SS5      nSUUR                  S5      SS.nUR                  S5      n	[        U	S	S 5      =(       d    U	=(       d    0 R                  S	0 5      n
S
 H*  nU
R                  U5      c  M  [        X   5      USU 3'   M,     [        U	SS 5      =(       d    U	=(       d    0 R                  S0 5      nU(       a  [	        U5      US'   U R
                  (       a  U R
                  R                  XXS9  U(       a  UR                  S5      =n(       au  U R                  (       ad  0 UESS0En0 UESS0EnU R                  R                  UR                  SS5      US9  U R                  R                  UR                  SS5      US9  UR                  S5      nU R                  (       a#  U(       a  U R                  R                  UUS9  g g g )Nr@  custom_llm_providerUnknownchatmodelr   )zgen_ai.operation.namegen_ai.systemzgen_ai.request.modelzgen_ai.frameworkstandard_logging_objectrA  )user_api_key_hashuser_api_key_aliasuser_api_key_team_iduser_api_key_org_iduser_api_key_user_iduser_api_key_team_aliasuser_api_key_user_emailspend_logs_metadatarequester_ip_addressrequester_metadatauser_api_key_end_user_idprompt_management_metadataapplied_guardrailsmcp_tool_call_metadatavector_store_request_metadataz	metadata.hidden_params)
attributesusagezgen_ai.token.typeinput
completionprompt_tokensr   completion_tokensresponse_cost)	total_secondsr&  getattrrW   r   r   recordr   r   )rs   rt   r   r   r   
duration_sparamsprovidercommon_attrsstd_logmdr   r`  rb  in_attrs	out_attrscosts                    r4   r4  OpenTelemetry._record_metricst  s   +::<
,-3::3Y? &,%$*JJw$7 )	
 **67Wj$/VGMr3F3FzSU3V
C" vvc{&25bg,y./%
*  $? 
GMrCVCVRD
 ,6},EL)--..55 6  *..w77U7//IlI,?IO|O-@,O	++22IIoq1h 3  ++22II115) 3  zz/*D  '''F %)r6   r   c                    U R                   R                  (       d  g SSKJnJnJn  SSKJn  U" [        5      nU" 5       n	[        U	SS 5      =(       d
    [        5       n
UR                  5       nUR                  S5      =(       d    0 R                  SS5      nUR                  S/ 5       H  nUR                  S	S
5      nSUS.nUS:X  a  UR                  S5      (       a  US   US'   U R                  (       a  UR                  S5      (       a  US   US'   U" U R                  [        R                   " 5       5      UR"                  UR$                  UR&                  UR(                  SUR+                  5       U
US9	nUR-                  U5        M     [/        UR                  S/ 5      5       GH   u  nnSUUUR                  S5      S.nUR                  S0 5      nU R                  (       a  UR                  S5      (       a  US   US'   UUR                  S5      S	UR                  S	S5      0S.nU R                  (       a!  UR                  S5      (       a  US   US   S'   U" U R                  [        R                   " 5       5      UR"                  UR$                  UR&                  UR(                  SUU
US9	nUR-                  U5        GM#     g )Nr   )SeverityNumber
get_loggerget_logger_provider)	LogRecord	_resourcer@  rK  rL  messagesroleuserzgen_ai.content.prompt)
event_namerO  toolidcontentzgen_ai.promptINFO)		timestamptrace_idspan_idtrace_flagsseverity_numberseverity_textbodyr   ra  choiceszgen_ai.content.completionfinish_reason)r~  rO  indexr  messagezmessage.content	assistant)r  r  r  )r_   r?   r   rv  rw  rx  r   ry  r   ri  r5   get_span_contextr&  rD  r   r   r  r  r  r  r  copyemit	enumerate)rs   rt   r   r   rv  rw  rx  SdkLogRecordotel_loggerrb   r   
parent_ctxrm  msgr|  attrs
log_recordidxchoicebody_msgr  s                        r4   r5  !OpenTelemetry._emit_semantic_logs  s   {{((WWE !45 ./O[$7R;P;R 	 **,
JJ/06B;;!9

 ::j"-C7766*D#:XVEv~#''$--!$id##	(:(:),Yo&%++hlln5#,,"**&22 . 3 3$XXZ! 
J Z(' ., %\%5%5i%DEKC9!)!'O!<	E zz)R0H##Y(?(?+3I+>'(!'O!<"HLL$EFD
 ##Y(?(?-5i-@Y	*%++hlln5#,,"**&22 . 3 3$! 
J Z(; Fr6   r   c                    U=(       d    0 nUR                  S5      nUc  gUR                  S5      nU(       d  gU Vs/ s H  n[        U[        5      (       d  M  UPM     nnU(       d  gU R                  U5      nU GHO  nUR                  S5      n	UR                  S5      n
[        R
                  " 5       nU	b  [        R                  " U	5      n[        R
                  " 5       nU
b  [        R                  " U
5      nUR                  SU R                  U5      US9nU R                  USUR                  S5      S	9  U R                  US
UR                  S
5      S	9  UR                  S5      nUb  UR                  S[        U5      5        U R                  USUR                  S5      S	9  UR                  U R                  U5      S9  GMR     gs  snf )zb
Creates a span for Guardrail, if any guardrail information is present in standard_logging_object
rP  Nguardrail_informationr   r   	guardrailr:  guardrail_namer   guardrail_modemasked_entity_countguardrail_responser   )r&  r~   r  r"  r   r  fromtimestampr   r   r  set_attributer   r  )rs   rt   r   standard_logging_payloadguardrail_information_datainformationguardrail_information_listr=  r  start_time_floatend_time_floatstart_time_datetimeend_time_datetimeguardrail_spanr  s                  r4   r3  $OpenTelemetry._create_guardrail_span  s    2EKZZ%F
  $+%=%A%A#&
" *  :&
9+t, 9 	# &
 *"@@H%?!488F266zBN"*,,.+&.&<&<=M&N# ()$,$:$:>$J!(33 ;;':; 4 N ###$+//0@A $  ###$+//0@A $  #8";";<Q"R".,,):6I+J ###(+//0DE $  4E(FGQ &@&
s   GGc                 F   SSK JnJn  [        R                  " SUU R
                  5        U R                  U5      u  pxU R                  U5      n	U	R                  U R                  U5      U R                  U5      US9n
U
R                  U" UR                  5      5        U R                  XU5        U R                  XS9  U
R                  U R                  U5      S9  U R!                  XS9  Ub2  UR                  U R                  ["        R$                  " 5       5      S9  g g )Nr   r   zPOpenTelemetry Logger: Failure HandlerLogging kwargs: %s, OTEL config settings=%sr:  )r   rt   r   r/  )r   r   r   r   r   r_   r0  r"  r   r;  r   r  r  r<  _record_exception_on_spanr  r3  r   r  )rs   rt   r   r   r   r   r   _parent_contextr   r=  r   s              r4   r   OpenTelemetry._handle_failureE  s
   :^KK	

 -1,B,B6,J) #@@H%%$$V,{{:.# & 

 	z//01D,7 	&&D&@$++h/0 	##6#K'  $++hlln*E F (r6   c                     SSK Jn  UR                  S5      nUb  UR                  U5        UR                  S5      nUc  gUR                  S5      nUc4  UR                  S5      nU(       a  U R	                  UUR
                  US9  gUR                  S	5      (       a  U R	                  UUR                  US	   S9  UR                  S
5      (       a  U R	                  UUR                  US
   S9  UR                  S5      (       a  U R	                  UUR
                  US   S9  UR                  S5      (       a  U R	                  UUR                  US   S9  UR                  S5      (       a  U R	                  UUR                  US   S9  gg! [         a*  n[        R                  " S[        U5      5         SnAgSnAff = f)a)  
Record exception information on the span using OTEL standard methods.

This extracts error information from StandardLoggingPayload and:
1. Uses span.record_exception() for the actual exception object (OTEL standard)
2. Sets structured error attributes from StandardLoggingPayloadErrorInformation
r   )ErrorAttributesr  NrP  error_information	error_strr   
error_codeerror_classerror_messagellm_provider	tracebackz4OpenTelemetry: Error recording exception on span: %s)*litellm.integrations._types.open_inferencer  r&  record_exceptionr  ERROR_MESSAGE
ERROR_CODE
ERROR_TYPEERROR_LLM_PROVIDERERROR_STACK_TRACEr   r   r  rW   )	rs   r   rt   r  r  r  r  r  r   s	            r4   r  'OpenTelemetry._record_exception_on_spand  s   G	R 

;/I $%%i0 JP)J$ (/ !9 < <=P Q (488E	++!+99' , 
  !$$\22'''22+L9 (  !$$]33'''22+M: (  !$$_55'''55+O< (  !$$^44'''::+N; (  !$$[11'''99+K8 (  2  	$$FA 	s%   ?F AF 
DF 
G F??Gc           
         SS K nSSKJn  U(       d  g  [        U5       H  u  pVUR	                  S5      nU(       d  M  UR
                  R                   SU 3nU R                  UU S3UR	                  S5      S9  U R                  UU S3UR	                  S	5      S9  U R                  UU S
3UR                  UR	                  S5      5      S9  M     g ! [         a*  n	[        R                  " S[        U	5      5         S n	A	g S n	A	ff = f)Nr   SpanAttributesfunction.z.namer   r   z.descriptionr   z.parameters
parametersz1OpenTelemetry: Error setting tools attributes: %s)jsonlitellm.proxy._typesr  r  r&  LLM_REQUEST_FUNCTIONSr   r  dumpsr   r   r  rW   )
rs   r   toolsr  r  ir  r  prefixr   s
             r4   set_tools_attributes"OpenTelemetry.set_tools_attributes  s   7	$U+88J/*@@FFGqL''!(%(",,v. ( 
 ''!(,/",,}5 ( 
 ''!(+.**X\\,%?@ ( ! ,*  	  CSV 		s   CC 
D
  DD
c                     Uc  g[        U[        [        [        [        45      (       a  U$  [        U5      $ ! [
         a     gf = f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~   rW   rY   r   r   r   rs   r   s     r4   cast_as_primitive_value_type*OpenTelemetry.cast_as_primitive_value_type  H     =ec4e455L	u: 		   
8 
AA
tool_callsc           	      6   SSK Jn  0 n[        U 5       H  u  p4UR                  S5      nU(       d  M  [        R
                  R                  5       nU H>  nUR                  U5      nU(       d  M  UUUR                  R                   SU SU 3'   M@     M     U$ )Nr   r  r  r  z.function_call.)	r  r  r  r&  r   rX   keysLLM_COMPLETIONSr   )	r  r  kv_pairsr  	tool_call	_functionr  r   _values	            r4   _tool_calls_kv_pair!OpenTelemetry._tool_calls_kv_pair  s     	8#%'
3NC!j1I++002D"s+6  )99??@#oVYUZ[  4 r6   r   c           
          U R                   S:X  a  SSKJn  UR                  XU5        g U R                   S:X  a  SSKJn  U" 5       R                  XU5        g U R                   S:X  a  SSKJn  UR                  XU5        g SSK
Jn  UR                  S	0 5      nUR                  S
0 5      =(       d    0 n	UR                  S5      n
U
c  [        S5      eU
S   nUR                  5        H%  u  pU R                  USR!                  U5      US9  M'     [#        U
SS 5      =(       d    U
=(       d    0 R                  S0 5      nU(       a  U R                  US[%        U5      S9  U
R                  S5      nU(       a2  UR                  5        H  u  pUc  M
  U R                  USU 3US9  M      UR                  S5      (       a4  U R                  UUR&                  R(                  UR                  S5      S9  U R                  UUR*                  R(                  U
S   S9  U R                  UUR,                  R(                  U	R                  SS5      S9  UR                  S5      (       a4  U R                  UUR.                  R(                  UR                  S5      S9  UR                  S5      (       a4  U R                  UUR0                  R(                  UR                  S5      S9  UR                  S5      (       a4  U R                  UUR2                  R(                  UR                  S5      S9  U R                  UUR4                  R(                  [7        UR                  SS5      5      S9  UR                  S5      (       a4  U R                  UUR8                  R(                  UR                  S5      S9  U(       a6  UR                  S5      (       a   U R                  USUR                  S5      S9  U(       aJ  UR                  S5      (       a4  U R                  UUR:                  R(                  UR                  S5      S9  U=(       a    UR                  S5      nU(       a  U R                  UUR<                  R(                  UR                  S 5      S9  U R                  UUR>                  R(                  UR                  S!5      S9  U R                  UUR@                  R(                  UR                  S"5      S9  [B        RD                  S#L a  g U RF                  S#La  g UR                  S$5      (       a  US$   nU RI                  UU5        UR                  S%5      (       Ga  [K        UR                  S%5      5       H  u  nnUR                  S&5      (       a:  U R                  UURL                  R(                   S'U S(3UR                  S&5      S9  UR                  S)5      (       d  Mn  [O        UR                  S)5      [6        5      (       d  [7        UR                  S)5      5      US)'   U R                  UURL                  R(                   S'U S*3UR                  S)5      S9  M     UGbP  UR                  S+5      (       Ga8  [K        UR                  S+5      5       GH  u  nnUR                  S,5      (       a:  U R                  UURP                  R(                   S'U S-3UR                  S,5      S9  UR                  S.5      (       d  Mo  UR                  S.5      R                  S&5      (       aI  U R                  UURP                  R(                   S'U S(3UR                  S.5      R                  S&5      S9  UR                  S.5      R                  S)5      (       a  [O        UR                  S.5      R                  S)5      [6        5      (       d/  [7        UR                  S.5      R                  S)5      5      US.   S)'   U R                  UURP                  R(                   S'U S*3UR                  S.5      R                  S)5      S9  UR                  S.5      nUR                  S/5      nU(       d  GM  [R        RU                  U5      nUR                  5        H  u  pU R                  UUUS9  M     GM     g g g ! [V         a*  n[X        RZ                  " S0[7        U5      5         S nAg S nAff = f)1Narize_phoenixr   )ArizePhoenixLogger	langtrace)LangtraceAttributeslangfuse_otel)LangfuseOtelLoggerr  optional_paramsr@  rP  z+standard_logging_object not found in kwargsrA  zmetadata.{}r   r`  cost_breakdownzgen_ai.cost.rN  r   rK  rL  
max_tokenstemperaturetop_pstreamFr}  r  zgen_ai.response.idrb  total_tokensrf  re  Tr  r{  r|  r  z.roler  z.contentr  r  z.finish_reasonr  r  z0OpenTelemetry logging error in set_attributes %s).r`   (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  formatri  r   LLM_REQUEST_MODELr   LLM_REQUEST_TYPE
LLM_SYSTEMLLM_REQUEST_MAX_TOKENSLLM_REQUEST_TEMPERATURELLM_REQUEST_TOP_PLLM_IS_STREAMINGrW   LLM_USERLLM_RESPONSE_MODELLLM_USAGE_TOTAL_TOKENSLLM_USAGE_COMPLETION_TOKENSLLM_USAGE_PROMPT_TOKENSr   rC  rD  r  r  LLM_PROMPTSr~   r  r]   r  r   r   r  )rs   r   rt   r   r  r  r  r  r  r@  r  rA  r   r   r`  r  rb  r  r  promptr  r  r  r  r   s                            r4   r<  OpenTelemetry.set_attributes   s   n	!!_4W"??, ##{2N#%>>, ##6 #??, ;$jj):B?O#ZZ(8"=CNIO)J$ (/ !NOO 0
;H&nn.
''=#7#7#<E (  / $(/4 K*0b55orJ  ''?*]:S (  7O6R6RSc6dN"0"6"6"8JC(//!%".se 4"' 0  #9 zz'""''&88>> **W- (  ##"3399.{; $  ##"--33$(()>	J $  ""<00''&==CC)--l; (  ""=11''&>>DD)--m< (  ""7++''&88>>)--g6 (  ##"3399/--h>? $  ""6**''&//55)--f5 (   0 0 6 6''#7|?O?OPT?U ( 
  0 0 9 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*?EE03FJJy4I0JF9-//!%#1#=#=#C#C"DAcU( S"(**Y"7 0  $E& '##I..'01A1A)1L'MV!::o66 33%)'5'E'E'K'K&LAcUR`$a&,jj&A 4 
 "::i00%zz)488@@ $ 7 7)-+9+I+I+O+O*PPQRUQVV[(\*0**Y*?*C*CF*K !8 !"
  &zz)488C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)z+8+L+LZ+X2:..2BJC$($;$;-1,/.3 %< %& 3C? (N / (P  	$$BCF 	sR   (c -c (c Dc Nc c (Cc 4Dc E%c Ac 
c< c77c<c                     Uc  g[        U[        [        [        [        45      (       a  U$  [        U5      $ ! [
         a     gf = fr  r  r  s     r4   _cast_as_primitive_value_type+OpenTelemetry._cast_as_primitive_value_type  r  r  r   r   c                 H    U R                  U5      nUR                  X$5        g)zO
Safely sets an attribute on the span, ensuring the value is a primitive type.
N)r  r  )rs   r   r   r   primitive_values        r4   r   OpenTelemetry.safe_set_attribute  s"     <<UC30r6   c                 l    UR                  S0 5        UR                  S0 5      =(       d    0 nUR                  SS5      nUR                  S5      nUR                  S0 5      =(       d    0 nUR                  S5      nU(       aE  [        U[        5      (       a0  UR                  5        H  u  pU R	                  USU S	U	 3U
S
9  M     U(       a]  [        U[
        5      (       aG  SS Kn UR                  U5      nUR                  5        H  u  pU R	                  USU S	U	 3U
S
9  M     g g g ! UR                   a=    [        R                  " SR                  U5      5        U R	                  USU S3US
9   g f = f! [         a*  n[        R                  " S[        U5      5         S nAg S nAff = f)Nr  r@  rK  rL  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_responsez<OpenTelemetry logging error in set_raw_request_attributes %s)r&  r~   r  r  r  rW   r  loadsJSONDecodeErrorr   r   r  r   r  )rs   r   rt   r   r@  rK  _raw_response_additional_argsr  paramvalr  r   s                r4   rF  (OpenTelemetry.set_raw_request_attributes  s   1	JJ("-#ZZ(8"=CN"0"4"45JI"V"JJ':;M%zz*;R@FB"2"6"67L"M #z2Et'L'L"5";";"=JE++!.A-B!E7'KSV ,  #> M3!?!?$(JJ}$=M&3&9&9&;
//!%"&':&;1UG D"% 0  '< "@} ++ "(( B  I  I) ++!"#6"77PQ+ ,   	$$NPSTUPV 	s8   C(E? +AD/ /A
E<9E? ;E<<E? ?
F3	 F..F3c                 :    [        UR                  5       S-  5      $ )Nr   )r   r  )rs   dts     r4   r   OpenTelemetry._to_ns?  s    2<<>C'((r6   c                     UR                  S0 5      nUR                  S5      =(       d    0 nUR                  S5      nU(       a  U$ [        $ )Nr@  rA  rB  )r&  LITELLM_REQUEST_SPAN_NAME)rs   rt   r@  rA  rB  s        r4   r;  OpenTelemetry._get_span_nameB  sF    $4b9!%%j17R",,'89""((r6   c                 z    Uc  g UR                  SS 5      nUc  g SSKJn  U" 5       nSU0nUR                  US9nU$ )Ntraceparentr   TraceContextTextMapPropagatorcarrier)r&  ,opentelemetry.trace.propagation.tracecontextr&  extract)rs   r=   _traceparentr&  
propagatorr(  r  s          r4   get_traceparent_from_header)OpenTelemetry.get_traceparent_from_headerL  sU    ?{{=$7	
 34
 ,/$,,W,=r6   c           	         SSK JnJn  SSKJn  UR                  S0 5      =(       d    0 nUR                  S0 5      =(       d    0 nUR                  S0 5      =(       d    0 nUR                  SS 5      nUR                  S0 5      =(       d    0 n	U	R                  S	S 5      n
U
b)  [        R                  " S
5        UR                  U
5      U
4$ Ub0  [        R                  " S5        SU0nU" 5       R                  US9S 4$  UR                  5       nUb  UR                  5       nUR                  (       ab  [        R                  " SU[        UR                  S5      [        UR                  S5      UR!                  5       5        UR#                  5       U4$ [        R                  " S5        g! [$         a*  n[        R                  " S['        U5      5         S nANFS nAff = f)Nr   )r   r   r%  r@  proxy_server_requestr=   r$  rA  litellm_parent_otel_spanz7OpenTelemetry: Using explicit parent span from metadataz?OpenTelemetry: Using traceparent header for context propagationr'  zcOpenTelemetry: Using active span from global context: %s (trace_id=%s, span_id=%s, is_recording=%s)032x016xz-OpenTelemetry: Error getting current span: %sz:OpenTelemetry: No parent context found, creating root span)NN)r   r   r   r)  r&  r&  r   r   r   r*  get_current_spanr  is_validr  r  r  is_recordingget_currentr   rW   )rs   rt   r   r   r&  r@  r0  r=   r$  	_metadatar   r(  current_spanspan_contextr   s                  r4   r0  OpenTelemetry._get_span_context]  s   0	
  $4b9?R-112H"MSQS&**9b9?Rkk-6"&&z26<"	$==)CTJ '  I ,,-=>@PPP "  Q %k2G02::7:KTQQ	 113L'+<<>(("((}$|44f=|33V<$113 #..0,>> 	H	
   	  ?Q 	s   ?BF, ,
G 6 GG c                 6   SSK Jn  SSKJn  SSKJnJnJnJn  [        R                  " SU R                  U R                  U R                  5        [        R                  U=(       d    U R                  S9n[        U R                  S5      (       a<  [        R                  " SU R                  5        U" [!        XpR                  5      5      $ U R                  S:X  a.  [        R                  " S	U R                  5        U" U" 5       5      $ U R                  S
:X  d   U R                  S:X  d  U R                  S:X  aI  [        R                  " SU R                  5        U R#                  U R                  S5      n	U" U" XS95      $ U R                  S:X  d  U R                  S:X  aI  [        R                  " SU R                  5        U R#                  U R                  S5      n	U" U" XS95      $ [        R                  " S	U R                  5        U" U" 5       5      $ )Nr   )OTLPSpanExporter)BatchSpanProcessorConsoleSpanExporterSimpleSpanProcessorr   zvOpenTelemetry Logger, initializing span processor 
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %sr=   exportzDOpenTelemetry: intiializing SpanExporter. Value of OTEL_EXPORTER: %sr:   zHOpenTelemetry: intiializing console exporter. Value of OTEL_EXPORTER: %s	otlp_httphttp/protobuf	http/jsonzEOpenTelemetry: intiializing http exporter. Value of OTEL_EXPORTER: %stracesr<   r=   	otlp_grpcgrpczEOpenTelemetry: intiializing grpc exporter. Value of OTEL_EXPORTER: %s)5opentelemetry.exporter.otlp.proto.grpc.trace_exporterr=  5opentelemetry.exporter.otlp.proto.http.trace_exporteropentelemetry.sdk.trace.exportr>  r?  r@  r   r   r   rC   rE   rG   r]   r   hasattrr   r   )
rs   r   OTLPSpanExporterGRPCOTLPSpanExporterHTTPr>  r?  r@  r   _split_otel_headersr   s
             r4   r   !OpenTelemetry._get_span_processor  s   	
	
	
 	
 	 H		
 ,CC#8t'8'8 D 
 
 
   V"" 'tL:L:L'MNN*  Z"" &&9&;<<+-!!_4!![0  W"" #'"?"?""H# &$0 
 ;.$2D2D2N  W"" #'"?"?""H# &$0    Z"" &&9&;<<r6   c                    [         R                  " SU R                  U R                  U R                  5        [
        R                  U R                  5      nU R                  U R                  S5      n[         R                  " SU R                  U5        [        U R                  S5      (       a-  [         R                  " SU R                  5        U R                  $ U R                  S:X  a.  SSK	J
n  [         R                  " S	U R                  5        U" 5       $ U R                  S
:X  d   U R                  S:X  d  U R                  S:X  a.  SSKJn  [         R                  " SU R                  U5        U" X!S9$ U R                  S:X  d  U R                  S:X  a.  SSKJn  [         R                  " SU R                  U5        U" X!S9$ [         R                  " SU R                  5        SSK	J
n  U" 5       $ )z>
Get the appropriate log exporter based on the configuration.
ztOpenTelemetry Logger, initializing log exporter 
self.OTEL_EXPORTER: %s
self.OTEL_ENDPOINT: %s
self.OTEL_HEADERS: %slogsz4OpenTelemetry: Log endpoint normalized from %s to %srB  zDOpenTelemetry: Using custom log exporter. Value of OTEL_EXPORTER: %sr:   r   )ConsoleLogExporterzEOpenTelemetry: Using console log exporter. Value of OTEL_EXPORTER: %srC  rD  rE  )OTLPLogExporterzPOpenTelemetry: Using HTTP log exporter. Value of OTEL_EXPORTER: %s, endpoint: %srG  rH  rI  zPOpenTelemetry: Using gRPC log exporter. Value of OTEL_EXPORTER: %s, endpoint: %sziOpenTelemetry: Unknown log exporter '%s', defaulting to console. Supported: console, otlp_http, otlp_grpc)r   r   rC   rE   rG   r]   r   r   rM  r   rT  4opentelemetry.exporter.otlp.proto.http._log_exporterrU  4opentelemetry.exporter.otlp.proto.grpc._log_exporterr   )rs   rP  r   rT  rU  s        r4   r   OpenTelemetry._get_log_exporter  s    	 F		
 ,CCDDUDUV #;;D<N<NPVWB	
 4%%x00  V"" %%%*I  W"" &''+-!!_4!![0   b""#
 #,  ;.$2D2D2N   b""#
 #,  ""{"" J%''r6   r<   signal_typec                    U(       d  U$ 1 SknX#;  a  [         R                  " SUU5        U$ UR                  S5      nSU 3nUR                  U5      (       a  U$ X21-
  nU H=  nSU 3nUR                  U5      (       d  M   UR	                  SS5      S   SU 3-   nUs  $    UR                  S5      (       d  X-   nU$ USU 3-   nU$ )a2  
Normalize the endpoint URL for a specific OpenTelemetry signal type.

The OTLP exporters expect endpoints to use signal-specific paths:
- traces: /v1/traces
- metrics: /v1/metrics
- logs: /v1/logs

This method ensures the endpoint has the correct path for the given signal type.

Args:
    endpoint: The endpoint URL to normalize
    signal_type: The telemetry signal type ('traces', 'metrics', or 'logs')

Returns:
    Normalized endpoint URL with the correct signal path

Examples:
    _normalize_otel_endpoint("http://collector:4318/v1/traces", "logs")
    -> "http://collector:4318/v1/logs"

    _normalize_otel_endpoint("http://collector:4318", "traces")
    -> "http://collector:4318/v1/traces"

    _normalize_otel_endpoint("http://collector:4318/v1/logs", "metrics")
    -> "http://collector:4318/v1/metrics"
>   rS  rF  r   znInvalid signal_type '%s' provided to _normalize_otel_endpoint. Valid values: %s. Returning endpoint unchanged./z/v1/   r   z/v1)r   r   rstripendswithrsplit)rs   r<   rY  valid_signalstarget_pathother_signalsother_signal
other_paths           r4   r   &OpenTelemetry._normalize_otel_endpoint+  s   < O 6+""B	 O ??3' [M*[))O &5)L~.J  ,,#??3215!K=8II	 *   ''-H   Ak]"33Hr6   r=   c                     0 nU (       a`  [        U [        5      (       a4  U R                  S5      nU H  nUR                  SS5      u  pEXQU'   M     U$ [        U [        5      (       a  U nU$ )zI
Convert a string or dictionary of headers into a dictionary of headers.
,=r\  )r~   rW   splitr  )r=   rP  partspartr   r   s         r4   r   %OpenTelemetry._get_headers_dictionaryo  sq    
 /1'3''  c*!D!%C!3JC/4, "
 #" GT**&-#""r6   logging_payloadc                   #    SSK Jn  SSKJnJn  SnSnUR
                  nUR                  n	[        U[        5      (       a  [        US-  5      nOU R                  U5      n[        U	[        5      (       a  [        U	S-  5      nOU R                  U	5      nUb  UR                  n
U R                  R                  U
UR                  U5      US9nUR                  nUb-  UR!                  5        H  u  pU R#                  USU 3US9  M     UR$                  nUb-  UR!                  5        H  u  pU R#                  USU 3US9  M     UR'                  U" UR(                  5      5        UR+                  US	9  g g 7f)
Nr   r   r   r   r   request.r   z	response.r   )r   r   r   r   r   r   r   r~   r   r   r   router   r   r   r  r  r  responser  r  r  )rs   rm  r   r   r   r   r  r  r   r   r	  management_endpoint_span_request_datar   r   	_responses                   r4   &async_management_endpoint_success_hook4OpenTelemetry.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   E8E:c                   #    SSK Jn  SSKJnJn  SnSnUR
                  nUR                  n	[        U[        5      (       a  [        [        U5      S-  5      nOU R                  U5      n[        U	[        5      (       a  [        [        U	5      S-  5      nOU R                  U	5      nUb  UR                  n
U R                  R                  U
UR                  U5      US9nUR                  nUb-  UR!                  5        H  u  pU R#                  USU 3US9  M     UR$                  nU R#                  US['        U5      S9  UR)                  U" UR*                  5      5        UR-                  US	9  g g 7f)
Nr   r   r   r   r   ro  r   r  r   )r   r   r   r   r   r   r   r~   r   r   r   rp  r   r   r   r  r  r  r  rW   r  r  r  )rs   rm  r   r   r   r   r  r  r   r   r	  rr  rs  r   r   
_exceptions                   r4   &async_management_endpoint_failure_hook4OpenTelemetry.async_management_endpoint_failure_hook  sr    
 	(:$//
"++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   E4E6c                     U R                   R                  SU R                  U5      U R                  US9U R                  R
                  S9$ )z6
Create a span for the received proxy server request.
zReceived Proxy Server RequestrA  )r   r   r   kind)r   r   r   r-  r   SERVER)rs   r   r=   s      r4   )create_litellm_proxy_request_started_span7OpenTelemetry.create_litellm_proxy_request_started_span  sM     {{%%0{{:.44W4E&&	 & 
 	
r6   )
rE   rC   rG   r   r   r   r`   r_   r   r   )NNNNN)NNNN)r  NNNNr}   )FrS   rT   rU   rV   r	   r8   rW   r   ro   rr   rh   rp   rq   r   r   r   r   r   r   r
   r   r   r  r  r  r   r   r  r   r"  r  r  r   r'  r   r1  r2  r4  r5  r   r3  r   r  r  rY   r   r  staticmethodr   r   r   r  r<  r  r  rF  r   r;  r-  r0  r   r   r   r   r   ru  ry  r~  r[   __classcell__)rw   s   @r4   r]   r]      s    15'+)-)-(,%2,-%2  }%2
 "#%2 "#%2 !%2 %2N=,."`8
t-,III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	$"B854=G~H)d H)TFHtnFH/7/@FHPG>Od OD Ob" "HU3c5;P5Q " 67	c3h *qq08qfeCsE<Q6R "1t 1# 1c 12t 2h))"3jJ=8D> J=XK(ZB B47B	#BH #%T	2B)C #SRUX # #( ,03@93@ #4.3@p ,00@90@ #4.0@d

 
 
$	
 
r6   r]   )4r*   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   r   rL  r   _SpanExporterr   r   _Contextr   _Spanr   _Tracerr  r   !_ManagementEndpointLoggingPayloadlitellm.proxy.proxy_serverr   _UserAPIKeyAuthr+   r   r   r   rE  r!  r5   r8   r]   rR   r6   r4   <module>r     s5   	 !  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ii 2I> YY3Y? ii 5yA , - @ ,
 ,
 ,
^o
L o
r6   