Skip to content

docs(observability): mark the CKF counter as registered but never incremented - #13149

Merged
pvijayakrish merged 1 commit into
release/1.4.0from
dagil-nvidia/fix-ckf-always-zero-140
Aug 14, 2026
Merged

docs(observability): mark the CKF counter as registered but never incremented#13149
pvijayakrish merged 1 commit into
release/1.4.0from
dagil-nvidia/fix-ckf-always-zero-140

Conversation

@dagil-nvidia

@dagil-nvidia dagil-nvidia commented Aug 13, 2026

Copy link
Copy Markdown
Collaborator

Follow-up to #12983, which corrected the CKF counter name on this branch but not the more important fact.

What #12983 got right, and what it missed

It renamed dynamo_kvrouter_ckf_mutation_total to dynamo_component_ckf_mutation_total. That was correct: the kvrouter-prefixed name comes only from new_registered, the standalone indexer path, while an embedded router registers through from_component and exports the component-scoped name. PromQL copied off this page returned no series on a normal Frontend+KV deployment.

The rename was not sufficient. inc_ckf_mutation has no call sites outside its own definition in lib/kv-router/src/indexer/metrics.rs, and CkfMutationKind is referenced nowhere else in the tree. The counter is created and exported, but nothing increments it under either name, so it reads 0 in every deployment.

Since #12983 already merged, the release branch currently documents a counter that will never move, and a reader scraping /metrics finds something called ..._mutation_total and reasonably builds a panel on it.

The fix

Uses the catalog's existing Registered, always zero category rather than deleting the entry. The series is exported whether or not it is documented, so removing the entry would remove the warning without removing the metric. The metric-labels.mdx entry for outcome gets the same treatment, since no series carries that label in practice.

Notes

Docs only. The equivalent correction for main is in #12975. Whether the missing call sites are an oversight or a deliberately reserved series is a question out with the KV-router owner; the documentation should describe what ships either way.


Open in Devin Review

…remented

Follow-up to #12983, which corrected the CKF counter name on this branch but
not the more important fact.

That PR renamed dynamo_kvrouter_ckf_mutation_total to
dynamo_component_ckf_mutation_total, which is right: the kvrouter-prefixed
name comes only from new_registered, the standalone indexer path, while an
embedded router registers through from_component and exports the
component-scoped name. PromQL copied off this page returned no series on a
normal Frontend+KV deployment.

The rename was not enough. inc_ckf_mutation has no call sites outside its own
definition in lib/kv-router/src/indexer/metrics.rs, and CkfMutationKind is
referenced nowhere else in the tree, so the counter is created and exported
but never incremented under either name. A reader scraping /metrics finds a
counter called ..._mutation_total and reasonably builds a panel on it.

Uses the catalog's existing "Registered, always zero" framing rather than
deleting the entry, since the series is exported either way and removing the
documentation would remove the warning without removing the metric. The
metric-labels entry for `outcome` says the same, because no series carries
that label in practice.

Whether the missing call sites are an oversight or a reserved series is a
question out with the KV-router owner. The documentation should describe what
ships regardless.

Signed-off-by: Dan Gil <dagil@nvidia.com>
@dagil-nvidia
dagil-nvidia requested a review from a team as a code owner August 13, 2026 01:36
@github-actions github-actions Bot added docs documentation Improvements or additions to documentation labels Aug 13, 2026

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 1 potential issue.

Open in Devin Review


