
    shU4              
       ^   S r SSKrSSKrSSKJr  SSKJrJrJr  SSKrSSKJ	r	  SSK
JrJr  \R                  " \5      r " S S5      r\" 5       rSS	\S
\\\\4      4S jjrSS\S\S
\\\\4      4S jjrS\S\4S jrS\S\\\4   4S jrSS\\   S\\   S\\   4S jjrSS\4S jjrg)z
Centralized error logging configuration for the AI Test Case Generator application.
This module provides error tracking functionality using MongoDB and email notifications.
    N)datetime)DictAnyOptional)MongoClient)MONGODB_URI
MONGODB_DBc                      \ rS rSrS r   S S\S\S\S\\\\4      S\\\\4      S	\\\\4      4S
 jjr	S!S\
S\\\\4      4S jjrS"S\S\S\\\\4      4S jjrS\S\4S jrS\S\\\4   4S jr  S#S\\   S\\   S\\   4S jjrS\
S\4S jrS\
S\\\4   4S jr  S$S\S\\   S\\   S\\   S\\\4   4
S jjrSrg)%ErrorLogger   c                     [        [        SS9U l        U R                  R                  5         U R                  [           U l        U R
                  R                  U l        [        R                  S5        g! [         a@  n[        R                  S[        U5       35        SU l        SU l        SU l         SnAgSnAff = f)z3Initialize the error logger with MongoDB connectioni  )serverSelectionTimeoutMSz%Error logger initialized successfullyz#Failed to initialize error logger: N)r   r   clientserver_infor	   db
error_logserror_collectionloggerinfo	Exceptionerrorstr)selfes     6D:\Projects\AI-TestCaseGenerator\utils\error_logger.py__init__ErrorLogger.__init__   s    	)%kDQDKKK##%kk*-DG$(GG$6$6D!KK?@ 	)LL>s1vhGHDKDG$(D!!		)s   A5A8 8
C6B==CN
error_typemessagelevelcontexttagsuser_contextc                 4    U R                   c0  [        R                  S5        [        R                  U SU 35        g[        R                  " 5       UUU[
        R                  " SS5      SS.nU(       a  XGS'   U(       a  XWS	'   U(       a  XgS
'   U R                   R                  U5        [        R                  SU SU 35        g! [         aE  n[        R                  S[        U5       35        [        R                  U SU 35         SnAgSnAff = f)a;  
Internal method to log errors to MongoDB

Args:
    error_type: Type of error (exception, message, etc.)
    message: Error message or description
    level: Log level (debug, info, warning, error, critical)
    context: Additional context data
    tags: Tags for categorization
    user_context: User information
Nz@Error collection not available, falling back to standard loggingz: 	FLASK_ENVdevelopmentai-test-case-generator)	timestampr   r   r    environmentservicer!   r"   r#   zError logged to MongoDB: z - z Failed to log error to MongoDB: )r   r   r   r   utcnowosgetenv
insert_oner   r   r   )	r   r   r   r    r!   r"   r#   	error_docr   s	            r   
_log_errorErrorLogger._log_error    s    	5$$,_`
|2gY78 &__.("!yymD3I '.)$$(&!,8.)!!,,Y7KK3J<s7)LM 	5LL;CF8DELLJ<r'344	5s   <C BC 
D;DD	exceptionc                     [        U5      R                  [        U5      U R                  U5      S.nU(       a  UR	                  U5        U R                  S[        U5      SUS9  U R                  X5        g)z
Capture an exception with additional context and send email notification for critical errors.

Args:
    exception: The exception to capture
    context: Additional context to include
)exception_typeexception_message	tracebackr2   r   r   r   r    r!   N)type__name__r   _get_tracebackupdater0   !_send_critical_error_notification)r   r2   r!   error_contexts       r   capture_exceptionErrorLogger.capture_exceptionN   sq     #9o66!$Y,,Y7
   )"	N!	 	 	
 	..yH    c                 (    U R                  SUUUS9  g)z
Capture a message with specified level and context.

Args:
    message: The message to capture
    level: Log level (debug, info, warning, error, critical)
    context: Additional context to include
r   r7   N)r0   )r   r   r    r!   s       r   capture_messageErrorLogger.capture_messagei   s!     	 	 	 	
r@   keyvaluec                 P    [        U S5      (       d  0 U l        X R                  U'   g)zJ
Set a tag for error events.

Args:
    key: Tag key
    value: Tag value
_current_tagsN)hasattrrG   )r   rD   rE   s      r   set_tagErrorLogger.set_tagy   s'     t_--!#D"'3r@   namedatac                 P    [        U S5      (       d  0 U l        X R                  U'   g)zY
Set context data for error events.

Args:
    name: Context name
    data: Context data
_current_contextN)rH   rN   )r   rK   rL   s      r   set_contextErrorLogger.set_context   s(     t/00$&D!&*d#r@   user_idemailusernamec                 f    0 nU(       a  XS'   U(       a  X$S'   U(       a  X4S'   U(       a  X@l         gg)zm
Set user context for error events.

Args:
    user_id: User ID
    email: User email
    username: Username
idrR   rS   N)_current_user_context)r   rQ   rR   rS   	user_datas        r   set_user_contextErrorLogger.set_user_context   s7     	%dO!&g$,j!)2& r@   returnc                     SSK n SR                  UR                  [        U5      XR                  5      5      $ !    g= f)z,Extract traceback information from exceptionr   N zUnable to extract traceback)r6   joinformat_exceptionr8   __traceback__)r   r2   r6   s      r   r:   ErrorLogger._get_traceback   s:    	177955d9oyRiRijkk	10s   3: >c                 (  ^
  SSK Jn  / SQn[        U5      R                  n[	        U5      R                  5       m
/ SQnXT;   =(       d0    [        U
4S jU 5       5      =(       d    UR                  S5      S:H  nU(       aZ  ST
;   d  S	T
;   a  S
nO ST
;   d  ST
;   a  SnOST
;   d  ST
;   a  SnOSnU" U[	        U5      UUS9  [        R                  SU 35        gg! [         a+  n	[        R                  S[	        U	5       35         Sn	A	gSn	A	ff = f)z+Send email notification for critical errorsr   ) send_critical_error_notification)ConnectionErrorTimeoutErrorSSLError	HTTPErrorAPIErrorAuthenticationErrorPermissionErrorOSErrorMemoryErrorSystemErrorRuntimeError)criticalfatalzsystem downzservice unavailablezauthentication failedzpermission deniedzconnection refusedtimeoutmemoryz
disk spacedatabasezapi keyc              3   ,   >#    U  H	  oT;   v   M     g 7fN ).0keywordr5   s     r   	<genexpr>@ErrorLogger._send_critical_error_notification.<locals>.<genexpr>   s     R@QW00@Qs   r    rn   apihttpAPI_FAILURErr   mongodbDATABASE_ERRORauthentication
permissionAUTHENTICATION_ERRORSYSTEM_ERROR)r   error_messager!   r2   z&Critical error notification sent for: z,Failed to send critical error notification: N)utils.email_notifierrb   r8   r9   r   loweranygetr   r   r   r   )r   r2   r!   rb   critical_error_typesr4   critical_keywordsis_criticalr   r   r5   s             @r   r<   -ErrorLogger._send_critical_error_notification   s(   2	RM$  ")_55N #I 4 4 6! 6 3R@QRR3G$
2  --;L1L!.J#44	EV8V!1J%)::lN_>_!7J!/J 1)"%i.#'	 D^DTUV' *  	RLLGAxPQQ	Rs   CC 
D&!DDdays
start_dateend_datec                     U R                   c  SS0$ SSKJn  U(       aR  U(       aK   [        R                  " US5      n[        R                  " US5      U" SS9-   nS	XgS
.0nXv-
  R                  nO"[        R                  " 5       U" US9-
  n
S	SU
00nU(       a  X(S'   U R                   R                  U5      nSU0SSSS0S.0SSS00/n[        U R                   R                  U5      5      nSU0SSSS0S.0SSS00/n[        U R                   R                  U5      5      n[        U R                   R                  USSSSSS.5      R                  S	S5      R                  S5      5      nUUUUUS.$ ! [
         aE  n	[        R                  SU	 35        [        R                  " 5       U" US9-
  n
S	SU
00n Sn	A	GN.Sn	A	ff = f! [
         a8  n	[        R                  S[!        U	5       35        S[!        U	5      0s Sn	A	$ Sn	A	ff = f)a4  
Get a summary of errors from MongoDB

Args:
    days: Number of days to look back (used if start_date/end_date not provided)
    level: Filter by log level
    start_date: Start date in YYYY-MM-DD format
    end_date: End date in YYYY-MM-DD format
    
Returns:
    Dictionary with error summary statistics
Nr   zError collection not availabler   )	timedeltaz%Y-%m-%d   )r   r(   )$gtez$ltz0Error parsing date range, falling back to days: r   r    z$matchz$groupz$levelz$sum)_idcountz$sortr   z$error_type)r   r(   r   r   r    
   )total_errorserrors_by_levelerrors_by_typerecent_errorsperiod_dayszError getting error summary: )r   r   r   strptimer   r   r   warningr+   count_documentslist	aggregatefindsortlimitr   r   )r   r   r    r   r   r   start_datetimeend_datetimefilter_criteriar   cutoff_dater   level_pipeliner   type_pipeliner   r   s                    r   get_error_summaryErrorLogger.get_error_summary   sD   =	%$$,!ABB* h	K%-%6%6z:%NN#+#4#4Xz#JY\]M^#^L'2^4a&bO(9??D 'oo/)2FF#.0E"F+0(  00@@QL ?+8vqkBC7B-(N
 #4#8#8#B#B>#RSO ?+=FA;GH7B-(M
 "$"7"7"A"A-"PQN !!6!6!;!;qSTU" d;#EE"I/M !-#2"0!.# K ! KNN%UVWUX#YZ"*//"3iT6J"JK'2V[4I&JOKZ  	%LL8QABSV$$	%sM   G
 G
 A	E8 1DG
 8
G:G<G
 GG
 

H-HHH)rN   rG   rV   r   r   r   )r   NNNrt   r   NNNN)   NNN)r9   
__module____qualname____firstlineno__r   r   r   r   r   r0   r   r>   rB   rI   rO   rX   r:   r<   intr   __static_attributes__ru   r@   r   r   r      s   ) FM^b<@,5S ,53 ,5s ,5$T#s(^4,5CKDQTVYQYNC[,5!)$sCx.!9,5\I9 IxSRUX?W I6
s 
3 
(SWX[]`X`SaJb 
 (3 (s (+ +4S> + VZ263 3Xc] 3"*3-3*1	 1c 14R9 4RtTWY\T\~ 4Rl HLUYK%c K%x} K%%-c]K%EMc]K%^bcfhkck^lK% K%r@   r   r2   r!   c                 .    [         R                  X5        g)z-Capture an exception with additional context.N)error_loggerr>   )r2   r!   s     r   r>   r>   7  s    ""96r@   r   r    c                 0    [         R                  XU5        g)z3Capture a message with specified level and context.N)r   rB   )r   r    r!   s      r   rB   rB   ;  s      9r@   rD   rE   c                 .    [         R                  X5        g)zSet a tag for error events.N)r   rI   )rD   rE   s     r   rI   rI   ?  s    $r@   rK   rL   c                 .    [         R                  X5        g)z"Set context data for error events.N)r   rO   )rK   rL   s     r   rO   rO   C  s    T(r@   rQ   rR   rS   c                 0    [         R                  XU5        g)z"Set user context for error events.N)r   rX   )rQ   rR   rS   s      r   rX   rX   G  s    !!'(;r@   service_namec                     [         R                  SU 5        [         R                  SS5        [        R                  SU  35        g)zz
Initialize error logger (compatibility function for Sentry API)

Args:
    service_name: Name of the service for tagging
r*   versionz1.0.0z&Error logger initialized for service: N)r   rI   r   r   )r   s    r   init_error_loggerr   K  s8     L1G,
KK8GHr@   rt   r   r   )r'   )__doc__loggingr,   r   typingr   r   r   pymongor   config.settingsr   r	   	getLoggerr9   r   r   r   r   r   r>   rB   rI   rO   rX   r   ru   r@   r   <module>r      s   
  	  & &   3			8	$a% a%H	 }7 7Xd38n5M 7:S : :cSVh@X :% %S %)c )c3h )<hsm <8C= <[cdg[h <	IC 	Ir@   