
    k7i                     d    S r SSKrSSKrSSKJr  SSKJrJrJr   " S S\5      r	 " S S	\5      r
g)
z@Timing middleware for measuring and logging request performance.    N)Any   )CallNext
MiddlewareMiddlewareContextc                   v    \ rS rSrSrS\R                  4S\R                  S-  S\4S jjr	S\
S\S	\4S
 jrSrg)TimingMiddleware
   a  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                 X    U=(       d    [         R                  " S5      U l        X l        g)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      Z/home/james-whalen/.local/lib/python3.13/site-packages/fastmcp/server/middleware/timing.py__init__TimingMiddleware.__init__   s!     C 1 12B C"    context	call_nextreturnc           
        #    UR                   =(       d    Sn[        R                  " 5       n U" U5      I Sh  vN n[        R                  " 5       U-
  S-  nU R                  R	                  U R
                  SU SUS S35        U$  NO! [         aQ  n[        R                  " 5       U-
  S-  nU R                  R	                  U R
                  SU SUS S	U 35        e SnAff = f7f)
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_request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)r   r   )__name__
__module____qualname____firstlineno____doc__r   INFOLoggerintr   r   r   r   r+   __static_attributes__ r   r   r	   r	   
   sL    " /3W\\
#nnt+
#?B
#(9 h SV r   r	   c                      \ rS rSrSrS\R                  4S\R                  S-  S\4S jjr	S\
S\S	\S
\4S jrS\
S\S
\4S jrS\
S\S
\4S jrS\
S\S
\4S jrS\
S\S
\4S jrS\
S\S
\4S jrS\
S\S
\4S jrS\
S\S
\4S jrSrg)DetailedTimingMiddleware<   a  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                 X    U=(       d    [         R                  " S5      U l        X l        g)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   !DetailedTimingMiddleware.__init__O   s!     L 1 12K L"r   r   r   operation_namer   c           	        #    [         R                  " 5       n U" U5      I Sh  vN n[         R                  " 5       U-
  S-  nU R                  R                  U R                  U SUS S35        U$  NN! [
         aP  n[         R                  " 5       U-
  S-  nU R                  R                  U R                  U SUS SU 35        e SnAff = f7f)z$Helper method to time any operation.Nr   r   r   r   r    r!   )r#   r$   r   r%   r   r&   )r   r   r   r=   r'   r(   r)   r*   s           r   _time_operation(DetailedTimingMiddleware._time_operation[   s      &&(
	$W--F,,.;tCKKKOO>"2.S@QQS T M .  	,,.;tCKKKOO!".S0AaSI 	s:   CA5 A3AA5 2C3A5 5
C?AC

CCc                 x   #    [        UR                  SS5      nU R                  XSU S35      I Sh  vN $  N7f)zTime tool execution.namer   zTool ''Ngetattrmessager?   )r   r   r   	tool_names       r   on_call_tool%DetailedTimingMiddleware.on_call_toolo   s<      GOOVY?	))'ykQR>STTTT   1:8:c                 x   #    [        UR                  SS5      nU R                  XSU S35      I Sh  vN $  N7f)zTime resource reading.urir   z
Resource 'rC   NrD   )r   r   r   resource_uris       r   on_read_resource)DetailedTimingMiddleware.on_read_resourcev   sD      wyA))*\N! <
 
 	
 
rJ   c                 x   #    [        UR                  SS5      nU R                  XSU S35      I Sh  vN $  N7f)zTime prompt retrieval.rB   r   zPrompt 'rC   NrD   )r   r   r   prompt_names       r   on_get_prompt&DetailedTimingMiddleware.on_get_prompt   s<      goovyA))'UV>WXXXXrJ   c                 B   #    U R                  XS5      I Sh  vN $  N7f)zTime tool listing.z
List toolsNr?   r   r   r   s      r   on_list_tools&DetailedTimingMiddleware.on_list_tools   s       ))'lKKKK   c                 B   #    U R                  XS5      I Sh  vN $  N7f)zTime resource listing.zList resourcesNrU   rV   s      r   on_list_resources*DetailedTimingMiddleware.on_list_resources   s!      ))'>NOOOOrY   c                 B   #    U R                  XS5      I Sh  vN $  N7f)zTime resource template listing.zList resource templatesNrU   rV   s      r   on_list_resource_templates3DetailedTimingMiddleware.on_list_resource_templates   s!      ))'>WXXXXrY   c                 B   #    U R                  XS5      I Sh  vN $  N7f)zTime prompt listing.zList promptsNrU   rV   s      r   on_list_prompts(DetailedTimingMiddleware.on_list_prompts   s       ))'nMMMMrY   r-   )r.   r/   r0   r1   r2   r   r3   r4   r5   r   r   r   strr   r?   rH   rN   rR   rW   r[   r^   ra   r6   r7   r   r   r9   r9   <   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   r9   )r2   r   r#   typingr   
middlewarer   r   r   r	   r9   r7   r   r   <module>rf      s4    F    ? ?/z /d`Nz `Nr   