o
    i                   
   @   s"  U d Z ddlZddlmZ zddlmZmZmZmZm	Z	m
Z
 dZW n ey,   dZY nw daed ed< daed	 ed
< daed	 ed< daed	 ed< daed ed< daed ed< daed ed< daed ed< daed ed< daed ed< ded fddZd>ddZdedefddZdedededdfd d!Zd"ed#edededdf
d$d%Z d"ed&ededdfd'd(Z!d)edededdfd*d+Z"d,ededdfd-d.Z#d#ededdfd/d0Z$d1ededdfd2d3Z%d#ed4eddfd5d6Z&d7ed4eddfd8d9Z'defd:d;Z(defd<d=Z)dS )?a  
Prometheus metrics for Veena3 TTS service.

Features:
- Request counters (by speaker, format, status)
- TTFB histogram
- RTF histogram
- Audio duration histogram
- Model load time gauge

Usage:
    from veena3modal.shared.metrics import record_request_received, record_ttfb
    
    record_request_received(speaker="lipakshi", stream=True, format="wav")
    record_ttfb(ttfb_seconds=0.25, speaker="lipakshi", stream=True)
    N)Optional)Counter	HistogramGaugeCollectorRegistrygenerate_latestCONTENT_TYPE_LATESTTFr   	_registryr   _requests_total_requests_completed_requests_failedr   _ttfb_seconds_rtf_audio_duration_seconds_chunks_sentr   _model_load_seconds_model_loadedreturnc                   C   s    t sdS tdu rt at  tS )z#Get or create the metrics registry.N)PROMETHEUS_AVAILABLEr	   r   _initialize_metrics r   r   5/home/ubuntu/veenaModal/veena3modal/shared/metrics.pyget_metrics_registry/   s   r   c                   C   s   t rtdu rdS tddg dtdatddg dtdatd	d
g dtdatddddgdtdatdddgdtdatdddgdtda	tdddgdtda
tdddgtdatdddgtdadS ) z)Initialize all metrics with the registry.Nveena3_tts_requests_totalzTotal TTS requests receivedspeakerstreamformatregistry#veena3_tts_requests_completed_totalz)Total TTS requests completed successfullyr   r   status_code veena3_tts_requests_failed_totalzTotal TTS requests failedr   
error_coder"   veena3_tts_ttfb_secondszTime to first byte in secondsr   r   )
皙?g      ?      ?g      ?      ?      ?       @g      @g      @g      $@)bucketsr   veena3_tts_rtfz3Real-time factor (generation_time / audio_duration))r'   g?g333333?g?r(   g333333?gffffff?g?g?r)   r*   r+   !veena3_tts_audio_duration_secondsz#Generated audio duration in seconds)	         
         <   x   i,  veena3_tts_chunks_sentz-Number of audio chunks sent in streaming mode)r/   r0   r1   r2   r3   2   d   veena3_tts_model_load_secondszTime taken to load the modelmodel_versionveena3_tts_model_loadedz*Whether the model is loaded (1) or not (0))r   r	   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   =   sx   	
r   valuec                 C   s.   t ddt| }|r|d  rd| }|S )zw
    Sanitize a string for use as a Prometheus label.
    
    Prometheus labels must match [a-zA-Z_][a-zA-Z0-9_]*
    z[^a-zA-Z0-9_]_r   )resubstrisdigit)r=   	sanitizedr   r   r   sanitize_label   s   rD   r   r   r   c                 C   sB   t du rt  t durt jt| t| t|d  dS dS )zRecord a request received.Nr   )r
   r   labelsrD   rA   lowerincr   r   r   r   record_request_received   s   

rH   r"   duration_secondsc                 C   sB   t du rt  t durt jt|t| t| d  dS dS )z'Record a successful request completion.Nr!   )r   r   rE   rD   rA   rF   rG   )r"   rI   r   r   r   r   r   record_request_completed   s   

rJ   r%   c                 C   s>   t du rt  t durt jt|t|t| d  dS dS )zRecord a failed request.Nr$   )r   r   rE   rD   rA   rG   )r"   r%   r   r   r   r   record_request_failed   s   
rK   ttfb_secondsc                 C   s>   t du rt  t durt jt|t| d|  dS dS )zRecord time to first byte.N)r   r   )r   r   rE   rD   rA   rF   observe)rL   r   r   r   r   r   record_ttfb   s   
rN   rtfc                 C   4   t du rt  t durt jt|d|  dS dS )zRecord real-time factor.Nr   )r   r   rE   rD   rM   )rO   r   r   r   r   
record_rtf      rR   c                 C   rP   )z Record generated audio duration.NrQ   )r   r   rE   rD   rM   )rI   r   r   r   r   record_audio_duration   rS   rT   chunksc                 C   rP   )z*Record number of chunks sent in streaming.NrQ   )r   r   rE   rD   rM   )rU   r   r   r   r   record_chunks_sent   rS   rV   r;   c                 C   rP   )zRecord model loading time.Nr;   )r   r   rE   rD   set)rI   r;   r   r   r   record_model_load_time	  rS   rY   loadedc                 C   s<   t du rt  t durt jt|d| rdnd dS dS )zSet model loaded status.NrW   r/   r   )r   r   rE   rD   rX   )rZ   r;   r   r   r   set_model_loaded  s   r[   c                  C   s$   t  } tr	| du rdS t| dS )zp
    Get metrics in Prometheus text format.
    
    Returns:
        Prometheus text format metrics string
    Nz"# Prometheus client not available
zutf-8)r   r   r   decoder   r   r   r   get_metrics_text%  s   r]   c                   C   s   t rtS dS )z,Get the content type for Prometheus metrics.ztext/plain; charset=utf-8)r   r   r   r   r   r   get_content_type4  s   r^   )r   N)*__doc__r?   typingr   prometheus_clientr   r   r   r   r   r   r   ImportErrorr	   __annotations__r
   r   r   r   r   r   r   r   r   r   r   rA   rD   boolrH   intfloatrJ   rK   rN   rR   rT   rV   rY   r[   r]   r^   r   r   r   r   <module>   s     
P








