o
    پij
                     @   sH   d Z ddlZddlmZmZmZmZmZ G dd dZG dd dZ	dS )a7  Gauge with gt/le bucket labels for Grafana heatmap visualization.

Unlike Prometheus Histogram which uses cumulative buckets, this uses
non-cumulative buckets (gt < value <= le) suitable for heatmap display.

Note: Keep in sync with Rust implementation in
sgl-model-gateway/src/observability/gauge_histogram.rs
    N)DictIteratorListTupleUnionc                   @   st   e Zd ZdZdeeeef  fddZdefddZ	de
eeef  fdd	Zd
eeeef  dee fddZdS )BucketLabelsz>Bucket label pairs and count computation for a GaugeHistogram.upper_boundsc                 C   sj   || _ g | _t|D ]\}}|dkr||d  nd}| jt|t|f q
| jt|d df d S )Nr      z+Inf)_upper_bounds_labels	enumerateappendstr)selfr   iupperlower r   T/home/ubuntu/.local/lib/python3.10/site-packages/sglang/srt/utils/gauge_histogram.py__init__   s   zBucketLabels.__init__returnc                 C   
   t | jS N)lenr   r   r   r   r   __len__      
zBucketLabels.__len__c                 C   r   r   )iterr   r   r   r   r   __iter__   r   zBucketLabels.__iter__observationsc                 C   s:   dgt |  }|D ]}t| j|}||  d7  < q	|S )zECompute how many observations fall into each bucket. O(n) complexity.r   r	   )r   bisectbisect_leftr   )r   r    countsvidxr   r   r   compute_bucket_counts   s
   z"BucketLabels.compute_bucket_countsN)__name__
__module____qualname____doc__r   r   intfloatr   r   r   r   r   r   r&   r   r   r   r   r      s    &r   c                   @   s   e Zd ZdZ	ddededee deeeef  def
dd	Z	d
e
eef dee fddZd
e
eef deeeef  fddZdefddZdS )GaugeHistogramzAGauge with gt/le bucket labels for Grafana heatmap visualization.
mostrecentnamedocumentation
labelnamesbucket_boundsmultiprocess_modec                 C   s8   ddl m} t|| _|||t|ddg |d| _d S )Nr   )Gaugegtle)r/   r0   r1   r3   )prometheus_clientr4   r   _bucketslist_gauge)r   r/   r0   r1   r2   r3   r4   r   r   r   r   ,   s   
zGaugeHistogram.__init__labelsvaluesc                 C   s@   t | j|D ]\\}}}| jjdi |||d| qdS )zSet bucket counts directly.)r5   r6   Nr   )zipr8   r:   r;   set)r   r;   r<   r5   r6   countr   r   r   set_raw?   s   $zGaugeHistogram.set_rawr    c                 C   s   | j |}| || dS )z5Compute bucket counts from observations and set them.N)r8   r&   r@   )r   r;   r    r#   r   r   r   set_by_current_observationsD   s   z*GaugeHistogram.set_by_current_observationsr   c                 C   s   | j S r   )r8   r   r   r   r   bucketsK   s   zGaugeHistogram.bucketsN)r.   )r'   r(   r)   r*   r   r   r   r+   r,   r   r   r@   rA   r   rB   r   r   r   r   r-   )   s*    


r-   )
r*   r!   typingr   r   r   r   r   r   r-   r   r   r   r   <module>   s
    	