
    qis                         d Z ddlmZmZmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZ ddlmZmZ  G d de      Zy	)
zMetrics logging observer for Pipecat.

This module provides an observer that logs metrics frames to the console,
allowing developers to monitor performance metrics, token usage, and other
statistics in real-time.
    )OptionalSetType)logger)MetricsFrame)LLMTokenUsageLLMUsageMetricsDataMetricsDataProcessingMetricsDataSmartTurnMetricsDataTTFBMetricsDataTTSUsageMetricsDataTurnMetricsData)BaseObserverFramePushedc                        e Zd ZdZ	 ddeeee         f fdZde	fdZ
dedefdZded	efd
Zdededed	efdZdededed	efdZ xZS )MetricsLogObservera{  Observer to log metrics activity to the console.

    Monitors and logs all MetricsFrame instances, including:

    - TTFBMetricsData (Time To First Byte)
    - ProcessingMetricsData (General processing time)
    - LLMUsageMetricsData (Token usage statistics)
    - TTSUsageMetricsData (Text-to-Speech character counts)
    - TurnMetricsData (Turn prediction metrics)

    This allows developers to track performance metrics, token usage,
    and other statistics throughout the pipeline.

    Examples:
        Log all metrics types::

            observers = [MetricsLogObserver()]

        Log only LLM and TTS metrics::

            from pipecat.metrics.metrics import LLMUsageMetricsData, TTSUsageMetricsData
            observers = [
                MetricsLogObserver(
                    include_metrics={LLMUsageMetricsData, TTSUsageMetricsData}
                )
            ]
    include_metricsc                     t        |   di | |r6t        |v r.ddl}|j	                  dt
        d       |t        hz
  t        hz  }|| _        t               | _	        y)a%  Initialize the metrics log observer.

        Args:
            include_metrics: Set of metrics types to include. If specified, only these
                metrics types will be logged. If None, all metrics are logged.
            **kwargs: Additional arguments passed to parent class.
        r   NzSSmartTurnMetricsData is deprecated in include_metrics, use TurnMetricsData instead.   )
stacklevel )
super__init__r   warningswarnDeprecationWarningr   _include_metricsset_frames_seen)selfr   kwargsr   	__class__s       `/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/observers/loggers/metrics_log_observer.pyr   zMetricsLogObserver.__init__=   si     	"6"3FMM/"	    /2F1GGOK\\O /E    datac                 N  K   |j                   }|j                  }t        |t              sy|j                  | j
                  v ry| j
                  j                  |j                         |dz  }|j                  D ]&  }| j                  |      s| j                  ||       ( yw)a'  Handle frame push events and log metrics frames.

        Logs MetricsFrame instances with detailed information about the
        metrics data, formatted appropriately for each metrics type.

        Args:
            data: Frame push event data containing source, frame, and timestamp.
        Ni ʚ;)
frame	timestamp
isinstancer   idr    addr&   _should_log_metrics_log_metrics_data)r!   r&   r(   r)   time_secmetrics_datas         r$   on_push_framez MetricsLogObserver.on_push_frameX   s      

NN	%. 88t(((ehh'}, "JJ 	;L++L9""<:	;s   B#B%r0   returnc                 J    | j                   t        |      | j                   v S y)zDetermine if a metrics data item should be logged based on filters.

        Args:
            metrics_data: The metrics data to check.

        Returns:
            True if the metrics should be logged, False otherwise.
        T)r   type)r!   r0   s     r$   r-   z&MetricsLogObserver._should_log_metricsw   s+       ,%)>)>>> r%   r/   c                    d|j                    d}|j                  rd|j                   dnd}t        |t              r.t	        j
                  d| d| d|j                   d	|d
d	       yt        |t              r.t	        j
                  d| d| d|j                   d	|d
d	       yt        |t              r| j                  ||||       yt        |t              r.t	        j
                  d| d| d|j                   d|d
d	       yt        |t              r| j                  ||||       yt	        j
                  d| d| d| d|d
d	       y)zLog a single metrics data item.

        Args:
            metrics_data: The metrics data to log.
            time_sec: Timestamp in seconds.
        []z ()    📊 z TTFB: zs at z.3fsz PROCESSING TIMEz
 TTS USAGEz characters at z METRICS at N)	processormodelr*   r   r   debugvaluer   r	   _log_llm_usager   r   	_log_turn)r!   r0   r/   processor_info
model_infos        r$   r.   z$MetricsLogObserver._log_metrics_data   sv    \334A63?3E3Er,,,-Q/2
lO4LL'uZL<;M;M:NeT\]`Saabc &;<LL''7
|2lFXFXEYY^_ghk^llmn &9:nj(S&9:LL'z*R@R@R?SSbcklobppqr o6NN<XN LL'x
|2l^4PXY\~]^_r%   rD   rE   c                    |j                   }d|j                   d|j                   d|j                   g}|j                  |j                  d|j                          |j                  |j                  d|j                          |j                  |j                  d|j                          dj                  |      }t        j                  d	| d
| d| d|dd	       y)a  Log LLM token usage metrics.

        Args:
            metrics_data: The LLM usage metrics data.
            processor_info: Formatted processor name string.
            model_info: Formatted model name string.
            time_sec: Timestamp in seconds.
        zprompt: zcompletion: ztotal: Nzcache_read: zcache_creation: zreasoning: z, r:   z LLM TOKEN USAGEr;   r=   .2fr<   )rA   prompt_tokenscompletion_tokenstotal_tokenscache_read_input_tokensappendcache_creation_input_tokensreasoning_tokensjoinr   r@   )r!   r0   rD   rE   r/   usagedetails	usage_strs           r$   rB   z!MetricsLogObserver._log_llm_usage   s      ,11 u**+,52234e(()*
 ((4NN\%*G*G)HIJ,,8NN-e.O.O-PQR!!-NN[)?)?(@ABIIg&	N##3J<r)DQYZ]P^^_`	
r%   c                     |j                   rdnd}|j                  dd}t        j                  d| d| d| d|j                  d	d
| d|dd       y)a  Log turn prediction metrics.

        Args:
            metrics_data: The turn metrics data.
            processor_info: Formatted processor name string.
            model_info: Formatted model name string.
            time_sec: Timestamp in seconds.
        COMPLETE
INCOMPLETEz.1fmsr:   z TURNr;   z (probability: z.2%z, e2e: z) at rG   r<   N)is_completee2e_processing_time_msr   r@   probability)r!   r0   rD   rE   r/   complete_stre2e_strs          r$   rC   zMetricsLogObserver._log_turn   sy     &2%=%=z<!88=R@N#5B|n E)55c: ;9 3q"	
r%   )N)__name__
__module____qualname____doc__r   r   r   r
   r   r   r1   boolr-   floatr.   r	   strrB   r   rC   __classcell__)r#   s   @r$   r   r       s    < =A"!#d;&7"89"6; ;>   k U @%
)%
 %
 	%

 %
N
%
 
 	

 
r%   r   N)r_   typingr   r   r   logurur   pipecat.frames.framesr   pipecat.metrics.metricsr   r	   r
   r   r   r   r   r   pipecat.observers.base_observerr   r   r   r   r%   r$   <module>ri      s;    ' &  .	 	 	 FE
 E
r%   