
    g@                       d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	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mZm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" d dl%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ erd dlm,Z,  e,d      Z-	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d$dZ. G d d      Z/ G d de e/      Z0 G d de"e/      Z1d%dZ2	 	 	 	 	 	 	 	 d&dZ3	 	 	 	 	 	 	 	 	 	 d'dZ4	 	 	 	 	 	 	 	 	 	 d(dZ5	 	 	 	 	 	 	 	 	 	 d)dZ6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d*dZ7d+dZ8d+dZ9	 	 	 	 	 	 	 	 d,d Z:ejv                  jx                  ejv                  jz                  ej|                  jx                  ej|                  jz                  fD  cg c]  } ej                  |       j                   c} ZAe
d-d!       ZBd.d"ZCe
d/d#       ZDy# e#$ r	  e$d      w xY wc c} w )0    )annotationsN)ContentTypeHeader)EmailPolicy)cached_property	lru_cache)TYPE_CHECKINGAny	AwaitableCallableLiteralMappingcast)NonRecordingSpanSpanuse_span)warn_at_user_stacklevel)HTTPXClientInstrumentor)AsyncRequestHookAsyncResponseHookRequestHookRequestInfoResponseHookResponseInfoz`logfire.instrument_httpx()` requires the `opentelemetry-instrumentation-httpx` package.
You can install this with:
    pip install 'logfire[httpx]')LogfireLogfireSpan)set_user_attributes_on_raw_span)handle_internal_errors)	ParamSpecPc
                   |r|s|s|rt        dt               |
j                  d      }|
j                  d      }|t        dt               |t        dt               |xs |xs |}|xs |xs |}|xs |}|xs |}| j                  j                         | j                  j                         d|
}~
t               }| j                  d	      } |mt        d
|      }t        d|      }t        |||      |d<   t        ||||       |d<   t        |||      |d<   t        |	|||       |d<    |j                  di | yt        |t         j"                        rt        |||      }t        ||||       }n3t        d
|      }t        d|      }t        |||      }t        ||||       }|d   }|j%                  ||||       y)zInstrument the `httpx` module so that spans are automatically created for each request.

    See the `Logfire.instrument_httpx` method for details.
    zQYou should use either `capture_all` or the specific capture parameters, not both.capture_request_headerscapture_response_headersNzUThe `capture_request_headers` parameter is deprecated. Use `capture_headers` instead.zVThe `capture_response_headers` parameter is deprecated. Use `capture_headers` instead.)tracer_providermeter_providerhttpx)custom_scope_suffixRequestHook | NoneResponseHook | Nonerequest_hookresponse_hookasync_request_hookasync_response_hookr#    )r   UserWarninggetDeprecationWarningconfigget_tracer_providerget_meter_providerr   with_settingsr   make_request_hookmake_response_hookmake_async_request_hookmake_async_response_hook
instrument
isinstancer%   AsyncClientinstrument_client)logfire_instanceclientcapture_allcapture_headerscapture_request_bodycapture_response_bodyr)   r*   r+   r,   kwargsr!   r"   should_capture_request_headersshould_capture_response_headersshould_capture_request_bodyshould_capture_response_bodyfinal_kwargsinstrumentorr#   s                       Y/var/www/openai/venv/lib/python3.12/site-packages/logfire/_internal/integrations/httpx.pyinstrument_httpxrK   ,   s=   " +?CX_al	
 %jj)BC%zz*DE*cew	
  +dfx	
 &=%^%^S^"&>&`/&`U`#"6"E+#8#GK  ,22FFH*11DDF$ $L
 	*,L'55'5R~0,?2MB'88:N(
^$ );+(	)
_% .E >@[.
)* /G+(	/
*+ 	 /,/fe//02.+L
 5/, 	M   4lCL !6FM,\;Y[vwL./, 	M ''89&&vm\    c                  <    e Zd ZU ded<   edd       Zedd       Zy)LogfireHttpxInfoMixinhttpx.Headersheadersc                ,    t        | j                        S N)content_type_header_from_stringcontent_type_header_stringselfs    rJ   content_type_header_objectz0LogfireHttpxInfoMixin.content_type_header_object   s    .t/N/NOOrL   c                :    | j                   j                  dd      S )Ncontent-type )rP   r/   rU   s    rJ   rT   z0LogfireHttpxInfoMixin.content_type_header_string   s    ||33rL   N)returnr   )r[   str)__name__
