
     i2                    F   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlZddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlZ ee      j2                  dz  Z ee      5 Z ej:                  e      Zddd       ed   ZejA                  di       Z! e" e
             Z#ed   Z$ eee!      Z% ee%d      Z& ee&g      Z' ejP                  e'        ejR                  e*      Z+e+jY                  ddd      Z-d(dZ.e+jY                  ddd      Z/d)dZ0e+jc                  dg ddd       Z2	 	 	 d*	 	 	 	 	 	 	 	 	 	 	 	 	 d+d!Z3d"ejh                  vr& e"ed#         jk                         ejh                  d"<   d,d$Z6d-d%Z7d.d/d&Z8d0d'Z9 e9e$       y# 1 sw Y   xY w)1at  OpenTelemetry metrics for tracking function usage.

Metrics can be enabled/disabled for the current python kernel:

>>> from pyannote.audio.telemetry.metrics import set_telemetry_metrics
>>> set_telemetry_metrics(True)   # enable
>>> set_telemetry_metrics(False)  # disable

To activate / deactivate globally:

>>> set_telemetry_metrics(True, save_choice_as_default=True)
    )annotationsN)Path)Any)uuid4)metrics)OTLPMetricExporter)MeterProvider)PeriodicExportingMetricReader)__version__zconfig.yamlotlp_endpointotlp_headerstelemetry_log_level)endpointheadersi`  )export_interval_millis)metric_readerszoss-model-initzNumber of model initializations1)namedescriptionunitc                t    t               r.t        j                  dt        | dd      t        t
        d       yy)z
    Increment the model initialization counter.

    Parameters
    ----------
    model : Model
        Instantiated model
       _otel_originunknown)originversion
session_idN)is_metrics_enabledmodel_init_counteraddgetattrr   
SESSION_ID)models    u/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/pyannote/audio/telemetry/metrics.pytrack_model_initr%   ;   s7     !%C&(	
     zoss-pipeline-initz"Number of pipeline initializationsc           	         t               r:t        j                  dt        | dd      t        | dd      t        t
        d       yy)z|
    Track pipeline initialization

    Parameters
    ----------
    pipeline : Pipeline
        Instantiated pipeline
    r   r   r   
_otel_name)r   r   r   r   N)r   pipeline_init_counterr    r!   r   r"   )pipelines    r$   track_pipeline_initr+   W   sC     !!!(NIF,	B&(		
 r&   zoss-pipeline-apply)
         <   x   i,  iX  i  i  i   i@8  ip  iQ zDuration of file in secondss)r   #explicit_bucket_boundaries_advisoryr   r   c                "   t               rddlm}  |       j                  |      }ddlm}  ||||      \  }}}t        j                  |t        | dd      t        | dd      t        t        ||t        j                  |      r|ndd	       y
y
)ad  
    Track duration of files processed by pipelines

    Parameters
    ----------
    pipeline : Pipeline
        The pipeline being applied.
    file : AudioFile
        The audio file being processed by the pipeline.
    num_speakers, min_speakers, max_speakers : int, optional
        Requested number of speakers in the audio file, if applicable.
    r   )Audio)set_num_speakers)num_speakersmin_speakersmax_speakersr   r   r(   inf)r   r   r   r   r6   r7   r8   N)r   pyannote.audio.core.ior4   get_duration*pyannote.audio.pipelines.utils.diarizationr5   file_duration_bucketrecordr!   r   r"   npisfinite)	r*   filer6   r7   r8   kwargsr4   durationr5   s	            r$   track_pipeline_applyrD      s    * 0'..t4O3C%%%4
0lL 	##!(NIF,	B&( , ,02L0Iu	
 r&   PYANNOTE_METRICS_ENABLEDmetrics_enabledc                     dt         j                  vrt        d      t         j                  d   j                         dk(  S )z
    Check if metrics are enabled.

    Returns
    -------
    bool
        True if metrics are enabled, False otherwise.
    rE   z9PYANNOTE_METRICS_ENABLED environment variable is not set.true)osenviron
ValueErrorlower r&   r$   r   r      s:     "3TUU::01779VCCr&   c                    t        t              5 }t        j                  |      }ddd       | d<   t        t        d      5 }t        j                  ||       ddd       y# 1 sw Y   >xY w# 1 sw Y   yxY w)z
    Save metrics state to the configuration file.

    Parameters
    ----------
    enabled : bool
        Whether metrics should be enabled or disabled.
    NrF   w)openCONFIG_FILEyaml	safe_load	safe_dump)enabledfconfigs      r$   _save_metrics_configrX      sb     
k	a" 
 !(F	k3	1vq! 
 	 
	
 
 	s   A#A/#A,/A8c                    t        |       } t        |       j                         t        j                  d<   |rt        |        yy)a  
    Enable or disable metrics globally.

    Parameters
    ----------
    enabled : bool
        Whether to enable or disable the metrics.
    save_choice_as_default : bool, optional
        If True, saves the state to the configuration file as the default value.
    rE   N)boolstrrL   rI   rJ   rX   )rU   save_choice_as_defaults     r$   set_telemetry_metricsr]      s9     7mG-0\-?-?-ABJJ)*W% r&   c                H   d}| j                         } | |vrt        ddj                  |             t        t        |       }t        j
                  j                  j                  D ]8  }|j                  d      st	        j                  |      j                  |       : y)ac  
    Set the log level for OpenTelemetry loggers to control error visibility.

    This can be used to suppress error messages when telemetry fails.

    Parameters
    ----------
    level : str
        The log level to set. Must be one of: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'.

        - 'DEBUG': Show all messages including detailed debugging information
        - 'INFO': Show informational messages, warnings and errors
        - 'WARNING': Show only warnings and errors (default)
        - 'ERROR': Show only errors
        - 'CRITICAL': Show only critical errors

    Raises
    ------
    ValueError
        If the provided level is not a valid logging level.

    Examples
    --------
    To suppress most error messages:

    >>> set_opentelemetry_log_level('ERROR')

    To show all messages:

    >>> set_opentelemetry_log_level('DEBUG')
    )DEBUGINFOWARNINGERRORCRITICALzLog level must be one of: z, opentelemetryN)upperrK   joinr!   loggingrootmanager
loggerDict
startswith	getLoggersetLevel)levelvalid_levelslogging_levellogger_names       r$   set_opentelemetry_log_levelrr      s    @ ELKKMEL 5dii6M5NOPP GU+M ||++66!!/2k*33MB 7r&   )r#   z'Model'returnNone)r*   
'Pipeline'rs   rt   )NNN)r*   ru   rA   z'AudioFile'r6   
int | Noner7   rv   r8   rv   rB   r   rs   rt   )rs   rZ   )rU   rZ   rs   rt   )F)rU   rZ   r\   rZ   rs   rt   )rn   r[   rs   rt   ):__doc__
__future__r   rg   rI   pathlibr   typingr   uuidr   rR   rd   r   6opentelemetry.exporter.otlp.proto.http.metric_exporterr   opentelemetry.sdk.metricsr	    opentelemetry.sdk.metrics.exportr
   pyannote.audior   numpyr?   __file__parentrQ   rP   config_file_streamrS   CONFIGOTLP_ENDPOINTgetOTLP_HEADERSr[   r"   DEFAULT_LOG_LEVELexporterreaderproviderset_meter_provider	get_meter__name__metercreate_counterr   r%   r)   r+   create_histogramr=   rD   rJ   rL   r   rX   r]   rr   rM   r&   r$   <module>r      s	   #  	     ! U 3 J & 8n##m3 
+,T^^./F  'zz."-\
01  }lK	&x	N1   8 $(# ))	1	 *  
* ,,	4	 -  
* --	) .	% .  0  $##+
+

+
 +
 	+

 +
 +
 
+
\ RZZ/-08I1J-K-Q-Q-SBJJ)*D "$&",C^ - .c s   &FF 