
    "<i                     r    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
dS )
z@Timing middleware for measuring and logging request performance.    N)Any   )CallNext
MiddlewareMiddlewareContextc                   V    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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                 J    |pt          j        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   s      /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/fastmcp/server/middleware/timing.py__init__zTimingMiddleware.__init__   s'     C 12B C C"    context	call_nextreturnc           
        K   |j         pd}t          j                    }	  ||           d{V }t          j                    |z
  dz  }| j                            | j        d| d|dd           |S # t          $ rI}t          j                    |z
  dz  }| j                            | j        d| d|dd	|             d}~ww xY 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&((
	$9W--------F,..;tCKKOO T6 T T T T T T   M 	 	 	,..;tCKKOOI6IIIIIaII   	s   AA4 4
C>ACC)__name__
__module____qualname____doc__r   INFOLoggerintr   r   r   r   r)    r   r   r	   r	   
   s         " /3W\
# 
#nt+
#?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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                 J    |pt          j        d          | _        || _        dS )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 12K L L"r   r   r   operation_namer   c           	      ~  K   t          j                    }	  ||           d{V }t          j                    |z
  dz  }| j                            | j        | d|dd           |S # t
          $ rH}t          j                    |z
  dz  }| j                            | j        | d|dd|             d}~ww xY 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      &((
	$9W--------F,..;tCKKOO> T T T T T T   M 	 	 	,..;tCKKOO!IIIIIaII   	s   AA* *
B<4AB77B<c                 t   K   t          |j        dd          }|                     ||d| d           d{V S )zTime tool execution.namer   zTool ''Ngetattrmessager7   )r   r   r   	tool_names       r   on_call_toolz%DetailedTimingMiddleware.on_call_toolo   sQ       GOVY??	))'9>Sy>S>S>STTTTTTTTTr   c                 t   K   t          |j        dd          }|                     ||d| d           d{V S )zTime resource reading.urir   z
Resource 'r:   Nr;   )r   r   r   resource_uris       r   on_read_resourcez)DetailedTimingMiddleware.on_read_resourcev   sd       wyAA))Y <\ < < <
 
 
 
 
 
 
 
 	
r   c                 t   K   t          |j        dd          }|                     ||d| d           d{V S )zTime prompt retrieval.r9   r   zPrompt 'r:   Nr;   )r   r   r   prompt_names       r   on_get_promptz&DetailedTimingMiddleware.on_get_prompt   sQ       govyAA))'9>W>W>W>WXXXXXXXXXr   c                 @   K   |                      ||d           d{V S )zTime tool listing.z
List toolsNr7   r   r   r   s      r   on_list_toolsz&DetailedTimingMiddleware.on_list_tools   s2       ))'9lKKKKKKKKKr   c                 @   K   |                      ||d           d{V S )zTime resource listing.zList resourcesNrH   rI   s      r   on_list_resourcesz*DetailedTimingMiddleware.on_list_resources   s3       ))'9>NOOOOOOOOOr   c                 @   K   |                      ||d           d{V S )zTime resource template listing.zList resource templatesNrH   rI   s      r   on_list_resource_templatesz3DetailedTimingMiddleware.on_list_resource_templates   s3       ))'9>WXXXXXXXXXr   c                 @   K   |                      ||d           d{V S )zTime prompt listing.zList promptsNrH   rI   s      r   on_list_promptsz(DetailedTimingMiddleware.on_list_prompts   s2       ))'9nMMMMMMMMMr   )r*   r+   r,   r-   r   r.   r/   r0   r   r   r   strr   r7   r?   rC   rF   rJ   rL   rN   rP   r1   r   r   r3   r3   <   s        & /3W\
# 
#nt+
#?B
# 
# 
# 
#(5=OR	   (U(U5=U	U U U U
(
5=
	
 
 
 
Y(Y5=Y	Y Y Y YL(L5=L	L L L LP(P5=P	P P P PY(Y5=Y	Y Y Y YN(N5=N	N N N N N Nr   r3   )r-   r   r!   typingr   
middlewarer   r   r   r	   r3   r1   r   r   <module>rT      s    F F         ? ? ? ? ? ? ? ? ? ?/ / / / /z / / /d`N `N `N `N `Nz `N `N `N `N `Nr   