__module____qualname____annotations__propertyrW   rT   r-   rL   rJ   rN   rN      s0    P P 4 4rL   rN   c                      e Zd ZU ded<   d Zd ZdddZdddZddZe	d        Z
e	d	        Ze	dd
       Zedd       ZddZy)LogfireHttpxRequestInfor   spanc                F    t        | j                  | j                  d       y )Nrequest#capture_request_or_response_headersrd   rP   rU   s    rJ   r@   z'LogfireHttpxRequestInfo.capture_headers   s    +DIIt||YOrL   c                J    | j                         }|s| j                          y y rR   )capture_body_if_formcapture_body_if_text)rV   captured_forms     rJ   capture_bodyz$LogfireHttpxRequestInfo.capture_body   s$    113%%' rL   c                    | j                   s:	 | j                  j                  | j                        }| j                  ||       y y # t        t
        f$ r Y y w xY w)N	attr_nametext)body_is_streamingcontentdecodecontent_type_charsetUnicodeDecodeErrorLookupErrorcapture_text_as_jsonrV   rp   rq   s      rJ   rk   z,LogfireHttpxRequestInfo.capture_body_if_text   s]    %%||**4+D+DE %%	%E & '4 s   %A AAc                    | j                   dk(  sy| j                  }|rt        |t              sy| j	                  ||i       y)Nz!application/x-www-form-urlencodedFT)rT   	form_datar:   r   set_complex_span_attributes)rV   rp   datas      rJ   rj   z,LogfireHttpxRequestInfo.capture_body_if_form   sB    ..2UU~~D'2(()T):;rL   c                b    | j                  |i i       | j                  j                  ||       y rR   )r|   rd   set_attributery   s      rJ   rx   z,LogfireHttpxRequestInfo.capture_text_as_json   s(    (()R9			40rL   c                L    t        | j                  t        j                         S rR   )r:   streamr%   
ByteStreamrU   s    rJ   rr   z)LogfireHttpxRequestInfo.body_is_streaming   s    dkk5+;+;<<<rL   c                N    | j                   j                  j                  dd      S )Ncharsetutf-8)rW   paramsr/   rU   s    rJ   ru   z,LogfireHttpxRequestInfo.content_type_charset   s!    ..5599)WMMrL   c                `    | j                   rt        d      t        | j                        d   S )Nz)Cannot read content from a streaming bodyr   )rr   
ValueErrorlistr   rU   s    rJ   rs   zLogfireHttpxRequestInfo.content   s+    !!HIIDKK ##rL   c                    t        j                         j                  j                  j                  }|r"|j                  t        v rn|j                  }|r"y |j
                  j                  d      S )Nr}   )inspectcurrentframef_backf_code!CODES_FOR_METHODS_WITH_DATA_PARAMf_localsr/   )rV   frames     rJ   r{   z!LogfireHttpxRequestInfo.form_data   s]    $$&--44;;||@@LLE 
 ~~!!&))rL   c                0    t        | j                  |       y rR   )r   rd   )rV   
attributess     rJ   r|   z3LogfireHttpxRequestInfo.set_complex_span_attributes   s    '		:>rL   N)zhttp.request.body.textrp   r\   )zhttp.request.body.form)rp   r\   r[   bool)rp   r\   rq   r\   r[   bytes)r[   zMapping[str, Any] | None)r   zdict[str, Any])r]   r^   r_   r`   r@   rm   rk   rj   rx   ra   rr   ru   rs   r   r{   r|   r-   rL   rJ   rc   rc      sy    
JP(
F1 = = N N $ $
 	* 	*?rL   rc   c                      e Zd ZU ded<   ded<   ded<   d ZdddZedd	       Zdd
ZddZ	ddZ
ej                  d        ZddZy)LogfireHttpxResponseInfor   rd   r   r=   r   is_asyncc                F    t        | j                  | j                  d       y )Nresponserg   rU   s    rJ   r@   z(LogfireHttpxResponseInfo.capture_headers   s    +DIIt||ZPrL   c                8     d fd} j                  |       y )Nc                    	 j                   j                  j                  j                   j                  xs d      }j                  | |       | j                  |       y # t        t
        f$ r Y y w xY w)Nr   ro   )r   rs   rt   encodingrv   rw   rx   r   )rd   rq   rp   rV   s     rJ   hookz;LogfireHttpxResponseInfo.capture_body_if_text.<locals>.hook   ss     }},,33DMM4J4J4UgV %%did%Ky$/	 '4 s   =A' 'A98A9)rd   r   )on_response_read)rV   rp   r   s   `` rJ   rk   z-LogfireHttpxResponseInfo.capture_body_if_text   s    		0 	d#rL   c                    t        j                         j                  j                  }|rF|j                  j	                  d      }|j                  }t        |t        j                        r|S |rFt        d      )Nr   z"Could not find the response object)	r   r   r   r   r/   r:   r%   ResponseRuntimeError)rV   r   r   s      rJ   r   z!LogfireHttpxResponseInfo.response   sb    $$&--44~~))*5HLLE(ENN3	 
 ?@@rL   c                      j                   rd fd} j                  |       y d fd} j                  |       y )Nc                   K   j                         5  j                  j                  d      5 } |         d {   } |       d d d        d d d        S 7 # 1 sw Y   xY w# 1 sw Y   S xY wwNzReading response bodyattach_original_span_contextr=   rd   )original_areadrd   rs   r   rV   s      rJ   areadz8LogfireHttpxResponseInfo.on_response_read.<locals>.aread   sf     668$:O:O:T:TUl:mqu$2$44GJ ;n8  5 ;n:m8 sC   A5A(AAAA(
