
    6Ii?                     L   S SK r S SKrS SK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Jr  S SKJr  S SKrS SKrS SKJrJr  S SKJr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   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+r,S SK-r,S SK.J/r/  S SK0r,S SK1J2r2  S SK3J4r4  S SK5J6r6  S SK7J8r8  S SK+J9r:  S SK;J<r<  S SK=J>r>J?r?J@r@JArAJBrBJCrCJDrDJErEJFrFJGrGJHrHJIrIJJrJJKrKJLrLJMrMJNrNJOrOJPrPJQrQJRrRJSrSJTrTJUrU  S SKVJWrX  S SKVJYrYJZrZJ[r[  S SK\J]r]  S SK^J_r_J`r`  S SKaJbrb  S S KcJdrdJereJfrf  S S!KgJhrh  \" \" 5       5        \,R                  R                  R                  5         \R                  " \l5      rm\2" S"S#S$9rn\2" S%S&\oS'9rp\2" S(S)\qS'9rr\2" S*S)\qS'9rs\2" S+S,\qS'9rt\2" S-S,\qS'9ru\2" S.S,\qS'9rv\2" S/S,\qS'9rw\2" S0S,\qS'9rx\2" S1S,\qS'9ry\2" S2\`R                  R                  S$9R                  5       r} \	R                  " S35      r\GR                  GR                  rS6 r\\GR                  l        S7\4S8 jrS9 rS: r\S;\4S< j5       r\`R                  R                  4S=\`S>\4S? jjr\GR                  " \GR                  S@9  \R                  " \l5      rmSA rSB rS;\4SC jrg! \ a
    \2" S4S5S$9r Nf = f)D    N)asynccontextmanager)wraps)metadata)	AwaitableCallable)ArqRedis)find_dotenvload_dotenv)FastAPIRequest)GZipMiddleware)JSONResponse)Instrumentator)_rate_limit_exceeded_handler)RateLimitExceeded)SlowAPIMiddleware)CORSMiddlewareplugins)RawContextMiddleware)get_pool)process_watcher_task)config)dispose_session)SINGLE_TENANT_UUID)limiter)CONFIG)LoggingMiddleware)actionsaialerts	dashboarddeduplications
extractionfacetscelhealthcheck	incidentsmaintenancemappingmetricspresetprovider_images	providerspusherrulessettingsstatustagstopologywhoami	workflows)groups)permissionsrolesusers)EventSubscriber)IdentityManagerFactoryIdentityManagerTypes)TopologyProcessor)KEEP_ARQ_QUEUE_MAINTENANCE!MAINTENANCE_WINDOW_ALERT_STRATEGYREDIS)WorkflowManager	KEEP_HOSTz0.0.0.0defaultPORTi  rE   cast	SCHEDULERtrueCONSUMERKEEP_TOPOLOGY_PROCESSORfalseWATCHERKEEP_DEBUG_TASKSKEEP_DEBUG_MIDDLEWARESKEEP_USE_LIMITERMAINTENANCE_WINDOWS	AUTH_TYPEkeepKEEP_VERSIONunknownc                 &    SUS'   [        XU40 UD6$ )NFallow_redirects)original_request)selfmethodurlkwargss       2/venv/lib/python3.13/site-packages/keep/api/api.pyno_redirect_requestr_   d   s     %FD#888    background_tasksc                    #     [        U 5      n[        R                  U S3SU0S9  [        R                  " S5      I S h  vN   MD   N7f)Nz background tasks pendingpending_tasksextra   )lenloggerinfoasynciosleep)ra   events_in_queues     r^   check_pending_tasksrm   l   sX     
./89 	 	
 mmA  	s   ?A
AA
c                    #    [         R                  S5        [        5         [         R                  S5        [        (       aX   [         R                  S5        [        R
                  " 5       n U R                  5       I Sh  vN   [         R                  S5        [        (       aX   [         R                  S5        [        R
                  " 5       nUR                  5       I Sh  vN   [         R                  S5        [        (       aX   [         R                  S
