o
    i                     @   sv   d Z ddlZddl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 de	Zdd
efddZdS )zx
Network Traffic Monitoring Middleware

Tracks request/response sizes and bandwidth usage for network traffic analysis.
    N)Callable)RequestResponse)BaseHTTPMiddleware)BytesIOc                       s`   e Zd ZdZg dZddef fddZdd Zd	ed
e	de
fddZdedefddZ  ZS )NetworkTrafficMiddlewarez
    Middleware to track network traffic metrics.

    Captures:
    - Request body size (bytes)
    - Response body size (bytes)
    - Total bandwidth per request
    - Traffic metrics by endpoint, method, tenant
    )z/docsz/redocz/openapi.jsonz/healthz/favicon.icoTenabledc                    s   t  | || _|   d S N)super__init__r   _initialize_metrics)selfappr   	__class__ F/lsinfo/ai/hellotax_ai/base_platform/app/middleware/network_traffic.pyr   $   s   z!NetworkTrafficMiddleware.__init__c                 C   s   | j sdS z3ddlm}m} |ddddgg dd	| _|d
dg dg dd	| _|ddddg| _td W dS  t	yJ   t
d d| _ Y dS w )z2Initialize Prometheus metrics for traffic trackingNr   )	HistogramCounter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   r   r   r   r   )   s4   
z,NetworkTrafficMiddleware._initialize_metricsrequest	call_nextreturnc              
      s(  | j rt fdd| jD r| I dH S d} jdv rhz/  I dH }t|}| j_|  j	j
}| jj j|d| | jjd|d| W n tyg } ztd	|  W Y d}~nd}~ww | I dH }|jd
pvd }|dr|S d}	zu|jd}
|
rt|
}	n(d}|j2 z
3 dH W }||7 }q6 t|}	ddlm} |||jt|j|jd}|	 j_|  j	j
}| jj j|t |jd|	 | jjd|d|	 t ||jd< t |	|jd< t ||	 |jd< W |S  ty } zt!d|  W Y d}~|S d}~ww )z)Process request and track traffic metricsc                 3   s    | ]
} j j|V  qd S r	   )urlpath
startswith).0r+   r'   r   r   	<genexpr>P   s    z4NetworkTrafficMiddleware.dispatch.<locals>.<genexpr>Nr   )POSTPUTPATCH)r   r   inbound)r   r   z Failed to measure request size: zcontent-type ztext/event-streamzcontent-length    )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*   r+   r    labelsobserver"   inc	Exceptionr#   r&   r8   getlowerr,   intbody_iteratorstarlette.responsesr   r7   dictr9   response_sizer!   strerror)r   r'   r(   r@   r=   r   eresponsecontent_typerL   content_lengthresponse_bodychunkStarletteResponser   r.   r   dispatchL   s   



z!NetworkTrafficMiddleware.dispatchr+   c                 C   sx   | dd}g }t|D ]&\}}| r|d qt|dkr/|ddkr/|d q|| qdd| S )z
        Normalize endpoint path for metrics grouping.

        Converts /api/v1/knowledge/bases/123 -> /api/v1/knowledge/bases/{id}
        /z{id}$   -   z{uuid})stripsplit	enumerateisdigitappendr>   countjoin)r   r+   partsnormalized_partsipartr   r   r   rA      s   z,NetworkTrafficMiddleware._normalize_endpointT)__name__
__module____qualname____doc__r<   boolr   r   r   r   r   rV   rM   rA   __classcell__r   r   r   r   r      s    #Zr   Tr   c                 C   s.   |r| j t|d td dS td dS )z
    Setup network traffic monitoring for FastAPI application.

    Args:
        app: FastAPI application instance
        enabled: Whether to enable traffic monitoring
    )r   z"Network traffic monitoring enabledz#Network traffic monitoring disabledN)add_middlewarer   r#   r$   )r   r   r   r   r    setup_network_traffic_monitoring   s   rn   rf   )rj   timeloggingtypingr   fastapir   r   starlette.middleware.baser   ior   	getLoggerrg   r#   r   rk   rn   r   r   r   r   <module>   s    
 -