
    Xj)                         U d dl Z d dlmZ d dlmZ d dlmZ  ee          Z G d d          Zda	edz  e
d<   defd	ZdS )
    N)datetime)Any)
get_loggerc                   ^   e Zd Zd defdZ	 	 d!dedededed	ed
ededz  dedz  fdZdeeef         fdZ	d"dedeeef         fdZ
d#de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fdZdeeef         fdZdS )%TrafficStatsServiceNtraffic:
key_prefixc                 z    || _         || _        |d u| _        | j        st                              d           d S d S )Nz:Redis client not provided. Traffic stats will be disabled.)redis_clientr	   enabledloggerwarning)selfr   r	   s      M/lsinfo/ai/hellotax_ai/base_platform/app/services/monitoring/traffic_stats.py__init__zTrafficStatsService.__init__   sM    ($#4/| 	YNNWXXXXX	Y 	Y    endpointmethodrequest_sizeresponse_sizestatus_codeduration_ms	tenant_iduser_idc	           	         | j         sd S 	 t          t          j                              }	||z   }
|                     dd           |                     d|
           dD ]}| j         d| d|	|                     |          z   }| j                            |dd           | j                            |d|
           | j                            |d	|           | j                            |d
|           | j                            ||                     |          dz             | j         d| }| j                            |dd           | j                            |d|
           | j                            |d	|           | j                            |d
|           | j                            |d           |r_| j         d| }| j                            |dd           | j                            |d|
           | j                            |d           |r_| j         d| }| j                            |dd           | j                            |d|
           | j                            |d           | j        	                    | j         d||
id           d S # t          $ r(}t                              d|            Y d }~d S d }~ww xY w)Nzrequests:total   zbandwidth:total1min5min15min1hourwindow::requests	bandwidthrequest_bytesresponse_bytes   	endpoint:iQ ztenant:zuser:endpoints:by_bandwidthT)incrz Failed to record traffic stats: )r   inttime_increment_counterr	   _window_secondsr   hincrbyexpirezadd	Exceptionr   error)r   r   r   r   r   r   r   r   r   current_timetotal_bandwidthwindow
window_keyendpoint_key
tenant_keyuser_keyes                    r   record_requestz"TrafficStatsService.record_request   sK    | 	F 	Aty{{++L*]:O##$4a888##$5GGG< W W $ooooQUQeQeflQmQmAmoo
!))*j!DDD!))*k?SSS!))*o|TTT!))*6FVVV!((T5I5I&5Q5QTU5UVVVV"oBBBBL%%lJBBB%%lKQQQ%%lO\RRR%%l4DmTTT$$\5999 < $CC	CC
!))*j!DDD!))*k?SSS!((U;;; :"o==G==!))(JBBB!))(KQQQ!((5999""?:::X<W^b #       	A 	A 	ALL?A??@@@@@@@@@	As   JJ) )
K3KKreturnc           
         | j         s|                                 S 	 t          t          j                              }| j         d|dz   }| j                            |          }t          |                    dd                    }t          |                    dd                    }t          |                    dd                    }t          |                    dd                    }|dz  }|dz  }	t          |d	          t          |	d	          t          j
                                                    d
|||||dk    rt          ||z  d	          nd|dk    rt          ||z  d	          ndddS # t          $ r;}
t                              d|
            |                                 cY d }
~
S d }
~
ww xY w)Nzwindow:1min:<      requestsr   	   bandwidth   request_bytes   response_bytesg      N@r(   requests_per_secbytes_per_sec	timestamptotal_requeststotal_bytesr&   r'   avg_request_sizeavg_response_sizecurrentlast_minutezFailed to get current stats: )r   _empty_statsr,   r-   r	   r   hgetallgetroundr   utcnow	isoformatr3   r   r4   )r   r5   r8   window_datar$   r%   r&   r'   rF   rG   r<   s              r   get_current_statsz%TrafficStatsService.get_current_statsD   s   | 	'$$&&&	'ty{{++L OMM9KMMJ+33J??K;??;::;;HKOOL!<<==I0@! D DEEM 1BA!F!FGGN'$%,M )..>(B(B%*=!%<%<!)!2!2!<!<!>!>  '/#,%2&4NVYZllmh.F(J(J(J`aPX[\P\P\~/H!)L)L)Lbc       	' 	' 	'LL<<<===$$&&&&&&&&	's   EE= =
G0F=7G=Gr!   periodc           
         | j         s|dddS 	 t          t          j                              }|                     |          }||z  }| j         d| d| }| j                            |          }|t          |                    dd                    t          |                    dd                    t          |                    dd                    t          |                    dd                    t          j	                    
                                d	S # t          $ r-}t                              d
|            |dddcY d }~S d }~ww xY w)Nr   )rY   rK   rJ   r"   r#   rB   rA   rC   rD   )rY   rK   rJ   r&   r'   rH   zFailed to get bandwidth usage: )r   r,   r-   r/   r	   r   rR   rS   r   rU   rV   r3   r   r4   )r   rY   r5   window_seconds	window_idr8   rW   r<   s           r   get_bandwidth_usagez'TrafficStatsService.get_bandwidth_usaged   st   | 	M$Q!LLL	Mty{{++L!11&99N$6I OHHFHHYHHJ+33J??K ";??<#C#CDD"%kook1&E&E"F"F!$[__5Eq%I%I!J!J"%koo6G&K&K"L"L%_..88::    	M 	M 	MLL>1>>???$Q!LLLLLLLL	Ms   DD" "
E,"EEE
   limitc                    | j         sg S 	 | j                            | j         dd|dz
  d          }g }|D ]\  }}|                    d          }| j         d| }| j                            |          }t          |                    dd                    }	t          |                    d	d                    }
t          |                    d
d                    }t          |                    dd                    }|                    ||	|
|||	dk    rt          ||	z  d          nd|	dk    rt          ||	z  d          ndd           |S # t          $ r)}t                              d|            g cY d }~S d }~ww xY w)Nr*   r   r   T)
withscoresutf-8r)   rA   rB   rC   rD   r(   )r   r$   rK   r&   r'   rL   rM   z#Failed to get traffic by endpoint: )r   r   	zrevranger	   decoderR   r,   rS   appendrT   r3   r   r4   )r   r_   top_endpointsresultsendpoint_bytes_total_bandwidthr   r9   endpoint_datar$   r%   r&   r'   r<   s                 r   get_traffic_by_endpointz+TrafficStatsService.get_traffic_by_endpointy   s   | 	I	 -77?:::AuqyUY 8  M G4A  0 0)0099"&/FFHFF $ 1 9 9, G G}00a@@AA 1 1, B BCC	 #M$5$56F$J$J K K!$]%6%67H!%L%L!M!M$,$,'0)6*8BJQ,,E-(":A>>>TU DLa<<E.8";Q???UV     N 	 	 	LLBqBBCCCIIIIII	s   EE 
F"F FFc                    | j         sg S 	 g }d}	 | j                            || j         dd          \  }}|                    |           |dk    rnEg }|d |         D ]}|                    d                              d          d         }| j                            |          }t          |	                    d	d                    }	t          |	                    d
d                    }
|
                    t          |          |	|
d           |                    d d           |d |         S # t          $ r)}t                              d|            g cY d }~S d }~ww xY w)Nr   Tztenant:*d   )matchcountrb   r#   rA   rB   )r   r$   rK   c                     | d         S )NrK    )xs    r   <lambda>z;TrafficStatsService.get_traffic_by_tenant.<locals>.<lambda>   s    q'7 r   )keyreversez!Failed to get traffic by tenant: )r   r   scanr	   extendrd   splitrR   r,   rS   re   sortr3   r   r4   )r   r_   tenant_keyscursorkeysrg   r:   r   tenant_datar$   r%   r<   s               r   get_traffic_by_tenantz)TrafficStatsService.get_traffic_by_tenant   s   | 	I	KF#055T_">">">c  6     ""4(((Q;; G)&5&1  
&--g66<<SAA"E	"/77
CC{{A>>??a @ @AA	"%i..hW`aa    LL77LFFF6E6?" 	 	 	LL@Q@@AAAIIIIII	s   D.D: :
E-E("E-(E-r%   byc                     | j         sg S 	 |                     |          S # t          $ r)}t                              d|            g cY d }~S d }~ww xY w)NzFailed to get top consumers: )r   rk   r3   r   r4   )r   r_   r   r<   s       r   get_top_consumersz%TrafficStatsService.get_top_consumers   ss    | 	I	//666 	 	 	LL<<<===IIIIII	s     
AAAAru   valuec                 R    | j          | }| j                            ||           d S )N)r	   r   incrby)r   ru   r   full_keys       r   r.   z&TrafficStatsService._increment_counter   s3    o,s,,  511111r   r7   c                 <    ddddd}|                     |d          S )Nr@   i,  i  i  r   )rS   )r   r7   windowss      r   r/   z#TrafficStatsService._window_seconds   s'    sS4HH{{62&&&r   c                 h    ddt          j                                                    dddddddddS )Nr   rE   rI   rN   )r   rU   rV   )r   s    r   rQ   z TrafficStatsService._empty_stats   sX     %&!"%_..88::  #$ !""#$%%& 
 
 	
r   )Nr   )NN)r!   )r^   )r^   r%   )__name__
__module____qualname__strr   r,   r=   dictr   rX   r]   listrk   r   r   r.   r/   rQ   rr   r   r   r   r      s)       Y Yc Y Y Y Y !%"-A -A-A -A 	-A
 -A -A -A :-A t-A -A -A -A^'4S> ' ' ' '@M M# MDcN M M M M*" "S "$tCH~:N " " " "H 3 T#s(^8L    8 s S 4PTUXZ]U]P^K_    2c 2# 2 2 2 2'c 'c ' ' ' '
d38n 
 
 
 
 
 
r   r   _traffic_stats_servicer>   c                     t           	 dd l} ddlm} |j        r|                     |j        d          }n.|                     |j        |j        |j	        |j
        d          }t          |          a t                              d           nD# t          $ r7}t                              d|            t          d           a Y d }~nd }~ww xY wt           S )	Nr   )settingsF)decode_responses)hostportdbpasswordr   z,Traffic stats service initialized with Redisz.Failed to initialize Redis for traffic stats: )r   )r   redis
app.configr   	REDIS_URLfrom_urlRedis
REDIS_HOST
REDIS_PORTREDIS_DBREDIS_PASSWORDr   r   infor3   r   )r   r   r   r<   s       r   get_traffic_stats_servicer      s   %	LLLL++++++ ! 	$~~h.@SX~YY${{!,!,(%4%*  +     &9%F%F"KKFGGGG 	L 	L 	LNNOAOOPPP%8d%K%K%K""""""	L "!s   BB 
C-CC)r-   r   typingr   common_loggingr   r   r   r   r   __annotations__r   rr   r   r   <module>r      s                 % % % % % %	H		
M
 M
 M
 M
 M
 M
 M
 M
` 6: +d2 9 9 9"#6 " " " " " "r   