<ParamField path="dynamo_component_ckf_mutation_total" type="counter">
CKF block-level mutation outcomes recorded by the router indexer, finer-grained than the event `status` on the counter above. Labeled by `outcome` — see [Metric-specific labels](metric-labels.mdx#metric-specific-labels).
CKF block-level mutation outcomes recorded by the router indexer, labeled by `outcome` — see [Metric-specific labels](metric-labels.mdx#metric-specific-labels). **Registered, always zero.** The series is created and exported, but no code path currently increments it, so it reads 0 in every deployment. Do not build alerts or dashboard panels on it. The standalone indexer exports the same counter as `dynamo_kvrouter_ckf_mutation_total`, with the same caveat.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 "Exported, reads 0" is likely stronger than reality: an empty label vector emits no series at all

I verified the PR's core claim: inc_ckf_mutation (lib/kv-router/src/indexer/metrics.rs:507) has no call sites and CkfMutationKind (lib/kv-router/src/indexer/metrics.rs:63) is referenced nowhere else, so the counter is indeed never incremented under either name (from_componentdynamo_component_ckf_mutation_total, new_registereddynamo_kvrouter_ckf_mutation_total, used by the standalone indexer at lib/kv-router/src/services/indexer/server.rs:60).

However, the counter is an IntCounterVec with an outcome label, and no code ever calls with_label_values, so the metric family has zero children. The Rust prometheus text encoder skips metric families with no metrics, meaning nothing is emitted at /metrics at all — a PromQL query returns no data, not 0. The wording here ("The series is created and exported ... it reads 0 in every deployment") could mislead a reader into writing an alert like rate(dynamo_component_ckf_mutation_total[5m]) == 0 and being surprised by an empty result. The companion sentence in docs/fern/reference/observability/metric-labels.mdx:115 ("no series carries this label in practice") is precise; consider aligning the catalog wording, e.g. "registered, but with no label values ever set, so no series is exported".

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@github-actions

Copy link
Copy Markdown
Contributor

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cf4f865db6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".


<ParamField path="outcome" type="string">
`[Shared]` On `dynamo_kvrouter_ckf_mutation_total` — the block-level CKF mutation outcome, finer-grained than the event `status` above.
`[Shared]` On `dynamo_component_ckf_mutation_total`, and on `dynamo_kvrouter_ckf_mutation_total` from the standalone indexer — the block-level CKF mutation outcome. Both counters are registered but never incremented today, so no series carries this label in practice.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Say that zero-valued outcome series are present

When a local or standalone indexer is constructed, KvIndexerMetrics::prebind calls with_label_values for both unknown_remove and capacity_exhausted (lib/kv-router/src/indexer/metrics.rs lines 458–465), which materializes two exported zero-valued Prometheus series carrying the outcome label even though inc_ckf_mutation is never called. Therefore an active indexer does expose this label, and this statement also contradicts the catalog's new claim that the series is created and exported; describe the label values as remaining zero rather than saying that no series carries them.

Useful? React with 👍 / 👎.


<ParamField path="dynamo_component_ckf_mutation_total" type="counter">
CKF block-level mutation outcomes recorded by the router indexer, finer-grained than the event `status` on the counter above. Labeled by `outcome` — see [Metric-specific labels](metric-labels.mdx#metric-specific-labels).
CKF block-level mutation outcomes recorded by the router indexer, labeled by `outcome` — see [Metric-specific labels](metric-labels.mdx#metric-specific-labels). **Registered, always zero.** The series is created and exported, but no code path currently increments it, so it reads 0 in every deployment. Do not build alerts or dashboard panels on it. The standalone indexer exports the same counter as `dynamo_kvrouter_ckf_mutation_total`, with the same caveat.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Qualify registration to local-indexer deployments

The component series is not created in every deployment: when overlap_score_credit == 0.0, Indexer::new returns Indexer::None before any KvIndexerMetrics::from_component call (lib/llm/src/kv_router/indexer/mod.rs lines 89–90), which includes non-KV configurations already described elsewhere in this catalog as not registering indexer metrics. Consequently /metrics has no dynamo_component_ckf_mutation_total in that configuration, rather than a zero-valued series; qualify this statement to deployments that construct a local KV indexer and reflect that condition in the availability information.

Useful? React with 👍 / 👎.

@pvijayakrish
pvijayakrish merged commit 65efdff into release/1.4.0 Aug 14, 2026
90 of 91 checks passed
@pvijayakrish
pvijayakrish deleted the dagil-nvidia/fix-ckf-always-zero-140 branch August 14, 2026 00:51
dagil-nvidia added a commit that referenced this pull request Aug 14, 2026
Re-snapshot docs/ from main (46 further commits since the first snapshot),
re-apply the release ledger at the new paths - the 1.4.0 image-tag pins,
the shipped-behavior reference sync (#12983), the CKF metric caveats
(#13149), and the UCX/EFA facts (#13049) - and sync docs CI plus both
READMEs from main so no link targets the deleted old layout.

Promote v1.4.0 to current release across the docs values: releases.data.ts
(CURRENT_* consts, v1.4.0 release entry with shipped pins SGLang 0.5.16 /
TRT-LLM 1.3.0rc22 / vLLM 0.26.0 / NIXL 1.3.0-1.3.2 / UCX 1.21.x, CUDA rows,
artifact tags) with regenerated reference pages, and bump copy-paste
container tags in install guides (EN/zh-CN), READMEs, profiler and guide
examples. Recipe-mirroring pages keep their deliberate validation pins.

Signed-off-by: Dan Gil <dagil@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs documentation Improvements or additions to documentation size/XS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants