fix(vllm): distinguish empty metrics from collection failures (#14303)

This commit is contained in:
ssongliu
2026-11-04 20:42:58 +08:00
committed by GitHub
parent 2e9c1794f2
commit 730dbbab5b
14 changed files with 35 additions and 8 deletions
+5
View File
@@ -286,6 +286,11 @@ func collectVLLMMetrics(ctx context.Context, install model.AppInstall, previous
return point, err
}
point.CreatedAt = time.Now()
if len(metrics) == 0 {
point.Status = "no_data"
point.RawMetrics = "{}"
return point, nil
}
raw, err := json.Marshal(metrics)
if err != nil {
return point, err
+8 -8
View File
@@ -29,13 +29,20 @@ func Parse(reader io.Reader) (Metrics, error) {
scanner.Buffer(make([]byte, 4096), 1024*1024)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if !strings.HasPrefix(line, "vllm:") {
if line == "" || strings.HasPrefix(line, "#") {
continue
}
match := re.GetRegex(re.VLLMMetricSamplePattern).FindStringSubmatch(line)
if match == nil {
return nil, fmt.Errorf("invalid vLLM metric sample")
}
value, err := strconv.ParseFloat(match[3], 64)
if err != nil {
return nil, fmt.Errorf("invalid vLLM metric value: %w", err)
}
if !strings.HasPrefix(match[1], "vllm:") {
continue
}
name := strings.TrimPrefix(match[1], "vllm:")
switch name {
case "request_prefill_time_seconds_bucket", "request_decode_time_seconds_bucket", "request_queue_time_seconds_bucket":
@@ -52,10 +59,6 @@ func Parse(reader io.Reader) (Metrics, error) {
continue
}
}
value, err := strconv.ParseFloat(match[3], 64)
if err != nil {
return nil, fmt.Errorf("invalid vLLM metric value: %w", err)
}
if math.IsNaN(value) || math.IsInf(value, 0) || value < 0 {
continue
}
@@ -73,9 +76,6 @@ func Parse(reader io.Reader) (Metrics, error) {
if err := scanner.Err(); err != nil {
return nil, err
}
if len(metrics) == 0 {
return nil, fmt.Errorf("no supported vLLM metrics")
}
return metrics, nil
}
+2
View File
@@ -1689,6 +1689,8 @@ const message = {
timeToFirstToken: 'Mean time to first token',
timePerOutputToken: 'Mean inter-token latency',
requestLatency: 'Mean request latency',
noMetrics:
'The metrics endpoint is reachable, but no supported vLLM metrics are available yet. Some metrics may appear only after the first inference request.',
unavailable: 'Metrics are unavailable. Check that the instance is running and /metrics is accessible.',
loadFailed: 'Failed to load monitoring data. Please retry.',
helper: 'Manage collection, interval and retention in monitoring settings.',
+2
View File
@@ -1699,6 +1699,8 @@ const message = {
timeToFirstToken: 'Latencia media del primer token',
timePerOutputToken: 'Latencia media entre tokens',
requestLatency: 'Latencia media de solicitud',
noMetrics:
'El endpoint de métricas es accesible, pero aún no hay métricas de vLLM compatibles. Algunas pueden aparecer solo después de la primera solicitud de inferencia.',
unavailable:
'Métricas no disponibles. Compruebe que la instancia esté en ejecución y que /metrics sea accesible.',
loadFailed: 'No se pudieron cargar los datos. Inténtelo de nuevo.',
+2
View File
@@ -1669,6 +1669,8 @@ const message = {
timeToFirstToken: 'میانگین تأخیر توکن اول',
timePerOutputToken: 'میانگین تأخیر بین توکن‌ها',
requestLatency: 'میانگین تأخیر درخواست',
noMetrics:
'نقطه پایانی معیارها در دسترس است، اما هنوز معیار پشتیبانی‌شده‌ای از vLLM موجود نیست. برخی معیارها ممکن است تنها پس از نخستین درخواست استنتاج ظاهر شوند.',
unavailable: 'معیارها در دسترس نیستند. از اجرای نمونه و دسترسی به /metrics مطمئن شوید.',
loadFailed: 'بارگیری داده‌های پایش ناموفق بود. دوباره تلاش کنید.',
helper: 'فعال‌سازی جمع‌آوری، فاصله زمانی و مدت نگهداری را در تنظیمات پایش تغییر دهید.',
+2
View File
@@ -1676,6 +1676,8 @@ const message = {
timeToFirstToken: '平均初回トークン遅延',
timePerOutputToken: '平均トークン間遅延',
requestLatency: '平均リクエスト遅延',
noMetrics:
'メトリクスエンドポイントにはアクセスできますが、対応する vLLM メトリクスはまだありません。一部のメトリクスは初回の推論リクエスト後に生成される場合があります。',
unavailable: '指標を取得できません。インスタンスが稼働し、/metrics にアクセスできるか確認してください。',
loadFailed: '監視データの読み込みに失敗しました。再試行してください。',
helper: '収集の有効化、間隔、保存期間は監視設定で変更できます。',
+2
View File
@@ -1660,6 +1660,8 @@ const message = {
timeToFirstToken: '평균 첫 토큰 지연',
timePerOutputToken: '평균 토큰 간 지연',
requestLatency: '평균 요청 지연',
noMetrics:
'메트릭 엔드포인트에 접근할 수 있지만 아직 지원되는 vLLM 메트릭이 없습니다. 일부 메트릭은 첫 추론 요청 후에만 생성될 수 있습니다.',
unavailable: '지표를 수집할 수 없습니다. 인스턴스 실행 상태와 /metrics 접근 가능 여부를 확인하세요.',
loadFailed: '모니터링 데이터를 불러오지 못했습니다. 다시 시도하세요.',
helper: '수집 활성화, 간격 및 보존 기간은 모니터링 설정에서 조정합니다.',
+2
View File
@@ -1649,6 +1649,8 @@ const message = {
timeToFirstToken: 'ເວລາລໍຖ້າສະເລ່ຍຂອງ Token ທຳອິດ',
timePerOutputToken: 'ເວລາລໍຖ້າສະເລ່ຍລະຫວ່າງ Token',
requestLatency: 'ເວລາລໍຖ້າສະເລ່ຍຂອງຄຳຮ້ອງຂໍ',
noMetrics:
'ສາມາດເຂົ້າເຖິງຈຸດປາຍທາງເມຕຣິກໄດ້ ແຕ່ຍັງບໍ່ມີເມຕຣິກ vLLM ທີ່ຮອງຮັບ. ບາງເມຕຣິກອາດປາກົດຫຼັງຈາກຄຳຮ້ອງຂໍອະນຸມານຄັ້ງທຳອິດເທົ່ານັ້ນ.',
unavailable: 'ບໍ່ສາມາດເກັບຕົວຊີ້ວັດໄດ້. ກວດສອບວ່າອິນສະແຕນເຮັດວຽກ ແລະ ເຂົ້າເຖິງ /metrics ໄດ້.',
loadFailed: 'ໂຫຼດຂໍ້ມູນຕິດຕາມບໍ່ສຳເລັດ. ກະລຸນາລອງອີກຄັ້ງ.',
helper: 'ປັບການເປີດໃຊ້ການເກັບຂໍ້ມູນ, ໄລຍະຫ່າງ ແລະ ຈຳນວນມື້ເກັບຮັກສາໃນການຕັ້ງຄ່າການຕິດຕາມ.',
+2
View File
@@ -1703,6 +1703,8 @@ const message = {
timeToFirstToken: 'Purata kependaman token pertama',
timePerOutputToken: 'Purata kependaman antara token',
requestLatency: 'Purata kependaman permintaan',
noMetrics:
'Titik akhir metrik boleh dicapai, tetapi belum ada metrik vLLM yang disokong. Sesetengah metrik mungkin hanya muncul selepas permintaan inferens pertama.',
unavailable: 'Metrik tidak tersedia. Pastikan tika sedang berjalan dan /metrics boleh dicapai.',
loadFailed: 'Gagal memuatkan data pemantauan. Sila cuba lagi.',
helper: 'Urus pengumpulan, sela dan tempoh penyimpanan dalam tetapan pemantauan.',
+2
View File
@@ -1699,6 +1699,8 @@ const message = {
timeToFirstToken: 'Latência média do primeiro token',
timePerOutputToken: 'Latência média entre tokens',
requestLatency: 'Latência média da solicitação',
noMetrics:
'O endpoint de métricas está acessível, mas ainda não há métricas compatíveis do vLLM. Algumas podem aparecer apenas após a primeira solicitação de inferência.',
unavailable:
'Métricas indisponíveis. Verifique se a instância está em execução e se /metrics está acessível.',
loadFailed: 'Falha ao carregar os dados. Tente novamente.',
+2
View File
@@ -1694,6 +1694,8 @@ const message = {
timeToFirstToken: 'Среднее время до первого токена',
timePerOutputToken: 'Средняя задержка между токенами',
requestLatency: 'Средняя задержка запроса',
noMetrics:
'Конечная точка метрик доступна, но поддерживаемых метрик vLLM пока нет. Некоторые метрики могут появиться только после первого запроса к модели.',
unavailable: 'Метрики недоступны. Проверьте, что экземпляр запущен и /metrics доступен.',
loadFailed: 'Не удалось загрузить данные мониторинга. Повторите попытку.',
helper: 'Сбор, интервал и срок хранения настраиваются в параметрах мониторинга.',
+2
View File
@@ -1698,6 +1698,8 @@ const message = {
timeToFirstToken: 'Ortalama ilk token gecikmesi',
timePerOutputToken: 'Ortalama token arası gecikme',
requestLatency: 'Ortalama istek gecikmesi',
noMetrics:
'Metrik uç noktasına erişilebiliyor, ancak henüz desteklenen vLLM metrikleri yok. Bazı metrikler yalnızca ilk çıkarım isteğinden sonra görünebilir.',
unavailable:
'Metrikler kullanılamıyor. Örneğin çalıştığını ve /metrics yolunun erişilebilir olduğunu kontrol edin.',
loadFailed: 'İzleme verileri yüklenemedi. Tekrar deneyin.',
+1
View File
@@ -1596,6 +1596,7 @@ const message = {
timeToFirstToken: '平均首 Token 延遲',
timePerOutputToken: '平均 Token 間延遲',
requestLatency: '平均請求延遲',
noMetrics: '指標介面可存取,但暫無可用的 vLLM 指標;部分指標可能在首次推論請求後才會產生。',
unavailable: '無法採集指標,請確認實例已啟動且 /metrics 可存取。',
loadFailed: '監控資料載入失敗,請重試。',
helper: '採集開關、頻率和儲存天數統一在監控設定中調整。',
+1
View File
@@ -1609,6 +1609,7 @@ const message = {
timeToFirstToken: '平均首 Token 延迟',
timePerOutputToken: '平均 Token 间延迟',
requestLatency: '平均请求延迟',
noMetrics: '指标接口可访问,但暂无可用的 vLLM 指标;部分指标可能在首次推理请求后才会产生。',
unavailable: '无法采集指标,请确认实例已启动且 /metrics 可访问。',
loadFailed: '监控数据加载失败,请重试。',
helper: '采集开关、频率和保存天数在监控设置的 vLLM 监控中独立调整。',