2026-09-29 22:47:38 +08:00
|
|
|
# WARNING — three of the series documented below are DEAD CODE as of
|
|
|
|
|
# 2026-09-29 and will never produce data:
|
|
|
|
|
#
|
|
|
|
|
# llm_ttft_seconds, llm_itl_seconds, llm_tokens_total
|
|
|
|
|
#
|
|
|
|
|
# They are declared and exported in internal/observability/prometheus.go, but
|
|
|
|
|
# the only thing that would ever record samples is LLMMetricsCapture
|
|
|
|
|
# (internal/proxy/llm_metrics.go) — and NewLLMMetricsCapture() has ZERO call
|
|
|
|
|
# sites. Verified: `grep -rn NewLLMMetricsCapture` returns only the definition,
|
|
|
|
|
# and RecordTTFT/RecordITL/RecordTokens are called from nowhere else. The
|
|
|
|
|
# exporter skips keys with no samples, so these render as HELP-only stubs.
|
|
|
|
|
#
|
|
|
|
|
# The gateway latency panels on the llm-observability dashboard depend on that
|
|
|
|
|
# wiring. Until it lands, use vLLM's own histograms as the latency source for
|
|
|
|
|
# `reasoning`; the two Ollama models (ornith:35b, qwen2.5:3b-instruct) have no
|
|
|
|
|
# latency visibility at all, because Ollama exposes no metrics endpoint either.
|
|
|
|
|
#
|
|
|
|
|
# These three ARE recorded and do work (3 series, one per replica):
|
2026-09-29 22:14:49 +08:00
|
|
|
# queue_full_requests_total counter backpressure rejects
|
|
|
|
|
# warmup_requests_delayed_total counter vLLM slot contention
|
|
|
|
|
# vllm_prefix_cache_hit_tokens_total counter prefix-cache hits
|
|
|
|
|
# request_duration_seconds histogram full request
|
|
|
|
|
#
|
2026-09-29 22:47:38 +08:00
|
|
|
# Also note the Deployment already carried prometheus.io/scrape annotations,
|
|
|
|
|
# but kube-prometheus-stack ignores pod annotations (no additionalScrapeConfigs,
|
|
|
|
|
# serviceMonitorSelectorNilUsesHelmValues: false) — so nothing at all was being
|
|
|
|
|
# collected before this ServiceMonitor existed.
|
2026-09-29 22:05:00 +08:00
|
|
|
apiVersion: monitoring.coreos.com/v1
|
|
|
|
|
kind: ServiceMonitor
|
|
|
|
|
metadata:
|
|
|
|
|
name: api-gateway
|
|
|
|
|
namespace: monitoring
|
|
|
|
|
labels:
|
|
|
|
|
app.kubernetes.io/name: api-gateway
|
|
|
|
|
app.kubernetes.io/part-of: api
|
|
|
|
|
spec:
|
|
|
|
|
namespaceSelector:
|
|
|
|
|
matchNames:
|
|
|
|
|
- api
|
|
|
|
|
selector:
|
|
|
|
|
matchLabels:
|
|
|
|
|
app: api-gateway
|
|
|
|
|
endpoints:
|
|
|
|
|
# api-gateway Service port IS named `http` (unlike the KServe ones), so
|
|
|
|
|
# the name form works here.
|
|
|
|
|
- port: http
|
|
|
|
|
interval: 30s
|
|
|
|
|
scrapeTimeout: 10s
|
|
|
|
|
path: /metrics
|
|
|
|
|
scheme: http
|
|
|
|
|
|