A5AA%	!A((A2-A5c                    j                         5  j                  j                  d      5 } |        } |       d d d        d d d        S # 1 sw Y   xY w# 1 sw Y   S xY wr   r   )original_readrd   rs   r   rV   s      rJ   readz7LogfireHttpxResponseInfo.on_response_read.<locals>.read  sY    668$:O:O:T:TUl:mqu+oGJ ;n8  ;n:m8 s!   AAAA	AA&)r   zCallable[[], Awaitable[bytes]]r[   r   )r   zCallable[[], bytes]r[   r   )r   wrap_response_areadwrap_response_read)rV   r   r   r   s   ``  rJ   r   z)LogfireHttpxResponseInfo.on_response_read   s4    == $$U+ ##D)rL   c                    | j                   j                  t        j                        dfd       }|_        y )Nc                 `    	 j                   S # t        j                  $ r         cY S w xY wrR   rs   r%   ResponseNotRead)r   r   r   s   rJ   r   z9LogfireHttpxResponseInfo.wrap_response_read.<locals>.read  s4    +'''(( +M**+s    --r   )r   r   	functoolswraps)rV   r   r   r   r   s    ` @@rJ   r   z+LogfireHttpxResponseInfo.wrap_response_read  s9    == 		'	+ 
(	+ rL   c                    | j                   j                  t        j                        dfd       }|_        y )Nc                 z   K   	 j                   S # t        j                  $ r          d {  7  cY S w xY wwrR   r   )r   r   r   s   rJ   r   z;LogfireHttpxResponseInfo.wrap_response_aread.<locals>.aread"  s=     2'''(( 2!.11112s$   ; ;828;8;r   )r   r   r   r   )rV   r   r   r   r   s    ` @@rJ   r   z,LogfireHttpxResponseInfo.wrap_response_aread  s9    ==!		(	2 
)	2 rL   c              #     K   t        t        | j                  j                                     5  d  d d d        y # 1 sw Y   y xY wwrR   )r   r   rd   get_span_contextrU   s    rJ   r   z5LogfireHttpxResponseInfo.attach_original_span_context,  s0     &tyy'A'A'CDE FEEs   -A	=	A	AA	c               `    |j                  |i        |j                  j                  ||       y rR   )r   _span)rV   rd   rq   rp   s       rJ   rx   z-LogfireHttpxResponseInfo.capture_text_as_json1  s&    9b)

  D1rL   N)zhttp.response.body.textr   )r[   zhttpx.Response)r   zCallable[[LogfireSpan], None])r   z&Callable[[Callable[[], bytes]], bytes])r   z<Callable[[Callable[[], Awaitable[bytes]]], Awaitable[bytes]])rd   r   rq   r\   rp   r\   )r]   r^   r_   r`   r@   rk   r   r   r   r   r   
contextlibcontextmanagerr   rx   r-   rL   rJ   r   r      sa    
JNQ$ A A*(  2rL   r   c                *     ss sy d fd}|S )Nc                z    t               5  t        | |      }t        | |       d d d        y # 1 sw Y   y xY wrR   )r   capture_requestrun_hook)rd   rf   rm   r@   r   s     rJ   new_hookz#make_request_hook.<locals>.new_hook;  s1    #%%dG_lSGT4) &%%s   1:rd   r   rf   r   r[   Noner-   )r   r@   rm   r   s   ``` rJ   r5   r5   7  s    |t*
 OrL   c                *     ss sy d fd}|S )Nc                   K   t               5  t        | |      }t        | |       d {    d d d        y 7 # 1 sw Y   y xY wwrR   )r   r   run_async_hook)rd   rf   r   should_capture_bodyshould_capture_headerss     rJ   r   z)make_async_request_hook.<locals>.new_hookK  sE     #%%dG5KM`aG tW555 &%5 &%s%   A	=;=	A	=AA	r   r-   )r   r   r   r   s   ``` rJ   r7   r7   C  s    
 #&9T6
 OrL   c                .     ss sy d fd}|S )Nc           
         t               5  t        | ||d      \  }}t        | ||       d d d        y # 1 sw Y   y xY w)NFr   )r   capture_responser   )rd   rf   r   rm   r@   r   r=   s      rJ   r   z$make_response_hook.<locals>.new_hook\  sI    #% 0 !GX T4(3 &%%s	   $9Ard   r   rf   r   r   r   r[   r   r-   )r   r@   rm   r=   r   s   ```` rJ   r6   r6   S  s      |t4 4 OrL   c                .     ss sy d fd}|S )Nc           
        K   t               5  t        | ||d      \  }}t        | ||       d {    d d d        y 7 # 1 sw Y   y xY ww)NTr   )r   r   r   )rd   rf   r   r   r=   r   r   s      rJ   r   z*make_async_response_hook.<locals>.new_hooku  s^     #% 0 &#!GX !tWh??? &% @ &%s+   A'AAA	AAA
Ar   r-   )r   r   r   r=   r   s   ```` rJ   r8   r8   l  s#     #&9T@ @ OrL   c                l    t        | }| |_        |r|j                          |r|j                          |S rR   )rc   rd   r@   rm   )rd   rf   r   r   s       rJ   r   r     s8     &w/GGL!NrL   c                   t        | }| |_        t        | }| |_        ||_        ||_        |r|j                          |r|j                          ||fS rR   )rc   rd   r   r=   r   r@   rk   )rd   rf   r   r=   r@   rm   r   s          rJ   r   r     s_     &w/GGL'2HHM 0H H  "%%'HrL   c                   K   | r? | |i |}t        j                  |      r!| d {   }t        j                  |      r y y y 7 wrR   )r   isawaitable)r   argsrC   results       rJ   r   r     sG     t&v&!!&)!\F !!&)  "s   %AAAAc                    | r	 | |i | y y rR   r-   )r   r   rC   s      rJ   r   r     s    df rL   c           	         | j                  |j                         D ci c]  }d| d| |j                  |       c}       y c c}w )Nzhttp.z.header.)set_attributeskeysget_list)rd   rP   request_or_responseheader_names       rJ   rh   rh     sZ     	  '||~	
- '(>@P@PQ\@]]-	
	
