Skip to main content
The Poolside inference stack’s vLLM model server exposes Prometheus metrics on its /metrics endpoint. These are the primary signals for inference health and performance. Use this page to find the signals you care about and to point your own monitoring stack at the right endpoint. This page is for operators running a self-hosted deployment. The metrics live in the poolside-models namespace.
The deployment does not bundle a metrics stack. No Prometheus, Grafana, or OpenTelemetry collector runs by default, and no ServiceMonitor or PodMonitor CRDs are installed. The endpoints below are exposed, but nothing scrapes them until you wire up your own monitoring. See Collect the metrics.

Model server metrics

The vLLM model server exposes native vLLM metrics on :8080/metrics, under the vllm:*, http_*, and python_* prefixes. There is one Kubernetes Deployment per model, with pods named inference-\<uuid\>. The examples below resolve the target pod by Helm label at runtime, so they keep working as pods are renamed on redeploy. Core vLLM metrics are present on an idle pod, with counters and histograms starting at 0.

What to watch

Latency and throughput

The user-facing performance signals. They are histograms, so alert on high percentiles rather than averages.

Load and queue

How saturated the engine is. The first place to look when latency climbs or when deciding whether to scale.

KV cache and prefix caching

KV-cache pressure and prefix-cache hit rate largely determine throughput and latency under load.

Token counts

Use these for cost tracking, capacity planning, and understanding workload shape.

Speculative decoding

Present only when speculative decoding is enabled. Accepted over draft tokens is the acceptance rate; a low rate means speculation is wasting compute.

Model FLOPs utilization

Use these to estimate model FLOPs utilization (MFU) and tell whether a workload is compute-bound or memory-bound.

Runtime and miscellaneous

This list reflects the metrics exposed by the deployed model server. The metric surface can change between releases, so confirm the exact set against a live scrape of your deployment using the commands in Scrape the endpoint.

Collect the metrics

The deployment does not ship a monitoring stack, so the metrics listed earlier are exposed but unscraped until you set up collection:
  • No prometheus.io/scrape annotations are present, and no ServiceMonitor or PodMonitor CRDs are installed.
  • The deployment does not bundle Prometheus, Grafana, VictoriaMetrics, Thanos, or an OpenTelemetry collector.
To collect these metrics, point your own Prometheus-compatible scraper at the endpoint listed earlier, or add ServiceMonitor or PodMonitor resources if you run the Prometheus Operator. For one-off checks, use the port-forward commands in the next section.

Scrape the endpoint

Run these commands from a host with kubectl access to the deployment’s cluster. Resolve the target pod by its Helm label, port-forward it, curl the local port, then stop the forward. Resolving by label keeps the command working as pods are renamed on redeploy. In one terminal, resolve the vLLM model server pod by its Helm label and port-forward its metrics port. Leave this running:
In a second terminal, scrape the local port. For example, read the current load and cache values. On a server handling traffic, this returns something like:
To list every metric name instead, scrape the same port with grep '^# HELP' | sort. When you are done, stop the port-forward with Ctrl+C in the first terminal. The endpoint details are: When more than one model is deployed, the component=inference selector matches every model’s pods and jsonpath picks the first. To target a specific model, append its model label, for example app.kubernetes.io/component=inference,app.kubernetes.io/model=<model>.
Counters that have not been incremented yet report 0 rather than being absent, so an idle pod still exposes the full set of metrics described above. If a scrape returns nothing, check the port-forward terminal for connection errors.