
    shU4              
          d Z ddlZddlZddlmZ ddlmZmZmZ ddlZddlm	Z	 ddl
mZmZ  ej        e          Z G d d          Z e            Zdd	ed
eeeef                  fdZddeded
eeeef                  fdZdedefdZdedeeef         fdZddee         dee         dee         fdZd defdZdS )!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                      e Zd Zd Z	 	 	 d!dedededeeeef                  deeeef                  d	eeeef                  fd
Zd"de	deeeef                  fdZ
d#dededeeeef                  fdZdedefdZdedeeef         fdZ	 	 d$dee         dee         dee         fdZde	defdZde	deeef         fdZ	 	 d%dedee         dee         dee         deeef         f
d ZdS )&ErrorLoggerc                    	 t          t          d          | _        | j                                         | j        t                   | _        | j        j        | _        t          	                    d           dS # t          $ rJ}t                              dt          |                      d| _        d| _        d| _        Y d}~dS d}~ww xY w)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     ?/var/www/html/testcasegenerator.evdpl.com/utils/error_logger.py__init__zErrorLogger.__init__   s    	)%kDQQQDKK##%%%k*-DG$(G$6D!KK?@@@@@ 	) 	) 	)LLGs1vvGGHHHDKDG$(D!!!!!!!		)s   A6A: :
C?C		Cr   N
error_typemessagelevelcontexttagsuser_contextc                 F   	 | j         ;t                              d           t                              | d|            dS t          j                    |||t          j        dd          dd}|r||d<   |r||d	<   |r||d
<   | j                             |           t                              d| d|            dS # t          $ rT}t                              dt          |                      t                              | d|            Y d}~dS d}~ww xY w)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_errorzErrorLogger._log_error    sf   	5$,_```
77g77888 &_..("!ymDD3 I  /'.	)$ )$(	&! 9,8	.)!,,Y777KKLJLL7LLMMMMM 	5 	5 	5LLDCFFDDEEELLJ33'33444444444	5s    A C A<C 
D A	DD 	exceptionc                    t          |          j        t          |          |                     |          d}|r|                    |           |                     dt          |          d|           |                     ||           dS )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	tracebackr/   r   r   r   r   r   N)type__name__r   _get_tracebackupdater.   !_send_critical_error_notification)r   r/   r   error_contexts       r   capture_exceptionzErrorLogger.capture_exceptionN   s     #9oo6!$Y,,Y77
 
  	*  )))"	NN!	 	 	
 	
 	
 	..y-HHHHH    r   c                 8    |                      d|||           dS )a   
        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   r4   N)r.   )r   r   r   r   s       r   capture_messagezErrorLogger.capture_messagei   s5     	 	 	 	
 	
 	
 	
 	
r<   keyvaluec                 H    t          | d          si | _        || j        |<   dS )zz
        Set a tag for error events.
        
        Args:
            key: Tag key
            value: Tag value
        _current_tagsN)hasattrrB   )r   r?   r@   s      r   set_tagzErrorLogger.set_tagy   s1     t_-- 	$!#D"'3r<   namedatac                 H    t          | d          si | _        || j        |<   dS )z
        Set context data for error events.
        
        Args:
            name: Context name
            data: Context data
        _current_contextN)rC   rH   )r   rE   rF   s      r   set_contextzErrorLogger.set_context   s2     t/00 	'$&D!&*d###r<   user_idemailusernamec                 J    i }|r||d<   |r||d<   |r||d<   |r	|| _         dS dS )z
        Set user context for error events.
        
        Args:
            user_id: User ID
            email: User email
            username: Username
        idrK   rL   N)_current_user_context)r   rJ   rK   rL   	user_datas        r   set_user_contextzErrorLogger.set_user_context   s^     	 	&%IdO 	'!&Ig 	-$,Ij! 	3)2D&&&	3 	3r<   returnc                     ddl }	 d                    |                    t          |          ||j                            S #  Y dS xY w)z,Extract traceback information from exceptionr   N zUnable to extract traceback)r3   joinformat_exceptionr5   __traceback__)r   r/   r3   s      r   r7   zErrorLogger._get_traceback   sS    	177955d9ooyR[Rijjkkk	1000s   ;A Ac                 D  
 	 ddl m} g d}t          |          j        }t	          |                                          