s   Ac                .    t        j                  d|       S )NrY   )r   header_factory)content_types    rJ   rS   rS     s    %%nlCCrL   c                b    | j                  d      r| dd  } t        | j                  d            S )Nzx-   +)
startswithsetsplit)subtypes    rJ   content_type_subtypesr     s/    $!"+w}}S!""rL   c                h    t        |       }|j                  dk(  xr dt        |j                        v S )Napplicationjson)rS   maintyper   r   )r   headers     rJ   is_json_typer     s2    ,\:F??m+_:OPVP^P^:_0__rL   )r=   r   r>   z'httpx.Client | httpx.AsyncClient | Noner?   r   r@   r   rA   r   rB   r   r)   z%RequestHook | AsyncRequestHook | Noner*   'ResponseHook | AsyncResponseHook | Noner+   AsyncRequestHook | Noner,   AsyncResponseHook | NonerC   r	   r[   r   )r   r'   r@   r   rm   r   r[   r'   )r   z%AsyncRequestHook | RequestHook | Noner   r   r   r   r[   r   )
r   r(   r@   r   rm   r   r=   r   r[   r(   )
r   r   r   r   r   r   r=   r   r[   r   )
rd   r   rf   r   r   r   r   r   r[   rc   )rd   r   rf   r   r   r   r=   r   r@   r   rm   r   r   r   r[   z8tuple[LogfireHttpxRequestInfo, LogfireHttpxResponseInfo])r   zCallable[P, Any] | Noner   zP.argsrC   zP.kwargsr[   r   )rd   r   rP   rO   r   zLiteral['request', 'response']r[   r   )r   r\   r[   r   )r   r\   r[   zset[str])r   r\   r[   r   )E
__future__r   r   r   r   email.headerregistryr   email.policyr   r   r   typingr   r	   r
   r   r   r   r   r%   opentelemetry.tracer   r   r   logfire._internal.stack_infor   #opentelemetry.instrumentation.httpxr   logfire.integrations.httpxr   r   r   r   r   r   ImportErrorr   logfirer   r   logfire._internal.mainr   logfire._internal.utilsr   r   r   rK   rN   rc   r   r5   r7   r6   r8   r   r   r   r   rh   Clientrf   r   r;   unwrap__code__r   rS   r   r   )methods   0rJ   <module>r     s)   "    2 $ 0 R R R  @ @ @K  ) B : #Ab]b]3b] b] 	b]
 b]  b] 8b] ;b] 0b] 2b] b] 
b]J	4 	4<?k+@ <?~X2|-B X2v	
/   	 
  	
 2
1   	
 2
 ! 	
 "
  	
    >4"

&=[	 	!!  	% NN6##% ! D D# ` `G  
	+ X%s   F<  "G<G
