Skip to main content
Veri records terminal telemetry for buffered and streaming inference requests. Use the Analytics dashboard for visual investigation, the SDK or REST API for automation, and MCP when you want an agent to investigate a deployment. This guide is also a smoke test: follow Verify observability end to end after deploying a model to confirm that request telemetry, time-series aggregation, and agent tools are working.

Choose an interface

MCP is optional. It is useful for agent-driven investigation, but the dashboard, SDK, and REST API expose deployment observability without it.

What you can see, by provider

Request, latency, token, cost, and engine telemetry (queue depth, KV-cache usage) work identically everywhere — they come from the request path and the engine, not the hardware. The GPU hardware snapshot (per-GPU utilization, memory used/total, power draw, temperature, plus aggregates) rides the replica heartbeat and depends on what the serving agent can reach on each provider’s boxes: GCP and DigitalOcean serving are not enabled yet (see Serving providers); their rows describe what those providers will report. Two design contracts worth knowing: the snapshot is fail-soft (a box where no GPU library works simply omits the readings — GPU telemetry can never break the heartbeat that liveness monitoring depends on), and it is vendor-neutral in shape — NVIDIA and AMD boxes emit the identical schema, so dashboards and Prometheus queries never branch on vendor.

Verify observability end to end

1. Select a serving deployment

Copy the deployment id and export it for the REST examples:

2. Generate buffered and streaming traffic

Send a regular request with the Veri CLI:
Then send a streaming request. Replace the model name with the deployment’s configured name:
Veri meters the stream’s token counts server-side whether or not you set include_usage. Setting it means your client also receives the final usage-only chunk (empty choices, populated usage), which makes the test self-documenting.

3. Inspect the dashboard

Open Analytics in the Veri dashboard and select the deployment. Choose Past hour, then click refresh. After the two requests finish, expect:
  • Request and token volume to be non-zero.
  • The recent requests table to contain both requests.
  • End-to-end latency samples for successful buffered and streaming requests.
  • TTFT and TPOT samples for the streaming request.
  • A zero or near-zero error rate.
  • Cost-efficiency values once the window contains successful requests with output tokens.
Engine charts populate from replica heartbeats rather than request rows. Queue depth, KV-cache usage, prefix-cache hit rate, generation throughput, GPU utilization, GPU memory, and replica count can therefore appear on a different cadence.

4. Verify with the Python SDK

datetime values are serialized as RFC 3339 timestamps. You can also pass RFC 3339 strings directly. A minimal automated smoke test can assert:

5. Verify with REST

Lifetime counters, plus latency and error stats for the past 24 hours:
total_requests, total_prompt_tokens, and total_completion_tokens count every request you sent since the deployment was created (eval calls excluded). avg_latency_ms, p50_latency_ms through p99_latency_ms, and error_rate cover the past 24 hours only (null latency when there were no requests in that window). For any other window, use metrics/timeseries, whose summary carries the same stats for the range you ask for. Time-series metrics default to the past seven days when from and to are omitted:
Only failed requests in a bounded window:

Scope results to a single replica

The metrics/timeseries, metrics/engine-timeseries, and requests endpoints accept an optional replica_id query parameter. List replica IDs with GET /v1/deployments/$DEPLOYMENT_ID/replicas:
When replica_id is set, buckets, the window summary, engine gauges (queue depth and KV-cache utilization), and recent requests are scoped to that replica. Cost efficiency becomes replica-scoped as well: window cost is the replica’s own active interval multiplied by its per-box GPU rate. Without replica_id, window cost is the sum of every replica’s billed time in the window. Each bucket also carries cost_usd, the GPU cost billed inside that bucket, so cost lands where the boxes actually ran. Scoped metrics responses echo replica_id at the top level. The ID must be a replica of the deployment; unknown IDs return 404. Omit the parameter to keep deployment-wide aggregates.

Evaluation traffic

Requests that Veri evaluators and experiments send to a deployment are recorded with origin eval and kept out of your production numbers. The lifetime counters, metrics, metrics/timeseries, the dashboard charts, and the default requests listing count only your own API traffic. List the eval calls with origin=eval:
Engine charts (queue depth, KV cache, throughput, GPU readings) come from the GPU box itself, so they include every request it served, eval calls too. Eval calls also count as activity for scale to zero, so a running experiment keeps the deployment awake. Lifetime counters still include eval calls made before 2026-10-04, when this split began.

