
    g].                       U d dl mZ d dlZd dlZd dlmZ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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mZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d
dl'm(Z( d
dl)m*Z* g dZ+dZ,de-d<   e G d d             Z.ee.ge
f   Z/ G d de      Z0e G d d             Z1 G d de      Z2 G d de2      Z3 e3       Z4 G d de2      Z5 G d d      Z6y)     )annotationsN)ABCabstractmethod)	dataclass)AnyCallableMappingSequence	TypedDictcast)BoundedAttributes)Event)SpanAttributes)Link   )ATTRIBUTES_JSON_SCHEMA_KEYATTRIBUTES_LOG_LEVEL_NAME_KEYATTRIBUTES_LOG_LEVEL_NUM_KEYATTRIBUTES_LOGGING_NAMEATTRIBUTES_MESSAGE_KEYATTRIBUTES_MESSAGE_TEMPLATE_KEY'ATTRIBUTES_PENDING_SPAN_REAL_PARENT_KEYATTRIBUTES_SAMPLE_RATE_KEYATTRIBUTES_SCRUBBED_KEYATTRIBUTES_SPAN_TYPE_KEYATTRIBUTES_TAGS_KEYNULL_ARGS_KEY$RESOURCE_ATTRIBUTES_PACKAGE_VERSIONS)STACK_INFO_KEYS)ReadableSpanDict)passwordpasswd	mysql_pwdsecretzauth(?!ors?\b)
credentialzprivate[._ -]?keyzapi[._ -]?keysessioncookiecsrfxsrfjwtssnzsocial[._ -]?securityzcredit[._ -]?cardztuple[str | int, ...]ztyping_extensions.TypeAliasJsonPathc                  4    e Zd ZU dZded<   	 ded<   	 ded<   y)	
ScrubMatchz`An object passed to a [`ScrubbingOptions.callback`][logfire.ScrubbingOptions.callback] function.r,   pathr   valuezre.Match[str]pattern_matchN)__name__
__module____qualname____doc____annotations__     P/var/www/openai/venv/lib/python3.12/site-packages/logfire/_internal/scrubbing.pyr.   r.   7   s     j
NnJU  r8   r.   c                  "    e Zd ZU ded<   ded<   y)ScrubbedNoter,   r/   strmatched_substringN)r2   r3   r4   r6   r7   r8   r9   r;   r;   K   s    
Nr8   r;   c                  0    e Zd ZU dZdZded<   	 dZded<   y)ScrubbingOptionsz%Options for redacting sensitive data.NScrubCallback | NonecallbackSequence[str] | Noneextra_patterns)r2   r3   r4   r5   rA   r6   rC   r7   r8   r9   r?   r?   P   s'    /%)H") ,0N(/r8   r?   c                     e Zd Zeeeeeee	e
eeeeeheej$                  ej&                  ej(                  ej*                  ej,                  ej.                  ej0                  ej2                  ej4                  ej6                  dej8                  ej:                  ej<                  Ze dd       Z!e dd       Z"y)BaseScrubberzdb.planc                     y Nr7   selfspans     r9   
scrub_spanzBaseScrubber.scrub_span   s    25r8   c                     y rG   r7   rI   r/   r0   s      r9   scrub_valuezBaseScrubber.scrub_value   s    Y\r8   NrJ   r    r/   r,   r0   r   returnztuple[Any, list[ScrubbedNote]])#r2   r3   r4   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   EXCEPTION_STACKTRACEEXCEPTION_TYPE
SCHEMA_URLHTTP_METHODHTTP_STATUS_CODEHTTP_SCHEMEHTTP_URLHTTP_TARGET
HTTP_ROUTEDB_STATEMENTURL_FULLURL_PATH	URL_QUERY	SAFE_KEYSr   rK   rN   r7   r8   r9   rE   rE   d   s5    	'"%$ /", 
 	++  	%%!" 	!!#$ 	""%& 	'''( 	"")* 	+, 	""-. 	!!/0 	##12 	36 	78 	9: 	  ;I@ 5 5\ \r8   rE   c                      e Zd ZddZddZy)NoopScrubberc                     y rG   r7   rH   s     r9   rK   zNoopScrubber.scrub_span   s    r8   c                
    |g fS rG   r7   rM   s      r9   rN   zNoopScrubber.scrub_value   s    byr8   NrO   rP   )r2   r3   r4   rK   rN   r7   r8   r9   ra   ra      s    r8   ra   c                  *    e Zd ZdZdddZddZd	dZy)
Scrubberz#Redacts potentially sensitive data.Nc                    g t         |xs g }t        j                  dj                  |      t        j                  t        j
                  z        | _        || _        y )N|)DEFAULT_PATTERNSrecompilejoin
IGNORECASEDOTALL_pattern	_callback)rI   patternsrA   s      r9   __init__zScrubber.__init__   sE    9%9R9

388H#5r}}ryy7PQ!r8   c                   |d   }|r|j                   dv ry t        |       }|j                  |       |j                  ru|d   }t	        d|j                  t        d            }	 t	        dt        j                  |            }i |t        t        j                  ||j                  z         i|d<   y y # t        j                  $ r g }Y Hw xY w)Ninstrumentation_scope)zlogfire.openaizlogfire.anthropic
attributesr<   z[]zlist[ScrubbedNote])nameSpanScrubberrK   scrubbedr   getr   jsonloadsJSONDecodeErrordumps)rI   rJ   scopespan_scrubberrt   already_scrubbeds         r9   rK   zScrubber.scrub_span   s    ,-UZZ#JJ$T*  &!!l+J#E:>>:QSW+XY&#'(<djjIY>Z#[ ""'4D}G]G]4])^"D "
 '' &#% &s   %B5 5CCc                X    t        |       }|j                  ||      }||j                  fS rG   )rv   scrubrw   )rI   r/   r0   r~   results        r9   rN   zScrubber.scrub_value   s/    $T*$$T51}----r8   rG   )rp   rB   rA   r@   rO   rP   )r2   r3   r4   r5   rq   rK   rN   r7   r8   r9   re   re      s    -"&.r8   re   c                  8    e Zd ZdZddZd	dZd
dZddZddZy)rv   zDoes the actual scrubbing work.

    This class is separate from Scrubber so that it can be instantiated more regularly
    and hold and mutate state about the span being scrubbed, specifically the scrubbed notes.
    c                V    |j                   | _         |j                  | _        g | _        y rG   )rn   ro   rw   )rI   parents     r9   rq   zSpanScrubber.__init__   s!    )),.r8   c                   t        | j                  d|d               |d<   t        |d         D cg c]A  \  }}t        |j                  t        | j                  ||            |j                        C c}}|d<   t        |d         D cg c]C  \  }}t        |j                  t        | j                  d|df|j                                    E c}}|d<   y c c}}w c c}}w )N)rt   rt   events)ru   rt   	timestamplinks)contextrt   )
r   r   	enumerater   ru   scrub_event_attributesr   r   r   rt   )rI   rJ   ieventlinks        r9   rK   zSpanScrubber.scrub_span   s     /$**_VZ[gVh:ij\ &d8n5	
 65  ZZ,8S8STY[\8]^// 6	
X %T']3

 44	 ,

GQP\C]_c_n_n8op 4
W	

s   AC"AC(c                   |j                   xs i }d|df}| j                  ||      }|j                  t        j                        x}r|j                  t        j
                        x}|j                  t        j
                        x}k7  rt        |t              rt        |t              rt        |t              r|j                         }|j                         }|j                  |      r%|d t        |        |z   |t        j                  <   |S | j                  |t        j                  fz   |      |t        j                  <   |S )Notel_eventsrt   )rt   r   rx   r   rR   EXCEPTION_MESSAGE
isinstancer<   rstripendswithlen)	rI   r   indexrt   r/   new_attributes
stacktraceold_messagenew_messages	            r9   r   z#SpanScrubber.scrub_event_attributes   s1   %%+
ul3D*5 %..)L)LMMJM&NN>+K+KLL[-11.2R2RSSU:s+;,;,#**,J%,,.K"";/FPQdTWXcTdSdFehsFs~BBC 	 GKjjN??AA:G~BBC r8   c                   t        |t              rz| j                  j                  |      x}r[|j	                         dt        |      fk(  r|S 	 t        j                  |      }t        j                  | j                  ||            S |S t        |t              r<t        t        d|            D cg c]  \  }}| j                  ||fz   |       c}}S t        |t               ri }t        d|      j#                         D ]  \  }}|t$        j&                  v r|||<   | j                  j                  |      x}rY| j                  t        ||fz   ||            }	t        |	t              r#t        |t              rt        |t              s|	g}	|	||<   | j                  ||fz   |      ||<    |S |S # t        j                  $ r | j                  t        |||            cY S w xY wc c}}w )a  Redacts sensitive data from `value`, recursing into nested sequences and mappings.

        `path` is a list of keys and indices leading to `value` in the span.
        Similar to the truncation code, it should use the field names in the frontend, e.g. `otel_events`.
        r   zSequence[Any]zMapping[str, Any])r   r<   rn   searchrJ   r   ry   rz   r|   r   r{   _redactr.   r
   r   r   r	   itemsrE   r_   )
rI   r/   r0   matchr   xr   kvredacteds
             r9   r   zSpanScrubber.scrub  s    eS!,,U33u3::<As5z?2 !L? JJu-E  ::djju&=>>   x(;DT/[`Ea;bc;b41aDJJtqd{A.;bccw'%'F0%8>>@1... !F1I"mm22155U5#||Jtqd{Au,MNH!(C0Z85LU_`acfUg$,: (F1I $

41$; :F1I A M' ++ H<<
4(FGGH
 ds   F6 3 G+6/G('G(c                    | j                   r| j                  |      x}|S |j                  j                  d      }| j                  j	                  t        |j                  |             d|dS )Nr   )r/   r=   z[Scrubbed due to ])ro   r1   grouprw   appendr;   r/   )rI   r   r   r=   s       r9   r   zSpanScrubber._redact$  sg    >>)>>vKM!//55a8\uzzM^_`"#4"7q99r8   N)r   re   rO   )r   r   r   int)r/   r,   r0   r   rQ   r   )r   r.   rQ   r   )	r2   r3   r4   r5   rq   rK   r   r   r   r7   r8   r9   rv   rv      s"    /

4@!F:r8   rv   )7
__future__r   ry   ri   abcr   r   dataclassesr   typingr   r   r	   r
   r   r   typing_extensionsopentelemetry.attributesr   opentelemetry.sdk.tracer   opentelemetry.semconv.tracer   opentelemetry.tracer   	constantsr   r   r   r   r   r   r   r   r   r   r   r   r   
stack_infor   utilsr    rh   r,   r6   r.   ScrubCallbackr;   r?   rE   ra   NOOP_SCRUBBERre   rv   r7   r8   r9   <module>r      s    "  	 # ! D D  6 ) 6 $    ( # & )@
% ?     *s*+9 
   &']3 ']T<  .| .Dn: n:r8   