o
    )i!                     @   sp  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	 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e 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)Optional)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   b/home/app/PaddleOCR-VL-test/.venv_paddleocr/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   .   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:Zgauge)r   r   r   counterZ_totalz,vllm:spec_decode_num_accepted_tokens_per_pos)r   r   r   Z	histogramZ_bucket_countZ_sum)r   r   r   r   r   zUnknown metric type )r   Z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   Zcount_valueZ	sum_valuer   r   r   get_metrics_snapshotB   s^   



	



	r1   Nr+   suffixc                    s,   |d ur	| j | n| j   fdd| jD S )Nc                    s   g | ]	}|j  kr|qS r   r   ).0r-   r3   r   r   
<listcomp>   s    z _get_samples.<locals>.<listcomp>)r   r,   )r+   r2   r   r3   r   r%      s   r%   r   key_to_removec                 C   s   |   }|| |S N)copypop)r   r6   Zlabels_copyr   r   r   _strip_label   s   
r:   r.   r/   r0   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   	frozensetr:   itemsr   r   setkeysr   r   r&   )r.   r/   r0   Zbuckets_by_labelsr-   Zbucket
labels_keyZcounts_by_labelsZsums_by_labelsoutputZ
label_keyskr   r   r   r   r(      s8   


r(   r,   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   maxr<   r:   r=   r   r   r&   )r,   Zmax_posZvalues_by_labelsr-   rC   r@   rA   Zvalues_by_positionr   r   posvalr   r   r   r'      s"   

r'   r7   )dataclassesr   typingr   Zprometheus_clientr   r   Z
PromMetricZprometheus_client.samplesr   r   r   r   r   r   r1   r   r%   r   r:   tupler   r   r(   r'   r   r   r   r   <module>   sJ   	I
&"
9