Retention

Older rows are deleted automatically. Deleting a deployment removes all of it at once. See the interactive API reference for complete response schemas.

Request traces

Request telemetry (above) records that requests happened; traces additionally capture the full request and response bodies so you can see exactly what was asked and what the model answered. Traces are opt-in per deployment and off by default, because enabling them stores your end users’ prompt and completion content. Opt in at create time:
Or in the SDK: client.deployments.create(..., trace_bodies=True). Browse traces from the deployment page in the dashboard, the CLI, or the API:
Details worth knowing:
  • Cross-linking. Every trace’s metadata.veri_request_id matches an id from deployments.requests(), so you can join body-level traces with the timing, token, and error telemetry for the same request.
  • Model version identity. When the request was answered by a registered model version (an adapter alias on a multi-adapter fleet (beta), or a fleet built from a registered model), metadata.model_version_id carries that version’s id — the same value as the request log’s model_version_id — so per-version quality can group traces by identity instead of by a serve-name string that moves on every promote.
  • Retention. base traces are deleted after 14 days, extended after 400.
  • Pricing. The first 5,000 base-retention traces per workspace each month are free; beyond that, $2.50 per 1k traces at base retention and $5.00 per 1k at extended, metered from credits at month end.
  • Never in the request path. Capture is asynchronous and drop-tolerant: if the trace store is unavailable, requests are unaffected and the affected traces are dropped.
  • Streaming. Streamed (stream: true) responses are captured once the stream completes: content, reasoning, tool calls, and finish reason are assembled into one response. A stream that is cut off, errors, or exceeds 1 MiB is not captured; the request still appears in request telemetry.
  • Threads. Send the same X-Veri-Thread-Id header (1-128 characters of A-Z a-z 0-9 . _ : -) on every request of a conversation to group its traces into a thread; the SDK’s session_id sends the equivalent X-Veri-Session-Id. The thread id is stored on the request and in trace metadata, and thread evaluators score the whole conversation. The dashboard and API views of threads are in Agent conversations.
  • Scores. Each trace carries its evaluator scores (from your own harness, experiments, or human review) under scores.
  • Traces to training data. A time window of traces can be imported into a dataset stream as chat or prompt rows (veri datasets import-traces), snapshotted, and trained on — production traffic feeding the next fine-tune.

Agent conversations

When an agent calls a deployment, two optional headers let Veri group its requests into conversations: A header value outside these rules is rejected with 400 before the request reaches the model, for example {"error": {"message": "X-Veri-Agent must be 1-64 characters of [A-Za-z0-9._:-]"}}. The SDK’s session_id sends X-Veri-Session-Id, which also counts as the thread id when it follows the same rules.
Open Agents in the dashboard (Overview, Conversations, and Agents tabs) to browse them, or read the same data from the API. Each agent has a key: agent:<X-Veri-Agent value>, deployment:<deployment id> for threads sent without an agent name, or env:<environment id> for a managed agent. Eval calls are left out. The window is from and to (RFC 3339), by default the past 24 hours, at most 30 days, starting no earlier than 2000-01-01. A next_cursor keeps the first page’s window end, so page on without to (or repeat the same to): a different to with a cursor is a 400. To turn one conversation into a dataset row (the dashboard’s Add to dataset), call POST /v1/datasets/{dataset_id}/import-traces with deployment and thread_id. Importing the same conversation into the same dataset again while its newest stored message is unchanged returns 409 export_thread_duplicate, naming the earlier import; send "force": true to append it again.

Export metrics to Prometheus

GET /v1/metrics/export returns your account’s deployment and replica metrics in Prometheus text exposition format (text/plain; version=0.0.4). Authenticate with your API key as a Bearer credential, exactly like every other endpoint. The response covers your deployments only.
Scrape it on a 30-60 second interval. Values come from replica heartbeat snapshots on roughly that cadence, so scraping faster returns duplicate samples and counts against the API rate limit of 120 requests per minute per key.

Exposed metrics

Per-deployment metrics carry deployment_id and model labels: Per-replica metrics add replica_id, gpu_type, and region labels. Only live replicas (queued, provisioning, serving, or draining) are exported: Metrics only appear when the underlying data exists: a replica that has not reported a heartbeat yet exports no series, and GPU series are absent where the agent has no hardware telemetry backend (see What you can see, by provider — NVIDIA boxes use NVML, ROCm boxes use amdsmi/rocm-smi, and docker-isolated providers omit them for now).

Prometheus scrape configuration

prometheus.yml
Prometheus does not expand environment variables in its config file, so keep the key in a file and point credentials_file at it.

Grafana Cloud

Grafana Alloy forwards the scrape to your Grafana Cloud Prometheus instance:
config.alloy

Datadog agent

Use the OpenMetrics check:
conf.d/openmetrics.d/conf.yaml

Example alert rule

Alert when requests queue up faster than a replica drains them, and when telemetry goes stale:
alerts.yml

Investigate with MCP

Set up Veri MCP by following Model Context Protocol. In read-only mode, all observability tools remain available; only tools that create, cancel, stop, or rescore resources are removed. Useful deployment tools: Try these prompts:
Inspect deployment <deployment-id> over the past hour. Summarize request volume, p50/p95/p99 TTFT and end-to-end latency, token throughput, error rate, and cost efficiency. Then list failed requests and group them by error category. Do not modify resources.
Compare the past 24 hours with the preceding 24 hours for deployment <deployment-id>. Identify latency, error-rate, throughput, or cost regressions and cite the metric values behind each conclusion.
Review deployment <deployment-id> and my billing overview. Explain whether request volume, output-token efficiency, errors, or the current GPU burn rate is the main cost risk. Do not modify resources.
Agent responses are only as complete as the telemetry window. Include the deployment ID and an explicit period in prompts when you need reproducible results.

Metric semantics

Request timing

TTFT and TPOT are most meaningful for streaming responses. TPOT is only calculated when the upstream engine reports usage. Latency percentiles use successful requests so application and transport failures do not distort the serving-latency distribution.

Traffic and errors

Each terminal request record can include:
  • Prompt, cached prompt, and completion tokens.
  • Request and response byte counts.
  • HTTP status and finish reason.
  • Whether the response streamed and whether usage was reported.
  • A bounded error category and diagnostic message.
  • Client cancellation or disconnection state.
  • Request start and completion timestamps.
Error charts separate client errors from server or interrupted-stream errors. Use request history to inspect the underlying error_category and message.

Cost efficiency

The dashboard and time-series response derive:
  • Cost per successful request.
  • Cost per million output tokens.
  • Tokens per dollar.
  • Total deployment cost for the selected window.
Cost-per-token values require reported completion tokens. A request can be successful while lacking usage, so compare usage_reported when investigating missing efficiency data.

Engine health

Replica heartbeats provide:
  • Running and waiting requests.
  • KV-cache utilization.
  • Prefix-cache hit rate.
  • Generation token throughput.
  • Active replica count.
  • GPU hardware telemetry: utilization, memory used and total, power draw, and temperature.
Request telemetry and engine telemetry are intentionally separate. Request rows describe completed client operations; engine history describes sampled replica state.

GPU hardware telemetry

Each replica reports NVML readings with its heartbeat. GET /v1/deployments/$DEPLOYMENT_ID/replicas returns the latest snapshot per replica: The metrics/engine-timeseries endpoint adds gpu_utilization (mean across reporting replicas) and gpu_memory_used_bytes (summed) to each bucket and to each per-replica series. All GPU fields are absent or null when a replica does not report telemetry, for example on hardware without NVML. GPU utilization is a debugging metric, not a scaling signal: it measures the share of time any kernel was resident on the chip, not how much load the engine is under. Scale on queue depth (waiting requests) and KV-cache utilization instead.

Troubleshooting

Where to go next

MCP setup

Let an agent query deployment, training, and billing context.

Deployment commands

Generate traffic, benchmark an endpoint, and inspect recent requests.

API reference

Integrate metrics and request history into your own systems.

Deployment billing

Understand hourly GPU billing and scale-to-zero behavior.