61 lines
2.1 KiB
Python
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()
|