5        [        R
                  " 5       nUR                  5       I Sh  vN   [         R                  S5        [        (       d  [        (       a  [        S:X  a  [         (       aj   [         R                  S5        [#        5       I Sh  vN nUR%                  S[&        S9I Sh  vN n[         R                  SUR(                  [&        S.S9  O?[*        R,                  " [.        R0                  " 5       5        [         R                  SSS0S9  [         R                  S5        g GN! [         a    [         R                  S5         GNf = f GN! [         a    [         R                  S	5         GNf = f GNV! [         a    [         R                  S5         GNaf = f GN N! [         a    [         R                  S5         Nf = f7f)z~
This runs for every worker on startup.
Read more about lifespan here: https://fastapi.tiangolo.com/advanced/events/#lifespan
zDisope existing DB connectionszStarting the serviceszStarting the schedulerNzScheduler started successfullyzFailed to start the schedulerzStarting the consumerzConsumer started successfullyzFailed to start the consumerzStarting the topology processorz'Topology processor started successfullyz&Failed to start the topology processorrecover_previous_statuszStarting the watcher processasync_process_watcher)_queue_namezEnqueued job)job_idqueuerd   z'Failed to start the maintenance windowsz
Added tasktaskzServices started successfully)rh   ri   r   rI   rB   get_instancestart	Exception	exceptionrK   r;   TOPOLOGYr>   rN   rR   r@   rA   r   enqueue_jobr?   rr   rj   create_taskr   rp   )
wf_managerevent_subscribertopology_processorredisjobs        r^   startupr   x   s[    
 KK01 
KK'( y	>KK01(557J""$$$KK89
 x		=KK/0.;;= #((***KK78 x	GKK9:!2!?!?!A$**,,,KKAB w&&+LPi+i5L:;(0
"2!--+ : .   ""%**!;    4 J J LMKKF   KK/0k % 	><=	> + 	=;<	= - 	GEF	G #3  L  !JKLs   A K/=I  I
I K/&=I6 #I3$I6 =K/	=J JJ  +K/"K
 .K/K
 
K)K
 4AK/
I I0,K//I00K/3I6 6JK/JK/J K>K/KK/K
 K
 
K,)K/+K,,K/c                  4  #    [         R                  S5        [        (       aX  [         R                  S5        [        R                  " 5       n  U R                  5       I Sh  vN   [         R                  S5        [        (       aX  [         R                  S5        [        R                  " 5       n UR                  5       I Sh  vN   [         R                  S5        [         R                  S5        g N! [         a     Nf = f NA! [         a     NKf = f7f)z
This runs for every worker on shutdown.
Read more about lifespan here: https://fastapi.tiangolo.com/advanced/events/#lifespan
zShutting down KeepzStopping the schedulerNzScheduler stopped successfullyzStopping the consumerzConsumer stopped successfullyzKeep shutdown complete)	rh   ri   rI   rB   ru   stop	TypeErrorrK   r;   )r|   r}   s     r^   shutdownr      s     
 KK$%y,-$113
	//### 	45x+,*779	"''))) 	34
