bgu<dZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddl mZddlmZddlmZejd krddlZnddlZ dd lmZn#e$r dd lmZYnwxYwddlZdd lmZdd lmZdd l m!Z!m"Z"ddl#m$Z$m%Z%m&Z&m'Z'ddl(m)Z)m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0m1Z1ddl2m3Z3ddl4m5Z5m6Z6ddl7ZdZ8da9dZ:dej;dZZ?dZ@GddeAZBGddeCZDGddeCZEGd d!eEZFdS)"z raven.base ~~~~~~~~~~ :copyright: (c) 2010-2012 by the Sentry Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. )absolute_importN)datetimeisclass)Random) FunctionType)local)) get_ident)defaults) RemoteConfig)APIError RateLimited)json get_versionsget_auth_header merge_dicts) text_type iteritems) to_unicode) transform)get_stack_infoiter_stack_frames)TransactionStack)TransportRegistrydefault_transports)Clientpythonz raven-python)nameversionc8ttjddS)N raven_client)getattrsys excepthookA/opt/cloudlinux/venv/lib64/python3.11/site-packages/raven/base.pyget_excepthook_clientr*Es 3>>4 8 88r(ceZdZdZdS)ModuleProxyCachec|dd\}}tt|ii|g|}|||<|S)N.)rsplitr$ __import__)selfkeymodule class_namehandlers r) __missing__zModuleProxyCache.__missing__JsS ZZQ// * BZL**+577S r(N)__name__ __module__ __qualname__r7r'r(r)r,r,Is#r(r,c6eZdZdZdZdZdZd dZdZdZ dS) ClientStater/rcH|j|_d|_d|_d|_dSNrONLINEstatus last_check retry_number retry_afterr2s r)__init__zClientState.__init__Y(k r(c|j|jkrdS|jpt|jddz}t j|jz |krdSdS)NTr F)rAr@rDminrCtimerB)r2intervals r) should_tryzClientState.should_try_sW ;$+ % %4#Es4+r?rEs r) set_successzClientState.set_successprGr(c"|j|jkSN)rArOrEs r)did_failzClientState.did_failvs{dj((r(N)r) r8r9r:r@rOrFrMrPrRrUr'r(r)r<r<Usn F E   ''''  )))))r(r<ceZdZdZejdZdZee Z d4dZ d Z d5d Z d Zd Zd ZedZdZdZdZdZd6dZdZdZdZ d7dZdZedZdZdZ dZ!dZ" d8dZ#dZ$d Z%d!Z&d"Z'd#Z(d6d$Z)d6d%Z*d6d&Z+d'Z,d(Z-d)Z.d*Z/d6d+Z0d,Z1d6d-Z2d9d/Z3d0Z4d1Z5e5Z6ed2Z7e7j8d3Z7dS):raU The base Raven client. Will read default configuration from the environment variable ``SENTRY_DSN`` if available. >>> from raven import Client >>> # Read configuration from ``os.environ['SENTRY_DSN']`` >>> client = Client() >>> # Specify a DSN explicitly >>> client = Client(dsn='https://public_key:secret_key@sentry.local/project_id') >>> # Record an exception >>> try: >>> 1/0 >>> except ZeroDivisionError: >>> ident = client.get_ident(client.captureException()) >>> print "Exception caught; reference is %s" % ident raven6) transportsNFTc   | } t|_||_|j} t |_t j| jd| j |_ t jd|_ t jd|_ i|_ |||t| dpg|_t| dpg|_t'| dp?t(jdp | dp t,j|_t3| d p t,j|_t3| d t,j|_t=| d p t,j|_ t=| d p t,j!|_"| d |_#| dd|_$| d|_%| d|_&|j%t,j'|_%| d} | dtQtRdgddi} | |_*| dpi|_+| dpt(jdd|_,| dp=t(jdpt(jd|_-|.| d|_/| d| dnd|_0tc|_2t| dpd|_3ti|_5tm||_7|8s|j 9d tt|a:tw|_<||_=d!d"l>m?} | ||_@|r|A|r|B|C|dS)#Nr.z sentry.errorszsentry.errors.uncaught include_paths exclude_pathsr SENTRY_NAMEmachineauto_log_stackscapture_localsstring_max_lengthlist_max_lengthsiteinclude_versionsT processors sanitize_keyscontextzsys.argvargvtags environmentSENTRY_ENVIRONMENTreleaseSENTRY_RELEASEHEROKU_SLUG_COMMITrepos sample_rater/ignore_exceptionsr'zaRaven is not configured (logging is disabled). Please see the documentation for more information.r)Context)Dr _local_stateraise_send_errors __class__r<statelogging getLoggerr9r8logger error_loggeruncaught_logger_transport_cacheset_dsnsetgetr[r\rosenvironr NAMEr boolAUTO_LOG_STACKSr_CAPTURE_LOCALSr`intMAX_LENGTH_STRINGraMAX_LENGTH_LISTrbrcrdrerf PROCESSORSr$r%extrarirjrl _format_reposrorpr transactionrqr, module_cacher_random is_enabledinfoRavenget_thread_identmain_thread_idenable_breadcrumbs raven.contextrr_contextinstall_sys_hookinstall_logging_hookhook_libraries)r2dsnrt transportrrrr _random_seedoptionsoclsrgrrs r)rFzClient.__init__sf !GG!2n ]] '~~~s|| 466 #-o>>&01IJJ " S)$$$ !7!7!=2>> !7!7!=2>> EE&MM 1RZ^^M:: 1uuY 1#+=    $ EE# $ $ @(@  # EE"H$; < <>>!$ EE% & & D(*D"F"F" EE# $ $ @(@ B BEE&MM !&8$ ? ?%% --UU?33 ? "&1DO%% "" ?!73#;#;AAA#>?G EE&MM'R EE- NBJNN3G$N$N  EE)   4 /? @ @ 4z~~233 ''g77 uu]##/ EE-   ,--!$QUU+>%?%?%E2!F!F,..l++    8 K  7 8 8 8 =E/00"4))))))   $  ! ! # # #  (  % % ' ' ' N+++++r(ci}|rWt|D]G\}}|ddkr1tjt |j}|||<H|S)Nr/)rrpathabspathr1__file__)r2valueresultrconfigs r)rzClient._format_reposse  & )% 0 0 & & f7c>>7??:d+;+;+DEED%t  r(c|sMtjdr.d}|j|tjd}||jvrA|st |}nt j|||j}||j|<||_ n|j||_ |jd |j dS)N SENTRY_DSNz8Configuring Raven from environment variable 'SENTRY_DSN')r)rtransport_registryzConfiguring Raven for host: {0}) rrrrydebugr|r from_string _registryremoteformat)r2rrmsgrs r)r}zClient.set_dsns +rz~~l33 +LC K  c " " "*\*C d+ + + % :::%1''+~ *0D !# & DKK/4DK ;BB4;OOPPPPPr(c^t tjafd}|_|t_dS)NcH|dt|dS)Nfatal)exc_infolevel)captureException__excepthook__)rr2s r)handle_exceptionz1Client.install_sys_hook..handle_exceptions-  ! !87 ! C C C H % % % %r()rr%r&r#)r2rs` r)rzClient.install_sys_hooksA  ! ^N & & & & &)-%)r(c&ddlm}|dS)Nr)r)raven.breadcrumbsr)r2rs r)rzClient.install_logging_hooks)::::::r(c(ddlm}||dS)Nr)r)rr)r2 librariesrs r)rzClient.hook_libraries"s*444444y!!!!!r(c<|j||dSrT)rregister_scheme)rschemetransport_classs r)rzClient.register_scheme&s  %%fo>>>>>r(c#NK|jD]}|j||VdSrT)rer)r2 processors r)get_processorszClient.get_processors*sB 5 5I.$#I.t44 4 4 4 4 5 5r(c|jsiStj}t|j}d|d|d|d|d<|S)Nz {0}.{1}.{2}rr/r r)rdr% version_inforr[r)r2rmoduless r)get_module_versionszClient.get_module_versions.s^$ I' t122)00 O\!_l1o  r(c:tjdt|S)z Returns a searchable string representing a message. >>> result = client.capture(**kwargs) >>> ident = client.get_ident(result) zVClient.get_ident is deprecated. The event ID is now returned as the result of capture.)warningswarnDeprecationWarning)r2rs r)r zClient.get_ident;s'  ;( * * * r(c.|j||SrT)r)r2r s r) get_handlerzClient.get_handlerGs&t &t,,,r(cv|r$|j}|r|d|S|SdS)z Returns a public DSN which is consumable by raven-js >>> # Return scheme-less DSN >>> print client.get_public_dsn() >>> # Specify a scheme to use (http or https) >>> print client.get_public_dsn('https') :N)rrget_public_dsn)r2rurls r)rzClient.get_public_dsnJsQ ??   +,,..C /"(&&##..J   r(cdx}} t|do|djj}|dr |djpd}n#tt f$rYnwxYw|dt|d|t|d|fS)Nrr r/)idtb_framef_codetb_lastiAttributeError IndexError)r2rcode_idlast_ids r)_get_exception_keyzClient._get_exception_key[s' !D!)=)DEEGqk:hqk&:?aGG +    D  QK x{OO  x{OO    s>AAAcH||}||jjvSrT)rrgexceptions_to_skipr2rr3s r)skip_error_for_loggingzClient.skip_error_for_loggingls%%%h//dl555r(cn||}|jj|dSrT)rrgraddrs r)record_exception_seenzClient.record_exception_seenps4%%h// '++C00000r(c  . tjj} t|jj|}|di|did|vrd|z}||} | jd#i| } | dd}| dr|d}t| D]\}}||vr|||<| d|vr|j }|rLd|vrH|d urt}n|}t||j|j }|d|i|jr||D]}| d | d s0d rd|d <Kt+fd|jDo t+fd|jD |d <d}|s|j}| ds$| dp t2j|d<| ds |j|d<| ds||d<|j |j|d<|j |j|d<t|j|d||d<t|j |d||d<| ddp|j!}|r|dd||r||d<n|r||d<| r| |d<|"D]*}||#|+d|vr,| d| $||d<t|dD]\}}tK||d|<t|dD]#\}}|||d|<$|d|j&j'|d|ptQj)|d||d| |dtT|dtV|d |j,|j-r8|jj./}|r|d!d"|i|S)$z Captures, processes and serializes an event into a dict object The result of ``build_msg`` should be a standardized dict, with all default values available. rirr.zraven.events.%sculpritN exception stacktraceT) transformerr`in_appr4zraven.Fc3BK|]}|VdSrT startswith.0xrs r) z#Client.build_msg..s/KK1DOOA..KKKKKKr(c3BK|]}|VdSrTrrs r)rz#Client.build_msg..s/#S#S1DOOA$6$6#S#S#S#S#S#Sr(r server_namerrlrjrcr fingerprintmessageproject timestamp time_spentevent_idplatformsdkro breadcrumbsvaluesr')0uuiduuid4hexrrgdata setdefaultrcapturepoprrr_rrrr`updater[ _iter_framesranyr\rpeekrwrOr rrlrjrirrcrprocess to_stringrrrrutcnow PLATFORM_NAME SDK_VALUErorr get_buffer)r2 event_typerdaterrstack public_keyrirkwargsrr6rrkvframes stack_infoframerrcrr3rcrumbsrs @r) build_msgzClient.build_msgts:<<#4<,d33 ### $$$ j *Z7J"":.. **6****Y-- 88I   &9oGf%%  DAq}}Q =[44(E  \--}}*,,' N#2J KKj      **400  99X&&2yy**??8,,&+E(OOKKKK8JKKKKKT ##S#S#S#S@R#S#S#S S SS(OO   2*//11Kxx   A"JJw//@7=DMxx && ,"&)D xx "" 9"6688DO < #"lDO   '"&"2D "49d6lDAAV #DJW uEEW xx%%2  2 L # #FD 1 1 1  &"-D    &%DO  ."-D ,,.. 1 1I KK ))$// 0 0 0 0 D $jjG4E4Ed4K4KLLDO$DL11 2 2JC *5 1 1DL  d7m,, 1 1DAq#~~a00DM!    4;#6777  T%>X_->->???  j111  H---  M222 y))) ,,,  " \-88::F   f0 r(c:t||j|jS)N)rbra)rrbrar2rs r)rzClient.transforms' $"6"4666 6r(c|jS)aT Updates this clients thread-local context for future events. >>> def view_handler(view_func, *args, **kwargs): >>> client.context.merge(tags={'key': 'value'}) >>> try: >>> return view_func(*args, **kwargs) >>> finally: >>> client.context.clear() )rrEs r)rgzClient.context s }r(c:|jd|iS)z{ Update the user context for future events. >>> client.user_context({'email': 'foo@example.com'}) userrgmergers r) user_contextzClient.user_contexts( |!! D#    r(c :|jd|iS)z| Update the http context for future events. >>> client.http_context({'url': 'http://example.com'}) requestrr2rrs r) http_contextzClient.http_context"s( |!! t#    r(c :|jd|iS)zo Update the extra context for future events. >>> client.extra_context({'foo': 'bar'}) rrr#s r) extra_contextzClient.extra_context,s( |!! T#    r(c :|jd|iS)zr Update the tags context for future events. >>> client.tags_context({'version': '1.0'}) rirr#s r) tags_contextzClient.tags_context6s(|!! D#    r(c  |sdS| d} | w|| rdS|| s6|jd| dt jdS|| |j ||||||fd|i| }||j }|j |kr |j di||d|j_|dS) a Captures and processes an event and pipes it off to SentryClient.send. To use structured data (interfaces) with capture: >>> capture('raven.events.Message', message='foo', data={ >>> 'request': { >>> 'url': '...', >>> 'data': {}, >>> 'query_string': '...', >>> 'method': 'POST', >>> }, >>> 'logger': 'logger.name', >>> }, extra={ >>> 'key': 'value', >>> }) The finalized ``data`` structure contains the following (some optional) builtin values: >>> { >>> # the culprit and version information >>> 'culprit': 'full.module.name', # or /arbitrary/path >>> >>> # all detectable installed modules >>> 'modules': { >>> 'full.module.name': 'version string', >>> }, >>> >>> # arbitrary data provided by user >>> 'extra': { >>> 'key': 'value', >>> } >>> } :param event_type: the module path to the Event class. Builtins can use shorthand class notation and exclude the full module path. :param data: the data base, useful for specifying structured data interfaces. Any key which contains a '.' will be assumed to be a data interface. :param date: the datetime of this event :param time_spent: a integer value representing the duration of the event (in milliseconds) :param extra: a dictionary of additional standard metadata :param stack: a stacktrace for the event :param tags: dict of extra tags :param sample_rate: a float in the range [0, 1] to sample this message :return: a 32-length string identifying this event Nrz*Not capturing exception due to filters: %sr)rrirr')rrrshould_captureryrr%rrrrprrandomsendrs last_event_id) r2r rrrrrrirprrs r)rzClient.captureAsAj    F::j))  **844 ((22    @(1+ \^^!---  & &x 0 0 0t~ dJuCG  *K <   ; . . DI     *.z*:'Jr(c4|jS)zg Return a boolean describing whether the client should attempt to send events. )r is_activerEs r)rzClient.is_enableds {$$&&&r(c#Kd|vr|ddD]}|Vd|vr5|dddddgD]}|VdSdS)Nrrrr)r)r2rrs r)rzClient._iter_framess 4  l+H5   $  k*84R8FJJ8UWXX       r(c8|jdSrT)rvrRrEs r)_successful_sendzClient._successful_sends      r(cvd}t|trPt|tr|j}|jdt |j|jn!|jd||dd|i| ||j |dS)Nrz*Sentry responded with an API error: %s(%s)z,Sentry responded with an error: %s (url: %s)Tr)rr)rD) isinstancerrrDrzerrortyper8r_log_failed_submissionrvrP)r2excrrrDs r) _failed_sendzClient._failed_sends c8 $ $ #{++ .!o   # #<S "CK 1 1 1 1   # #>Stn $    ##D)))  44444r(c |dd}|g}d|vrd|dddvr|dddddgD]Z}|d|d d |d d|d d dz[|j|dS)zj Log a reasonable representation of an event that should have been sent to Sentry rzrrrr1rz- File "%(fn)s", line %(lineno)s, in %(func)sfilenameunknown_filenamelinenofunctionunknown_function)fnr>funcN)rrappendr{r6)r2rroutputrs r)r8zClient._log_failed_submissions ((9&:;; $  <4 3DX3Nr3R#R#Rk*84R8FJJ8UWXX   M))J0BCC#ii"55!IIj2DEEQQ ""6*****r(c:|i}jsEjs,dSjdtfd} j }|j r | |j |dS| | dS#t$r}jr||Yd}~dSd}~wwxYw)Nz"Sending message of length %d to %sc\|dSrT)r:decode)err2rs r) failed_sendz'Client.send_remote..failed_sends-   adkk$&7&7 8 8 8 8 8r()rtrvrMrGr8ryrlenr get_transportis_async async_sendr3r, Exception)r2rrheadersrIrrHs``` r) send_remotezClient.send_remotesh ?G% dj.C.C.E.E ;;t$$D  ' ' - - - F >D 3OOO 9 9 9 9 9 9 9  1133I! ($$S$9N%022222sD'222%%'''''   %  KNNNNNNNNN s>C2+C22 D<DDc Z||}|||S)zV Serializes the message and passes the payload onto ``send_encoded``. ) auth_header)encode send_encoded)r2rRrrs r)r,z Client.sends.++d##  k BBBr(c dtj}|s@tj}t|j|||jj|jj}|||dd}|j d|jj ||d|S)z Given an already serialized message, signs the message and passes the payload off to ``send_remote``. z raven-python/)protocolrclientapi_key api_secretzapplication/octet-stream)z User-Agentz X-Sentry-AuthzContent-Encodingz Content-Type)rrrOr') rWVERSIONrKrprotocol_versionrr secret_keyget_content_encodingrPstore_endpoint)r2rrRr client_stringrrOs r)rTzClient.send_encodeds .3]]<   I).#$ .;1 K(( $ 9 9 ; ;6    t  *      r(cdS)Ndeflater'rEs r)r]zClient.get_content_encodingsyr(cttjtj|dS)z8 Serializes ``data`` into a raw string. utf8)zlibcompressrdumpsrSrs r)rSz Client.encodes,}TZ--44V<<===r(cttjtj|dS)z2 Unserializes a string, ``data``. rc)rloadsrd decompressrGrs r)rGz Client.decodes,z$/$//66v>>???r(c |jdd|i|S)zr Creates an event from ``message``. >>> client.captureMessage('My event just happened!') raven.events.Messager)rkr)r2rrs r)captureMessagezClient.captureMessages! t|NNGNvNNNr(c T||durtj}|j dd|i|S)a Creates an event from an exception. >>> try: >>> exc_info = sys.exc_info() >>> client.captureException(exc_info) >>> finally: >>> del exc_info If exc_info is not provided, or is set to True, then this method will perform the ``exc_info = sys.exc_info()`` and the requisite clean-up for you. ``kwargs`` are passed through to ``.capture``. NTraven.events.Exceptionr)ro)r%rr)r2rrs r)rzClient.captureException&sS  x4//|~~Ht| $CC/7C;ACC Cr(c$|djdj|j}d|D}d|D}d|D}|vsCj|vs:|vs6tfd|Dstfd|DrdSd S) Nrr.c3DK|]}t|t|VdSrT)r5 basestringrrHs r)rz(Client.should_capture..@s1PP1jJ6O6OPQPPPPPPr(c3DK|]}|d|VdS)*N)endswithrss r)rz(Client.should_capture..As1OOQqzz#OqOOOOOOr(c38K|]}t||VdSrTrrss r)rz(Client.should_capture..Bs-@@!WQZZ@A@@@@@@r(c38K|]}t|VdSrT) issubclass)rrHexc_types r)rz(Client.should_capture..Gs-II1z(A..IIIIIIr(c3RK|]!}|ddV"dS)Nr1r)rrHexc_names r)rz(Client.should_capture..Hs9PPqx**1SbS622PPPPPPr(FT)r9r8rqr)r2r exclusionsstring_exclusionswildcard_exclusionsclass_exclusionsr|rzs @@r)r*zClient.should_capture<sA;&11183D3DE+ PP PPPOO*;OOO@@z@@@  " "$ 22z))IIII8HIIIII*PPPP>> @client.capture_exceptions >>> def foo(): >>> raise Exception() >>> with client.capture_exceptions(): >>> raise Exception() You can also specify exceptions to be caught specifically >>> @client.capture_exceptions((IOError, LookupError)) >>> def bar(): >>> ... >>> with client.capture_exceptions((IOError, LookupError)): >>> ... ``kwargs`` are passed through to ``.captureException``. Nc3DK dVdS#|$rjdiwxYw)Nr')r) exceptionsrr2s r)make_decoratorz1Client.capture_exceptions..make_decoratornsP    %%///// s )rNr5r contextlibcontextmanager)r2function_or_exceptionsrr?rr decorators` ` r)capture_exceptionszClient.capture_exceptionsLs4\ ,l ; ; 0-HH # //J  "      # " #N:..  '9X&& &r(r'c &|j d|||d|S)zi Creates an event for a SQL query. >>> client.captureQuery('SELECT * FROM foo') raven.events.Query)queryparamsengine)rrl)r2rrrrs r) captureQueryzClient.captureQuery|s6 t| (-fV r(c Ptjdt|jdi|S)Nz8captureExceptions is deprecated, used context() instead.r')rrrrgr2rs r)captureExceptionszClient.captureExceptionss6 F    t|%%f%%%r(c4|jjj|i|dS)zp Records a breadcrumb with the current context. They will be sent with the next event. N)rgrrecord)r2argsrs r)captureBreadcrumbzClient.captureBreadcrumbs' (  '888888r(c.t|jddS)Nr-)r$rsrEs r)r-zClient.last_event_idst(/4@@@r(c||j_dSrT)rsr-)r2rs r)r-zClient.last_event_ids*/'''r()NFNTTNTN)NNrT)NNNNNNNN)NNNNNNN)r'N)9r8r9r:__doc__rwrxryr[rrrrFrr}rrr classmethodrrrr rrrrrrrpropertyrgr r$r&r(rrrr3r:r8rPr,rTr]rSrGrmrr*rrrrcapture_breadcrumbr-setterr'r(r)rrzs,W w ' 'F!!-?@@@IDH=A9="Z,Z,Z,Z,xQQQQ, * * *"""??[?555      ---"   "66611159FJ)-OOOOb666   X              DH?CP P P P d'''!!!555&+++$<CCCC    >>>> @@@ OOOCCCC, ....`&&& 999+ AAXA00000r(rceZdZdZdZdS) DummyClientz"Sends messages into an empty void.c dSrTr'rs r)r,zDummyClient.sendstr(N)r8r9r:rr,r'r(r)rrs),,r(r)Gr __future__rrdrwrr%rKrrrinspectrr+rtypesr threadingr rr contextlib2threadr r ImportError_threadrW raven.confr raven.conf.remoterraven.exceptionsrr raven.utilsrrrrraven.utils.compatrrraven.utils.encodingrraven.utils.serializerrraven.utils.stacksrrraven.utils.transactionrraven.transport.registryrr raven.events__all__rr rZr rstrrrr*dictr,objectr<rrr'r(r)rs5'&&&&&  v$$$$64444444666555555556 ******22222222HHHHHHHHHHHH33333333++++++,,,,,,@@@@@@@@444444JJJJJJJJ   }   vJ999     t   ")")")")")&")")")Jd 0d 0d 0d 0d 0Vd 0d 0d 0N&sA A-,A-