Repository navigation
feat(observability): tracing bake-off sandbox, candidate manifests, fan-out, teardown and runbook (config slice of #1280) #1355
Description
Context
Split from #1280 by owner decision (2026-09-24). The first implementer run on #1280 ended no-commits: the proposal mixed reproducible gitops/config work with live-cluster measurement, and the implementer correctly refused the live half.
This issue owns the reproducible code/config slice: everything that can be written, rendered and tested offline and merged inert. #1280 keeps the live bake-off: opening the sandbox, soaking, measuring, scoring, deciding and tearing down, all run by a human operator.
Scope
All of it is off by default. With otelCollector.eval.enabled: false, the rendered output of platform-gitops/bootstrap must be byte-identical to today's.
-
Sandbox namespace and manifests.
ResourceQuota+LimitRangeforobservability-evalinside the existingotelCollector.eval.enabledguard, driven by neweval.quota/eval.limitsvalues:- the caps are
persistentvolumeclaims: 4andrequests.storage: 40Gi; - a render test asserts them.
- the caps are
-
Candidate deployments. One manifest set per candidate that survives the Stage A paper screen (from the spike(observability): compare Traceway, Tempo, Langfuse, Phoenix, SigNoz and Grafana Agent Observability #903 rubric), each behind its own per-candidate flag under
otelCollector.eval, with a pinned chart/image version:- no candidate is enabled in this issue;
- candidate F (
agento11y) is prepared only as the self-managed shape; - the Grafana Cloud shape needs no in-cluster manifests; its evaluation belongs to spike(observability): run the live tracing backend bake-off and decide #1280.
-
Collector fan-out config. The OTel Collector exporter/pipeline fan-out to the enabled candidates, rendered only for candidates whose flag is on, plus a render test:
- with all flags off, there is no fan-out;
- with one flag on, there is exactly one extra exporter and the production pipeline is unchanged.
-
Redaction regression test. A test that renders the collector and checks two things:
gen_ai.usage.{input,output,cache_read_input,reasoning}_tokenssurvive redaction (otel-collector: redaction drops all GenAI token-count attributes; deployment.environment uses a deprecated key #1332);github_token,authorization,api_keyandvault.tokenare still blocked.
Wire it into
validate-manifests.yml. If otel-collector: redaction drops all GenAI token-count attributes; deployment.environment uses a deprecated key #1332 is still unfixed, the test is committed as an expected failure that names otel-collector: redaction drops all GenAI token-count attributes; deployment.environment uses a deprecated key #1332. -
Teardown automation. Two parts:
otelCollector.eval.teardownAfteris enforced by a CI check that fails once the date has passed whileeval.enabledis still true;- a documented one-commit teardown (flags off) that removes every candidate and the namespace.
-
Runbook.
docs/runbooks/tracing-bake-off.mdis the operator procedure spike(observability): run the live tracing backend bake-off and decide #1280 executes:- preconditions check;
- open the sandbox and set the teardown date (≤ 14 days);
- declare the soak window and trace volume before measuring;
- where each rubric cell's measurement comes from;
- the scoring and ADR promotion steps;
- teardown and verification that nothing is left running.
Out of scope (stays in #1280)
- Enabling the sandbox or any candidate in the live cluster.
- The soak, every measurement and every rubric score.
- The ADR decision.
- The actual teardown.
Acceptance
- With every eval flag off,
helm template platform-gitops/bootstrapis unchanged versusmain. This is checked in CI. - Render tests cover the quota/limits, per-candidate enablement, fan-out on/off, and the redaction rules.
- The teardown-date CI check exists and is tested for both states.
- The runbook covers every step spike(observability): run the live tracing backend bake-off and decide #1280 needs and references each flag by name.
- No non-null rubric score cell is committed.
Related
- spike(observability): run the live tracing backend bake-off and decide #1280: the live bake-off and decision (human/operator acceptance).
- spike(observability): compare Traceway, Tempo, Langfuse, Phoenix, SigNoz and Grafana Agent Observability #903: the rubric, fixtures and fan-out harness.
- otel-collector: redaction drops all GenAI token-count attributes; deployment.environment uses a deprecated key #1332: collector token redaction.
- Roadmap epic roadmap(observability): vendor-neutral execution tracing for agents and DevLoop .github#55.
Activity
mctl-agents commentedon Sep 24, 2026
mctl-agents issue-investigator has analyzed this issue and created a proposal:
https://github.com/mctlhq/mctl-gitops/tree/main/platform-gitops/agents-state/mctl-gitops/proposals/issue-1355-feat-observability-tracing-bake-off-sand/
Status:
proposed— pending human approval. Reviewrequirements.md,design.mdandtasks.md, then approve: signal this issue's DevLoopWorkflow (mctl-apiPOST /api/v1/agents/dev-loop/dev-loop-mctlhq-mctl-gitops-1355/approve, orpython -m orchestrator.temporal.cli approve dev-loop-mctlhq-mctl-gitops-1355 --approver <your-identity>) — the workflow flips.status.yamltoacceptedvia themctl-agents-approveoperation and runs the Tier 2 implementer. If no DevLoopWorkflow is running for this issue (pre-Temporal proposal), run themctl-agents-approveoperation directly withservice=mctl-gitops slug=issue-1355-feat-observability-tracing-bake-off-sand.The approver is recorded in
.status.yamland in the gitops commit, and the implementer refuses a proposal whosecontrol.requires_human_approvalcarries no named approver — so prefer the mctl-api endpoint, which takes the approver from the authenticated caller rather than from what the caller types.chore(agents): investigate #1355 2026-09-24
mashkovd commentedon Sep 24, 2026
APPROVED by the owner (2026-09-24), with these decisions on the proposal's open questions:
Candidate manifests in this slice: Tempo and agento11y self-managed only. Do not add the UNVERIFIED candidates merely to make the sandbox exhaustive.
Do NOT modify the frozen rubric to add agento11y in this config slice. Rubric and scoring changes remain part of the live spike(observability): run the live tracing backend bake-off and decide #1280 work.
Exact chart/image pins must be resolved from authoritative upstream sources at implementation time. If a pin cannot be verified:
The sandbox budget is accepted:
requests.cpurequests.memorylimits.cpulimits.memorypodspersistentvolumeclaimsrequests.storageThe teardown deadline check uses the CI's current date.
--todayis only for deterministic tests.Everything must merge inert:
eval.enabled=false;false;otel-collector: redaction drops all GenAI token-count attributes; deployment.environment uses a deprecated key #1332 is NOT fixed in this issue. The expected-failure mechanism may expose it in CI, but it must fail loudly once the bug disappears (a strict xfail, not a silent skip).
Preserve the acceptance invariant: the default render is byte-identical to
main.