
    Xj                     z    d dl mZ d dlmZmZ d dlmZ d dlmZ  ee	          Z
 G d de          Zddefd	Zd
S )    )Callable)RequestResponse)BaseHTTPMiddleware)
get_loggerc                   X     e Zd Zg dZddef fdZd Zdedede	fd	Z
d
edefdZ xZS )NetworkTrafficMiddleware)z/docsz/redocz/openapi.jsonz/healthz/favicon.icoTenabledc                     t                                          |           || _        |                                  d S N)super__init__r
   _initialize_metrics)selfappr
   	__class__s      F/lsinfo/ai/hellotax_ai/base_platform/app/middleware/network_traffic.pyr   z!NetworkTrafficMiddleware.__init__   s:      """""    c                 J   | j         sd S 	 ddlm}m}  |ddddgg d          | _         |d	d
g dg d          | _         |ddddg          | _        t                              d           d S # t          $ r% t          
                    d           d| _         Y d S w xY w)Nr   )Counter	Histogramhttp_request_size_byteszHTTP request size in bytesmethodendpoint)d   i  i'  i i@B i )bucketshttp_response_size_byteszHTTP response size in bytesr   r   statusnetwork_bandwidth_bytes_totalz Total network bandwidth in bytes	directionz#Network traffic metrics initializedz:prometheus_client not installed. Traffic metrics disabled.F)r
   prometheus_clientr   r   request_size_bytesresponse_size_bytesbandwidth_bytes_totalloggerinfoImportErrorwarning)r   r   r   s      r   r   z,NetworkTrafficMiddleware._initialize_metrics   s   | 	F	!<<<<<<<<&/i),:&EEE	' ' 'D# (1y*-000EEE	( ( (D$ *1/2j)* *D&
 KK=>>>>> 	! 	! 	!NNWXXX DLLLL	!s   A&A3 3+B"!B"request	call_nextreturnc                 `  K   | j         r t          fd| j        D                       r |           d {V S d}j        dv r	                                  d {V }t          |          }|j        _        |                     j	        j
                  }| j                            j        |                              |           | j                            d|                              |           n4# t           $ r'}t"                              d|            Y d }~nd }~ww xY w |           d {V }|j                            d          pd	                                }|                    d
          r|S d}		 |j                            d          }
|
rt/          |
          }	nWd}|j        2 3 d {V }||z  }6 t          |          }	ddlm}  |||j        t9          |j                  |j                  }|	j        _        |                     j	        j
                  }| j                            j        |tA          |j                                                |	           | j                            d|                              |	           tA          |          |j        d<   tA          |	          |j        d<   tA          ||	z             |j        d<   n4# t           $ r'}t"          !                    d|            Y d }~nd }~ww xY w|S )Nc              3   V   K   | ]#}j         j                            |          V  $d S r   )urlpath
startswith).0r0   r*   s     r   	<genexpr>z4NetworkTrafficMiddleware.dispatch.<locals>.<genexpr>/   sG       #
 #
26GK''--#
 #
 #
 #
 #
 #
r   r   )POSTPUTPATCH)r   r   inbound)r!   r   z Failed to measure request size: zcontent-type ztext/event-streamzcontent-lengthr   )r   )contentstatus_codeheaders
media_typer   outboundzX-Request-SizezX-Response-SizezX-Bandwidth-Totalz!Failed to measure response size: )"r
   anyEXCLUDED_PATHSr   bodylenstaterequest_size_normalize_endpointr/   r0   r#   labelsobserver%   inc	Exceptionr&   r)   r;   getlowerr1   intbody_iteratorstarlette.responsesr   r:   dictr<   response_sizer$   strerror)r   r*   r+   rC   r@   r   eresponsecontent_typerO   content_lengthresponse_bodychunkStarletteResponses    `            r   dispatchz!NetworkTrafficMiddleware.dispatch.   s     | 	,s #
 #
 #
 #
:>:M#
 #
 #
  
  
 	, #7+++++++++>555G$\\^^++++++"4yy-9*33GK4DEE'..gnx.XX``    *11IPX1YY]]      G G GE!EEFFFFFFFFG"7++++++++ (,,^<<BIIKK""#677 	O	B%-112BCCN  #N 3 3 ##+#9 + + + + + + +%!U*MM $: #M 2 2MMMMMM,,) ( 4 !122'2	   +8GM'//0@AAH$++~XEYAZAZ ,  gm$$$&--
X-VVZZ   25\1B1BH-.25m2D2DH./47}8T4U4UH011 	B 	B 	BLL@Q@@AAAAAAAA	Bs>   B7D   
D1
D,,D15K: GD1K: :
L+L&&L+r0   c                    |                     d                              d          }g }t          |          D ]\  }}|                                r|                    d           /t          |          dk    r/|                    d          dk    r|                    d           q|                    |           dd                    |          z   S )N/z{id}$   -   z{uuid})stripsplit	enumerateisdigitappendrA   countjoin)r   r0   partsnormalized_parts_iparts         r   rD   z,NetworkTrafficMiddleware._normalize_endpointg   s    

3%%c**!%(( 	. 	.HB||~~ . ''////TbTZZ__%9%9 ''1111 ''----SXX.////r   T)__name__
__module____qualname__r?   boolr   r   r   r   r   rY   rP   rD   __classcell__)r   s   @r   r	   r	   
   s        TTTN# #T # # # # # #
! ! !87g 7( 7x 7 7 7 7r
0 
0 
0 
0 
0 
0 
0 
0 
0 
0r   r	   Tr
   c                     |r8|                      t          |           t                              d           d S t                              d           d S )N)r
   z"Network traffic monitoring enabledz#Network traffic monitoring disabled)add_middlewarer	   r&   r'   )r   r
   s     r    setup_network_traffic_monitoringrr   t   sV     ;3WEEE8999999:::::r   Nrj   )collections.abcr   fastapir   r   starlette.middleware.baser   common_loggingr   rk   r&   r	   rn   rr    r   r   <module>rx      s    $ $ $ $ $ $ % % % % % % % % 8 8 8 8 8 8 % % % % % %	H		g0 g0 g0 g0 g01 g0 g0 g0T; ;4 ; ; ; ; ; ;r   