g d}||v p3t          
fd|D                       p|                    d          dk    }|r^d
v sd	
v rd
}nd
v sd
v rd}nd
v sd
v rd}nd} ||t	          |          ||           t          	                    d|            dS dS # t          $ r5}	t                              dt	          |	                      Y d}	~	dS d}	~	ww xY w)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       K   | ]}|v V  	d S N ).0keywordr2   s     r   	<genexpr>z@ErrorLogger._send_critical_error_notification.<locals>.<genexpr>   s)      RRWG00RRRRRRr<   r   re   apihttpAPI_FAILUREri   mongodbDATABASE_ERRORauthentication
permissionAUTHENTICATION_ERRORSYSTEM_ERROR)r   error_messager   r/   z&Critical error notification sent for: z,Failed to send critical error notification: N)utils.email_notifierrY   r5   r6   r   loweranygetr   r   r   r   )r   r/   r   rY   critical_error_typesr1   critical_keywordsis_criticalr   r   r2   s             @r   r9   z-ErrorLogger._send_critical_error_notification   s   2	RMMMMMM$ $ $  ")__5N #I 4 4 6 6! ! ! "66 3RRRR@QRRRRR3G$$
2   W---;L1L1L!.JJ#444	EV8V8V!1JJ%):::lN_>_>_!7JJ!/J 10)"%i..#'	    U^UUVVVVV'W W*  	R 	R 	RLLPAPPQQQQQQQQQ	Rs   CC   
D**DD   days
start_dateend_datec                 F   	 | j         ddiS ddlm} |r|r	 t          j        |d          }t          j        |d           |d          z   }d	||d
i}||z
  j        }n# t
          $ rM}	t                              d|	            t          j                     ||          z
  }
d	d|
ii}Y d}	~	n.d}	~	ww xY wt          j                     ||          z
  }
d	d|
ii}|r||d<   | j         	                    |          }d|iddddididddiig}t          | j                             |                    }d|iddddididddiig}t          | j                             |                    }t          | j                             |dddddd                              d	d                              d                    }|||||dS # t
          $ rE}	t                              dt!          |	                      dt!          |	          icY d}	~	S d}	~	ww xY w)a  
        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_summaryzErrorLogger.get_error_summary   s   =	%$,!ABB******  Gh G	K%-%6z:%N%NN#+#4Xz#J#JYY\]M^M^M^#^L'2^T`4a4a&bO(>9?DD  K K KNN#YVW#Y#YZZZ"*/"3"3iiT6J6J6J"JK'2V[4I&JOOOOOOK 'o//))2F2F2FF#.0E"F 1+0(  0@@QQL ?+8vqkBBC7B-(N
 #4#8#B#B>#R#RSSO ?+=FA;GGH7B-(M
 "$"7"A"A-"P"PQQN !!6!;!;qSTUU" " d;##EE"II/ /M !-#2"0!.#    	% 	% 	%LLAQAABBBSVV$$$$$$$	%sN   
G 
G AA!  G !
B8+AB3.G 3B88DG 
H :HH H )r   NNNrk   r   NNNN)r   NNN)r6   
__module____qualname__r   r   r   r   r   r.   r   r;   r>   rD   rI   rQ   r7   r9   intr   rl   r<   r   r   r      sq       ) ) ) FM^b<@,5 ,5S ,53 ,5s ,5$T#s(^4,5CKDQTVYQYNC[,5!)$sCx.!9,5 ,5 ,5 ,5\I I9 IxSRUX?W I I I I6
 
s 
3 
(SWX[]`X`SaJb 
 
 
 
 (3 (s ( ( ( (+ +4S> + + + + VZ263 3 3Xc] 3"*3-3 3 3 3*1	 1c 1 1 1 14R9 4RtTWY\T\~ 4R 4R 4R 4Rl HLUYK% K%c K%x} K%%-c]K%EMc]K%^bcfhkck^lK% K% K% K% K% K%r<   r   r/   r   c                 <    t                               | |           dS )z-Capture an exception with additional context.N)error_loggerr;   )r/   r   s     r   r;   r;   7  s    ""9g66666r<   r   r   r   c                 >    t                               | ||           dS )z3Capture a message with specified level and context.N)r   r>   )r   r   r   s      r   r>   r>   ;  s       %99999r<   r?   r@   c                 <    t                               | |           dS )zSet a tag for error events.N)r   rD   )r?   r@   s     r   rD   rD   ?  s    e$$$$$r<   rE   rF   c                 <    t                               | |           dS )z"Set context data for error events.N)r   rI   )rE   rF   s     r   rI   rI   C  s    T4(((((r<   rJ   rK   rL   c                 >    t                               | ||           dS )z"Set user context for error events.N)r   rQ   )rJ   rK   rL   s      r   rQ   rQ   G  s     !!'5(;;;;;r<   r%   service_namec                     t                               d|            t                               dd           t                              d|             dS )z
    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   rD   r   r   )r   s    r   init_error_loggerr   K  sQ     L111G,,,
KKGGGHHHHHr<   rk   r   r   )r%   )__doc__loggingr*   r   typingr   r   r   pymongor   config.settingsr   r	   	getLoggerr6   r   r   r   r   r   r;   r>   rD   rI   rQ   r   rl   r<   r   <module>r      s   
  				       & & & & & & & & & &        3 3 3 3 3 3 3 3		8	$	$a% a% a% a% a% a% a% a%H	 {}}7 7 7Xd38n5M 7 7 7 7: :S : :cSVh@X : : : :% %S % % % %)c )c3h ) ) ) )< <hsm <8C= <[cdg[h < < < <	I 	IC 	I 	I 	I 	I 	I 	Ir<   