Problem Statement
Currently no comprehensive metrics provided
Proposed Solution
Implementation status legend: ✅ implemented · 🔄 in review · ⬜ not yet implemented. All implemented metrics live under the llm_d_async subsystem and carry queue_id, queue_name, and pool_name labels.
Traffic Layer - Queue Health & Backlog
These metrics tell users how much work is pending and if they are meeting their SLOs (minutes/hours).
Intelligence Layer - Dispatch Gates & Throttling
Since llm-d-async uses gates (Prometheus, Redis, Quota) to protect the inference pool, users need to know why processing is slowing down.
Execution Layer - Worker Performance & Utilization
LLM-Specific Throughput
Alternatives Considered
No response
Willingness to Contribute
Yes, I can submit a PR
Additional Context
No response
Problem Statement
Currently no comprehensive metrics provided
Proposed Solution
Traffic Layer - Queue Health & Backlog
These metrics tell users how much work is pending and if they are meeting their SLOs (minutes/hours).
async_broker_backlog(feat: add queue depth, in-flight, and broker backlog metrics #244).Why: Essential for auto-scaling the processor and understanding system pressure.
Note: For GCP PubSub this requires some setup to get this metric from external endpoint as PubSub does not provide this through client API.
Why: Helps identify if a large batch of work is about to "expire" simultaneously.
Note: Will require a pre-processing stage as we don’t look at the messages before consumption currently. Feasible for redis-sortedset only (via the periodic backlog poller +
ZRANGEBYSCORE); not feasible for PubSub (no peek).async_queue_residence_time_millis(feat: add queue residence time metric #254).Why: Measures the actual "async delay" introduced by the system.
Intelligence Layer - Dispatch Gates & Throttling
Since llm-d-async uses gates (Prometheus, Redis, Quota) to protect the inference pool, users need to know why processing is slowing down.
async_dispatch_budget(PR feat(metrics): add dispatch budget and pool worker-limit gauges (#217) #290, in review).Labels: reason="gate_closed", reason="quota_exhausted", reason="no_budget". —
async_gate_decisions_total(PR feat(metrics): add gate-decision breakdown counter (#217) #291, in review).Why: Helps debug why a gate is closed (e.g., "The pool is at 85% saturation, threshold is 80%").
Execution Layer - Worker Performance & Utilization
async_inflight_requests/async_queue_depth(feat: add queue depth, in-flight, and broker backlog metrics #244); the per-pool concurrency limitasync_pool_worker_limitis added in PR feat(metrics): add dispatch budget and pool worker-limit gauges (#217) #290 (in review), so active-vs-limit utilization is now derivable (async_inflight_requests / async_pool_worker_limit).async_inference_latency_time_millis.Why: Separates "model time" from "queue time."
async_shedded_requests_totalandasync_failed_requests_total.Shedded: 429s/Busy signals that trigger a retry.
Failed: 4xx/5xx or validation errors that end the request.
LLM-Specific Throughput
Why: The ultimate unit of value for LLM workloads. Even if the processor doesn't parse every payload, it can track this from the IGW response metadata.
Alternatives Considered
No response
Willingness to Contribute
Yes, I can submit a PR
Additional Context
No response