feat(chart): alert when an engine is up but not serving - #1624
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
078f0cd to
e04a0ab
Compare
InferenceServiceDown only catches a dead process. An engine can hold its port open, pass /health and report Ready while admitting almost no work: requests queue, the KV cache sits partly free, and prompt throughput reads zero. Adds an llmkube-serving group: InferenceAdmissionStalled queued with none running (vllm/sglang/llama.cpp) InferenceQueueTimeHigh mean queue wait over threshold (vllm/sglang) KVOffloadLoadSlow slow async KV-offload loads (vllm, opt-in) Also fixes the queue-wait recording rules, which only covered SGLang. vLLM exports vllm:request_queue_time_seconds, already used by vllm-dashboard.json in this same chart. Thresholds are values-driven like every other threshold in this chart, set well above the healthy band based on a single-GPU deployment's baseline. Signed-off-by: Tanguille <91473554+Tanguille@users.noreply.github.com>
e04a0ab to
8dec174
Compare
|
Thanks for this, and for the writeup. The gap is real: I reviewed the alert expressions closely, ran Blocking1. The PR body states the observed state was 2.
Taken together, neither new on-by-default alert detects the failure the PR was written for. Worth validating the corrected expressions against the recorded incident data if you still have it. 3. The serving group defaults on, but depends on labels only a disabled-by-default PodMonitor injects.
The chart already handles this for 4. No All three rules are presence-dependent: Should fix before merge5. No minimum-sample guard, so one slow request pages A freshly rolled vLLM pod queues its first request 45s behind weight load and CUDA graph capture, then serves nothing else. Over the next 15m, 6. With 7. An engine that drains one queued request every few minutes but is otherwise wedged shows 8. Existing criticals are hard-down or damage conditions: 9. One test passes vacuously.
Worth addressing, non-blocking10. Alert expressions are the one PromQL surface in the repo with no name guard. 11. Partial runtime coverage, unguarded. 12. The queue-metric alternation is now written in two places. The PR widens the p95/p50 recording rules to 13. 14. The vLLM dashboard now duplicates the recording rule. 15. The p50 recording rule has no test. Both p95 and p50 changed, but "should cover both runtimes in the queue-wait recording rule" asserts only against p95. A later revert or typo in p50 leaves the suite green and the vLLM p50 panel empty. On the caveatYou offered to gate Findings 1, 2 and 9 are the ones I would want addressed before merge. Happy to pair on the expression rewrite if that is useful, and if you would rather split the recording-rule fix into its own PR I will merge that side quickly. |
InferenceServiceDownonly catches a dead process. An engine can hold its port open, pass/healthand reportReadywhile admitting almost no work: requests queue, KV cache sits partly free, prompt throughput reads zero. Nothing in the chart caught that.Observed on a single-GPU vLLM deployment: three hours of
1/1 Running,/health200, no chart alert, while the engine sat atRunning: 1, Waiting: 5with 36% KV free and 0.0 tok/s prompt throughput.New
llmkube-servinggroupInferenceAdmissionStalledInferenceQueueTimeHighKVOffloadLoadSlowKVOffloadLoadSlownames the likely cause (a slow, non-preemptible async KV load gates admission for everything behind it);InferenceQueueTimeHighonly reports the symptom. It's off by default sinceOffloadingConnectoris upstream-experimental and its series are absent without a KV connector configured, same pattern as the existinggpu.memoryPressuretoggle.Also fixes a recording rule that only covered SGLang
vLLM exports
vllm:request_queue_time_seconds, whichcharts/llmkube/dashboards/vllm-dashboard.jsonalready queries. Both queue-wait recording rules now use the sameoralternation as theire2e_request_latencyandttft_secondsneighbours.Thresholds
Values-driven, set well above the healthy band. Measured on a healthy single-GPU vLLM deployment:
Validation
helm unittest: 83/83 passing, including 6 new cases.service/namespace/runtimelabels. Confirmed they aren't silent no-ops by lowering thresholds to 0 and checking they then match, the#1223failure mode.Caveat
Thresholds are backtested against one incident on one deployment. Metric names are stock and rule shapes are runtime-agnostic, but treat the numbers as reasonable defaults rather than fleet-validated. Happy to adjust, or gate
serving.enabledoff by default for a first release.Assisted-by: OpenCode (helped draft this PR; I reviewed the final change and stand behind it.)