Files
vllm-omni/vllm_omni/metrics/realtime.py
T

61 lines
2.1 KiB
Python

# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM-Omni project
from __future__ import annotations
from prometheus_client import Counter, Gauge, Histogram
from vllm_omni.metrics import definitions as defs
_active_sessions = Gauge(
defs.REALTIME_VAD_ACTIVE_SESSIONS,
"Number of active Realtime sessions using server-side VAD.",
labelnames=list(defs.PIPELINE_LABELS),
)
_inference_latency = Histogram(
defs.REALTIME_VAD_INFERENCE_LATENCY_S,
"Server VAD inference time for one appended audio batch, in seconds.",
labelnames=list(defs.PIPELINE_LABELS),
buckets=defs.SECONDS_FAST_BUCKETS,
)
_endpoint_delay = Histogram(
defs.REALTIME_VAD_ENDPOINT_DELAY_S,
"Detected silence between the last speech frame and the committed endpoint, in seconds.",
labelnames=list(defs.PIPELINE_LABELS),
buckets=defs.SECONDS_FAST_BUCKETS,
)
_errors = Counter(
defs.REALTIME_VAD_ERRORS,
"Server VAD errors and input-overflow rejections by reason.",
labelnames=list(defs.FAILED_LABELS),
)
class RealtimeVADMetrics:
def __init__(self, model_name: str, log_stats: bool = True) -> None:
self._model_name = model_name
self._log_stats = log_stats
self._active_sessions = _active_sessions.labels(model_name=model_name)
self._inference_latency = _inference_latency.labels(model_name=model_name)
self._endpoint_delay = _endpoint_delay.labels(model_name=model_name)
def session_started(self) -> None:
if self._log_stats:
self._active_sessions.inc()
def session_finished(self) -> None:
if self._log_stats:
self._active_sessions.dec()
def observe_inference(self, latency_ms: float) -> None:
if self._log_stats:
self._inference_latency.observe(latency_ms / 1000)
def observe_endpoint_delay(self, delay_ms: int) -> None:
if self._log_stats:
self._endpoint_delay.observe(delay_ms / 1000)
def error(self, reason: str) -> None:
if self._log_stats:
_errors.labels(model_name=self._model_name, reason=reason).inc()