o
    i!                     @   sb  d dl mZ d dlmZ d dlmZ d dlmZ eG dd dZeG dd deZeG d	d
 d
eZ	eG dd deZ
eG dd deZdee fddZd#dededB dee fddZdeeef dedeeef fddZdee dee dee deeeeef eeef eef  fddZd ee deeeeef ee f  fd!d"ZdS )$    )	dataclass)REGISTRY)Metric)Samplec                   @   s*   e Zd ZU dZeed< eeef ed< dS )r   zA base class for prometheus metrics.

    Each metric may be associated with key=value labels, and
    in some cases a single vLLM instance may have multiple
    metrics with the same name but different sets of labels.
    namelabelsN)__name__
__module____qualname____doc__str__annotations__dict r   r   L/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/v1/metrics/reader.pyr      s   
 r   c                   @      e Zd ZU dZeed< dS )Counterz+A monotonically increasing integer counter.valueN)r   r	   r
   r   intr   r   r   r   r   r         
 r   c                   @   s   e Zd ZU dZee ed< dS )VectorzAn ordered array of integer counters.

    This type - which doesn't exist in Prometheus - models one very
    specific metric, vllm:spec_decode_num_accepted_tokens_per_pos.
    valuesN)r   r	   r
   r   listr   r   r   r   r   r   r      s   
 r   c                   @   r   )Gaugez)A numerical value that can go up or down.r   N)r   r	   r
   r   floatr   r   r   r   r   r   *   r   r   c                   @   s2   e Zd ZU dZeed< eed< eeef ed< dS )	Histograma  Observations recorded in configurable buckets.

    Buckets are represented by a dictionary. The key is
    the upper limit of the bucket, and the value is the
    observed count in that bucket. A '+Inf' key always
    exists.

    The count property is the total count across all
    buckets, identical to the count of the '+Inf' bucket.

    The sum property is the total sum of all observed
    values.
    countsumbucketsN)	r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   1   s
   
 r   returnc                  C   s:  g } t  D ]}|jdsq|jdkr+t|}|D ]}| t|j|j|j	d qq|jdkrdt|d}|jdkrOt
|D ]\}}| t|j||d q>q|D ]}| t|j|jt|j	d qQq|jdkrt|d	}t|d
}t|d}t|||D ]\}}	}
}| t|j||	|
|d q~qtd|j | S )a  An API for accessing in-memory Prometheus metrics.

    Example:
        >>> for metric in llm.get_metrics():
        ...     if isinstance(metric, Counter):
        ...         print(f"{metric} = {metric.value}")
        ...     elif isinstance(metric, Gauge):
        ...         print(f"{metric} = {metric.value}")
        ...     elif isinstance(metric, Histogram):
        ...         print(f"{metric}")
        ...         print(f"    sum = {metric.sum}")
        ...         print(f"    count = {metric.count}")
        ...         for bucket_le, value in metrics.buckets.items():
        ...             print(f"    {bucket_le} = {value}")
    zvllm:gauge)r   r   r   counter_totalz,vllm:spec_decode_num_accepted_tokens_per_pos)r   r   r   	histogram_bucket_count_sum)r   r   r   r   r   zUnknown metric type )r   collectr   
startswithtype_get_samplesappendr   r   r   #_digest_num_accepted_by_pos_samplesr   r   r   _digest_histogramr   AssertionError)	collectedmetricsamplessr   r   bucket_samplescount_samplessum_samplesr   count_value	sum_valuer   r   r   get_metrics_snapshotF   sV   



	



r8   Nr0   suffixc                    s,   |d ur	| j | n| j   fdd| jD S )Nc                    s   g | ]	}|j  kr|qS r   r   ).0r2   r:   r   r   
<listcomp>   s    z _get_samples.<locals>.<listcomp>)r   r1   )r0   r9   r   r:   r   r*      s   r*   r   key_to_removec                 C   s   |   }|| |S N)copypop)r   r=   labels_copyr   r   r   _strip_label   s   
rB   r3   r4   r5   c                 C   s  i }| D ]"}|j d }tt|j d }||vri ||< t|j|| |< qi }|D ]}t|j  }t|j||< q+i }|D ]}t|j  }|j||< q@t| t|   krft| ksiJ  J g }	t| }
|
D ]}t	|}|	
||| || || f qs|	S )Nle)r   	frozensetrB   itemsr   r   setkeysr   r   r+   )r3   r4   r5   buckets_by_labelsr2   bucket
labels_keycounts_by_labelssums_by_labelsoutput
label_keyskr   r   r   r   r-      s8   



r-   r1   c                 C   s   d}i }| D ])}t |jd }t||}tt|jd }||vr&i ||< t |j|| |< qg }| D ]#\}}t|}dg|d  }	| D ]\}
}||	|
< qI|||	f q6|S )Nr   position   )	r   r   maxrD   rB   rE   r   r   r+   )r1   max_posvalues_by_labelsr2   rP   rJ   rM   values_by_positionr   r   posvalr   r   r   r,      s"   

r,   r>   )dataclassesr   prometheus_clientr   r   
PromMetricprometheus_client.samplesr   r   r   r   r   r   r8   r   r*   r   rB   tupler   r   r-   r,   r   r   r   r   <module>   s>   
 L&"
<