
    Ki                     d    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e      Z	 G d d	e      Z
y)
z@Timing middleware for measuring and logging request performance.    N)Any   )CallNext
MiddlewareMiddlewareContextc                   h    e Zd ZdZdej
                  fdej                  dz  defdZde	de
defd	Zy)
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                 N    |xs t        j                  d      | _        || _        y)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   s      l/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fastmcp/server/middleware/timing.py__init__zTimingMiddleware.__init__   s#     C 1 12B C"    context	call_nextreturnc           
        K   |j                   xs d}t        j                         }	  ||       d{   }t        j                         |z
  dz  }| j                  j	                  | j
                  d| d|dd       |S 7 N# t        $ rP}t        j                         |z
  dz  }| j                  j	                  | j
                  d| d|dd	|         d}~ww xY 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es           r   
on_requestzTimingMiddleware.on_request'   s     ,9&&(
	$W--F,,.;tCKKKOO(6(.S@QQS T M .  	,,.;tCKKKOO6(.S0AaSI 	s:   %C B BAB C B 	CACCC )__name__
__module____qualname____doc__r   INFOLoggerintr   r   r   r   r)    r   r   r	   r	   
   sL    " /3W\\
#nnt+
#?B
#(9 h SV r   r	   c                       e Zd ZdZdej
                  fdej                  dz  defdZde	de
ded	efd
Zde	de
d	efdZde	de
d	efdZde	de
d	efdZde	de
d	efdZde	de
d	efdZde	de
d	efdZde	de
d	efdZy)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                 N    |xs t        j                  d      | _        || _        y)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   s      r   r   z!DetailedTimingMiddleware.__init__O   s#     L 1 12K L"r   r   r   operation_namer   c           	        K   t        j                         }	  ||       d{   }t        j                         |z
  dz  }| j                  j                  | j                  | d|dd       |S 7 M# t
        $ rO}t        j                         |z
  dz  }| j                  j                  | j                  | d|dd|         d}~ww xY ww)z$Helper method to time any operation.Nr   r   r   r   r   r   )r!   r"   r
   r#   r   r$   )r   r   r   r5   r%   r&   r'   r(   s           r   _time_operationz(DetailedTimingMiddleware._time_operation[   s      &&(
	$W--F,,.;tCKKKOO>"2.S@QQS T M .  	,,.;tCKKKOO!".S0AaSI 	s:   CA3 A1AA3 0C1A3 3	C<A
CCCc                 z   K   t        |j                  dd      }| j                  ||d| d       d{   S 7 w)zTime tool execution.namer   zTool ''Ngetattrmessager7   )r   r   r   	tool_names       r   on_call_toolz%DetailedTimingMiddleware.on_call_toolo   s?      GOOVY?	))'9ykQR>STTTT   2;9;c                 z   K   t        |j                  dd      }| j                  ||d| d       d{   S 7 w)zTime resource reading.urir   z
Resource 'r:   Nr;   )r   r   r   resource_uris       r   on_read_resourcez)DetailedTimingMiddleware.on_read_resourcev   sG      wyA))Y*\N! <
 
 	
 
r@   c                 z   K   t        |j                  dd      }| j                  ||d| d       d{   S 7 w)zTime prompt retrieval.r9   r   zPrompt 'r:   Nr;   )r   r   r   prompt_names       r   on_get_promptz&DetailedTimingMiddleware.on_get_prompt   s?      goovyA))'9UV>WXXXXr@   c                 D   K   | j                  ||d       d{   S 7 w)zTime tool listing.z
List toolsNr7   r   r   r   s      r   on_list_toolsz&DetailedTimingMiddleware.on_list_tools   s#      ))'9lKKKK     c                 D   K   | j                  ||d       d{   S 7 w)zTime resource listing.zList resourcesNrI   rJ   s      r   on_list_resourcesz*DetailedTimingMiddleware.on_list_resources   s$      ))'9>NOOOOrL   c                 D   K   | j                  ||d       d{   S 7 w)zTime resource template listing.zList resource templatesNrI   rJ   s      r   on_list_resource_templatesz3DetailedTimingMiddleware.on_list_resource_templates   s$      ))'9>WXXXXrL   c                 D   K   | j                  ||d       d{   S 7 w)zTime prompt listing.zList promptsNrI   rJ   s      r   on_list_promptsz(DetailedTimingMiddleware.on_list_prompts   s#      ))'9nMMMMrL   )r*   r+   r,   r-   r   r.   r/   r0   r   r   r   strr   r7   r?   rD   rG   rK   rN   rP   rR   r1   r   r   r3   r3   <   s8   & /3W\\
#nnt+
#?B
#(5=OR	(U(U5=U	U
(
5=
	
Y(Y5=Y	YL(L5=L	LP(P5=P	PY(Y5=Y	YN(N5=N	Nr   r3   )r-   r   r!   typingr   
middlewarer   r   r   r	   r3   r1   r   r   <module>rV      s4    F    ? ?/z /d`Nz `Nr   