o
    i                     @   sX   d Z ddlZddlZddlmZ ddlmZmZmZ G dd deZ	G dd	 d	eZ
dS )
z@Timing middleware for measuring and logging request performance.    N)Any   )CallNext
MiddlewareMiddlewareContextc                   @   sF   e Zd ZdZdejfdejdB defddZde	de
d	efd
dZdS )TimingMiddlewarea  Middleware that logs the execution time of requests.

    Only measures and logs timing for request messages (not notifications).
    Provides insights into performance characteristics of your MCP server.

    Example:
        ```python
        from fastmcp.server.middleware.timing import TimingMiddleware

        mcp = FastMCP("MyServer")
        mcp.add_middleware(TimingMiddleware())

        # Now all requests will be timed and logged
        ```
    Nlogger	log_levelc                 C      |pt d| _|| _dS )zInitialize timing middleware.

        Args:
            logger: Logger instance to use. If None, creates a logger named 'fastmcp.timing'
            log_level: Log level for timing messages (default: INFO)
        zfastmcp.timingNlogging	getLoggerr   r	   selfr   r	    r   f/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/fastmcp/server/middleware/timing.py__init__      	
zTimingMiddleware.__init__context	call_nextreturnc                    s   |j pd}t }z"||I dH }t | d }| j| jd| d|dd |W S  tyS } zt | d }| j| jd| d|dd	|   d}~ww )
z+Time request execution and log the results.unknownN  zRequest  completed in .2fms failed after ms: )methodtimeperf_counterr   logr	   	Exception)r   r   r   r   
start_timeresultduration_mser   r   r   
on_request'   s&   
zTimingMiddleware.on_request)__name__
__module____qualname____doc__r   INFOLoggerintr   r   r   r   r'   r   r   r   r   r   
   s    
r   c                   @   s   e Zd ZdZdejfdejdB defddZde	de
d	ed
efddZde	de
d
efddZde	de
d
efddZde	de
d
efddZde	de
d
efddZde	de
d
efddZde	de
d
efddZde	de
d
efddZdS )DetailedTimingMiddlewarea&  Enhanced timing middleware with per-operation breakdowns.

    Provides detailed timing information for different types of MCP operations,
    allowing you to identify performance bottlenecks in specific operations.

    Example:
        ```python
        from fastmcp.server.middleware.timing import DetailedTimingMiddleware
        import logging

        # Configure logging to see the output
        logging.basicConfig(level=logging.INFO)

        mcp = FastMCP("MyServer")
        mcp.add_middleware(DetailedTimingMiddleware())
        ```
    Nr   r	   c                 C   r
   )zInitialize detailed timing middleware.

        Args:
            logger: Logger instance to use. If None, creates a logger named 'fastmcp.timing.detailed'
            log_level: Log level for timing messages (default: INFO)
        zfastmcp.timing.detailedNr   r   r   r   r   r   O   r   z!DetailedTimingMiddleware.__init__r   r   operation_namer   c                    s   t  }z!||I dH }t  | d }| j| j| d|dd |W S  tyL } zt  | d }| j| j| d|dd|   d}~ww )z$Helper method to time any operation.Nr   r   r   r   r   r   )r   r    r   r!   r	   r"   )r   r   r   r0   r#   r$   r%   r&   r   r   r   _time_operation[   s$   z(DetailedTimingMiddleware._time_operationc                    ,   t |jdd}| ||d| dI dH S )zTime tool execution.namer   zTool ''Ngetattrmessager1   )r   r   r   	tool_namer   r   r   on_call_toolo      z%DetailedTimingMiddleware.on_call_toolc                    r2   )zTime resource reading.urir   z
Resource 'r4   Nr5   )r   r   r   resource_urir   r   r   on_read_resourcev   s
   
z)DetailedTimingMiddleware.on_read_resourcec                    r2   )zTime prompt retrieval.r3   r   zPrompt 'r4   Nr5   )r   r   r   prompt_namer   r   r   on_get_prompt   r:   z&DetailedTimingMiddleware.on_get_promptc                       |  ||dI dH S )zTime tool listing.z
List toolsNr1   r   r   r   r   r   r   on_list_tools      z&DetailedTimingMiddleware.on_list_toolsc                    r@   )zTime resource listing.zList resourcesNrA   rB   r   r   r   on_list_resources   rD   z*DetailedTimingMiddleware.on_list_resourcesc                    r@   )zTime resource template listing.zList resource templatesNrA   rB   r   r   r   on_list_resource_templates   rD   z3DetailedTimingMiddleware.on_list_resource_templatesc                    r@   )zTime prompt listing.zList promptsNrA   rB   r   r   r   on_list_prompts   rD   z(DetailedTimingMiddleware.on_list_prompts)r(   r)   r*   r+   r   r,   r-   r.   r   r   r   strr   r1   r9   r=   r?   rC   rE   rF   rG   r   r   r   r   r/   <   s    



	



r/   )r+   r   r   typingr   
middlewarer   r   r   r   r/   r   r   r   r   <module>   s    2