KK() $ 		 * 		ss   ADC6 !C4"C6 &A
D1D DD 	+D4C6 6
D DDDD 
DDDDappc                &  #    [         U R                  l         [        5       n[        (       a4  [        R                  S5        [        R                  " [        U5      5        [        5       I Sh  vN   SU07v   [        5       I Sh  vN   g N N7f)z
This runs for every worker on startup and shutdown.
Read more about lifespan here: https://fastapi.tiangolo.com/advanced/events/#lifespan
z3Starting background task to check for pending tasksNra   )r   statesetrO   rh   ri   rj   r{   rm   r   r   )r   ra   s     r^   lifespanr      ss       CIIuIJ/0@AB )OO /
00 *  s$   A,B.B/BBBB	auth_typereturnc                 T  ^ [        SS S9nU(       dE  [        R                  SSS[         S[         30S9  S[         S[         3[
        R                  S'   [        R                  S[
        R                  S    S	[         3[        US
.S9  [        SS[        [        S9mTR                  SSS9U4S j5       nTR                  [        [        R                  " 5       4S9  TR                  [         ["        5        TR                  [$        SS9  TR                  [&        S/SS/S/S9  TR)                  [*        R,                  SS/S9  TR)                  [.        R,                  SS/S9  TR)                  [0        R,                  SS/S9  TR)                  [2        R,                  SS /S9  TR)                  [4        R,                  S!S"/S9  TR)                  [6        R,                  S#S$/S9  TR)                  [8        R,                  S%S&/S9  TR)                  [:        R,                  S'S(S"/S9  TR)                  [<        R,                  S)S*/S9  TR)                  [>        R,                  S+S,/S9  TR)                  [@        R,                  S-S./S9  TR)                  [B        R,                  S/S0/S9  TR)                  [D        R,                  S1S2/S9  TR)                  [F        R,                  S3S4S5/S9  TR)                  [H        R,                  S6S7S8/S9  TR)                  [J        R,                  S9S7S:/S9  TR)                  [L        R,                  S;S7S</S9  TR)                  [N        R,                  S=S7S>/S9  TR)                  [P        R,                  S?S@/S9  TR)                  [R        R,                  SAS4SB/S9  TR)                  [T        R,                  SCSD/S9  TR)                  [V        R,                  SESF/S9  TR)                  [X        R,                  SGSH/S9  TR)                  [Z        R,                  SISJ/S9  TR)                  [\        R,                  SKSL/S9  TR)                  [^        R,                  SMSN/S9  TR)                  [^        R,                  SMSN/S9  TR)                  [`        R,                  SOSP/S9  TR)                  [b        R,                  SQSR/S9  [        R                  SS[d         35        [f        Rh                  " [j        S [d        5      nURm                  T5        TRo                  [p        5      ST[r        SU[p        4SV j5       nTR                  [t        5        [v        (       a  TR                  [x        5        [        SWSX[z        SY9(       a  [}        S?SZ/SS[9R                  TS\S]9  [        S^SX[z        SY9(       a)  [        R                  R                  R                  T5        [        (       a5  [        R                  S_5        [        T5      m[        R                  S`5        T$ )aNKEEP_API_URLrD   z.KEEP_API_URL is not set, setting it to defaultkeep_api_urlzhttp://:rd   zStarting Keep with z as URL and version )keep_versionr   zKeep APIuG   Rest API powering https://platform.keephq.dev and friends 🏄‍♀️)titledescriptionversionr   /F)include_in_schemac                  2   >#    T R                   [        S.$ 7f)z
App description and version.
)messager   )r   rU   )r   s   r^   rootget_app.<locals>.root  s     
 ??|DDs   r   i  )minimum_size*T)allow_originsallow_credentialsallow_methodsallow_headersz
/providersr.   )prefixr3   z/actionsr   z/air    z/healthcheckr'   z/alertsr!   z
/incidentsr(   z	/settingsr1   z
/workflowsr6   z/whoamir5   z/pusherr/   z/statusr2   z/rulesr0   z/presetr,   z/mapping
enrichmentr*   z/auth/groupsauthr7   z/auth/permissionsr8   z/auth/rolesr9   z/auth/usersr:   z/metricsr+   z/extractionr$   z
/dashboardr"   z/tagsr3   z/maintenancer)   z	/topologyr4   z/deduplicationsr#   z/{entity_name}/facetsr%   z/celr&   z/provider-imageszprovider-imagesz(Starting Keep with authentication type: requestexcc                    #    [         R                  " SU SU R                  R                   SU R                  R                   35        [        SSU R                  R                  [        U5      S.S9$ 7f)Nz!An unhandled exception occurred: z, Trace ID: z. Tenant ID: i  z"An internal server error occurred.)r   trace_id	error_msg)status_codecontent)loggingerrorr   r   	tenant_idr   str)r   r   s     r^   catch_exception get_app.<locals>.catch_exceptionW  so     /uLAWAW@XXefmfsfsf}f}e~	
 ?#MM22 X
 	
s   A3A5KEEP_METRICSrJ   rG   z/metrics/processing)excluded_handlersshould_group_status_codesrT   )r   metric_namespaceKEEP_OTEL_ENABLEDzInstrumenting middlewareszInstrumented middlewares)Fr   rh   ri   HOSTrF   osenvironrU   r   r   getadd_middlewarer   r   RequestIdPluginadd_exception_handlerr   r   r   r   include_routerr.   routerr   r    r'   r!   r(   r1   r6   r5   r/   r2   r0   r,   r*   auth_groupsr8   r9   r:   r+   r$   r"   r3   r)   r4   r#   r%   r&   r-   rS   r<   get_identity_managerr   on_startexception_handlerrw   r   r   rQ   r   boolr   
instrumentrT   apiobservabilitysetuprP   instrument_middleware)r   r   r   identity_managerr   r   s        @r^   get_appr      s    .$7L<!WTF!D6#:; 	 	
 (/tfAdV%<

>"
KK
bjj899Ml^\((
   ]	C 	WWSEW*E +E +g6M6M6O5QR/1MN%5   eee   y''K=Qw~~j	{KryydV<{)).Wv}}YhZHy''K=Qx{*N[(4K   v}}YhZHv}}YhZHv}}YhZHu||HG9Ev}}YhZHzy0I   >8J   #6fm=T   u||M@QRu||M@QRw~~j	{K-|\6R   y''K=Qt{{7&B{)).Wx{*N&7?O>P   v}}-DH:Vv}}-DH:Vszz&w?'9AR@S   KK:9+FG-BBD) c"9%
w 
Y 
 &
 (),-nf48)+@A&+	
 *v*
6!6=$$S) /0#C(./Jr`   )levelc           
         ^ [        TS5      (       a  T$ [        T5      S[        S[        / [        [           4   S[        [        /[        S    4   4U4S jj5       nSUl        U$ )N_timing_wrappedscopereceivesendc                   >#    US   S:w  a  T
" XX#5      I S h  vN $ [         R                   " 5       n T
" XX#5      I S h  vN nU[         R                   " 5       U-
  S-  nUR                  SS5      nUR                  SS5      nU R                  R                  n	[        R                  SU	S S	U S	U S
US S3	5        $  N N! [         R                   " 5       U-
  S-  nUR                  SS5      nUR                  SS5      nU R                  R                  n	[        R                  SU	S S	U S	U S
US S3	5        f = f7f)Ntypehttpi  path r[   u   ⏱️ z<40 z took z>8.2fms)timer   	__class____name__rh   ri   )rZ   r   r   r   
start_timeresponseprocess_timer   r[   middleware_nameoriginal_calls             r^   
timed_callwrap_call.<locals>.timed_call  sA     =F"&tGBBBYY[

	*4FFH IIK*4<L99VR(DYYx,F"nn55OKK/#.axqf\RWDXXZ[ C G !IIK*4<L99VR(DYYx,F"nn55OKK/#.axqf\RWDXXZ[s:   EC EC  CC A;EC A;D??ET)hasattrr   dictr   r   r   )middleware_clsr   r   s    ` r^   	wrap_callr     sx    }/00
= "io-. vy./	 , "&Jr`   c                     U R                    Hj  n[        UR                  S5      (       d  M   UR                  R                  n[	        U5      " [        UR                  U5      5      UR                  l        Ml     U $ )N__call__)user_middlewarer   clsr   r   r   )r   
middlewarer   s      r^   r   r     s]    ))
:>>:..&NN33M&+M&:*..-8'JNN# * Jr`   c                     [         R                  S5        SS KnUR                  R                  R                  5         [        R                  " S[        [        [        S[	        SS [        S9[	        SS [        S9S9  g )	NzStarting the uvicorn serverr   zkeep.api.api:get_apponKEEP_WORKERSrG   KEEP_LIMIT_CONCURRENCY)hostport
log_configr   workerslimit_concurrency)rh   ri   keep.api.configr   r   on_startinguvicornrunr   rF   logging_configint)r   rT   s     r^   r   r     sZ    
KK-.HHOO!KK!~t#> !94cRr`   )rj   r   r   r   
contextlibr   	functoolsr   	importlibr   typingr   r   arqr   requestsr   dotenvr	   r
   fastapir   r   fastapi.middleware.gzipr   fastapi.responsesr   !prometheus_fastapi_instrumentatorr   slowapir   slowapi.errorsr   slowapi.middlewarer   starlette.middleware.corsr   starlette_contextr   starlette_context.middlewarer   keep.api.arq_poolr   keep.api.loggingrT   keep.api.observabilitykeep.api.tasksr   keep.api.utils.import_eekeep.api.core.configr   keep.api.core.dbr   keep.api.core.dependenciesr   keep.api.core.limiterr   r   r   keep.api.middlewaresr   keep.api.routesr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   keep.api.routes.authr7   r   r8   r9   r:   &keep.event_subscriber.event_subscriberr;   +keep.identitymanager.identitymanagerfactoryr<   r=   "keep.topologies.topology_processorr>   keep.api.constsr?   r@   rA   $keep.workflowmanager.workflowmanagerrB   r   setup_logging	getLoggerr   rh   r   r   rF   r   rI   rK   ry   rN   rO   rP   rQ   rR   NOAUTHvaluelowerrS   r   rU   rw   Sessionr   rY   r_   r   rm   r   r   r   r   basicConfigDEBUGr   r   r    r`   r^   <module>r%     s     	  *   &    + $ 2 * < 0 , 0 4 % = &   /  ' , 9 ) 5 2      4 7 : : B A ` ` A KM        			8	$k9-fd-;T:	*f48+W4H
G$
7,gDI  8'PTU ,gDI 2G$O ;(<(C(C(I(IJPPR	=##F+L
 ##++ 9
 /   	 	F1R*:   0 ';&A&A&G&GA#AAH   '-- (			8	$@W a
  =.)<L=s   J J#"J#