oh-my-agent-commandcode 0.0.0-stage → 20.38.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -2
- package/filter-test-output.sh +52 -0
- package/mods/oma.ts +347 -0
- package/package.json +30 -4
- package/skills/_shared/conditional/experiment-ledger.md +28 -0
- package/skills/_shared/conditional/exploration-loop.md +22 -0
- package/skills/_shared/conditional/quality-score.md +33 -0
- package/skills/_shared/core/anti-ai-prose.md +191 -0
- package/skills/_shared/core/api-contracts/README.md +28 -0
- package/skills/_shared/core/api-contracts/template.md +90 -0
- package/skills/_shared/core/clarification-protocol.md +23 -0
- package/skills/_shared/core/code-intelligence.md +46 -0
- package/skills/_shared/core/collaboration-policy.md +28 -0
- package/skills/_shared/core/common-checklist.md +28 -0
- package/skills/_shared/core/context-budget.md +22 -0
- package/skills/_shared/core/context-loading.md +34 -0
- package/skills/_shared/core/difficulty-guide.md +26 -0
- package/skills/_shared/core/execution-policy.md +31 -0
- package/skills/_shared/core/lessons-learned.md +33 -0
- package/skills/_shared/core/prompt-structure.md +18 -0
- package/skills/_shared/core/quality-principles.md +11 -0
- package/skills/_shared/core/session-metrics.md +35 -0
- package/skills/_shared/core/skill-routing.md +39 -0
- package/skills/_shared/core/test-approach.md +54 -0
- package/skills/_shared/core/vendor-detection.md +52 -0
- package/skills/_shared/runtime/memory-protocol.md +118 -0
- package/skills/_shared/runtime/result-contract.md +64 -0
- package/skills/_shared/ui-interaction-quality.md +133 -0
- package/skills/oma-academic-writing/SKILL.md +181 -0
- package/skills/oma-academic-writing/resources/abstract-guide.md +51 -0
- package/skills/oma-academic-writing/resources/academic-verb-tiers.md +42 -0
- package/skills/oma-academic-writing/resources/anti-ai-checklist.md +52 -0
- package/skills/oma-academic-writing/resources/hedging-guide.md +132 -0
- package/skills/oma-academic-writing/resources/sentence-structure-reference.md +151 -0
- package/skills/oma-architecture/SKILL.md +203 -0
- package/skills/oma-architecture/resources/api-evolution.md +41 -0
- package/skills/oma-architecture/resources/checklist.md +42 -0
- package/skills/oma-architecture/resources/execution-protocol.md +115 -0
- package/skills/oma-architecture/resources/methodology-selection.md +92 -0
- package/skills/oma-architecture/resources/migration-patterns.md +28 -0
- package/skills/oma-architecture/resources/output-templates.md +111 -0
- package/skills/oma-architecture/resources/stakeholder-synthesis.md +80 -0
- package/skills/oma-backend/SKILL.md +202 -0
- package/skills/oma-backend/resources/checklist.md +45 -0
- package/skills/oma-backend/resources/error-playbook.md +97 -0
- package/skills/oma-backend/resources/execution-protocol.md +39 -0
- package/skills/oma-backend/resources/orm-reference.md +61 -0
- package/skills/oma-backend/variants/node/api-template.ts +315 -0
- package/skills/oma-backend/variants/node/snippets.md +475 -0
- package/skills/oma-backend/variants/node/stack.yaml +21 -0
- package/skills/oma-backend/variants/node/tech-stack.md +33 -0
- package/skills/oma-backend/variants/python/api-template.py +378 -0
- package/skills/oma-backend/variants/python/snippets.md +199 -0
- package/skills/oma-backend/variants/python/stack.yaml +18 -0
- package/skills/oma-backend/variants/python/tech-stack.md +45 -0
- package/skills/oma-backend/variants/rust/api-template.rs +635 -0
- package/skills/oma-backend/variants/rust/snippets.md +471 -0
- package/skills/oma-backend/variants/rust/stack.yaml +20 -0
- package/skills/oma-backend/variants/rust/tech-stack.md +36 -0
- package/skills/oma-backend/variants/stack.schema.json +73 -0
- package/skills/oma-brainstorm/SKILL.md +166 -0
- package/skills/oma-brainstorm/resources/triz-lite.md +117 -0
- package/skills/oma-coordination/SKILL.md +171 -0
- package/skills/oma-db/SKILL.md +201 -0
- package/skills/oma-db/resources/anti-patterns.md +177 -0
- package/skills/oma-db/resources/checklist.md +67 -0
- package/skills/oma-db/resources/document-templates.md +107 -0
- package/skills/oma-db/resources/error-playbook.md +50 -0
- package/skills/oma-db/resources/examples.md +170 -0
- package/skills/oma-db/resources/execution-protocol.md +127 -0
- package/skills/oma-db/resources/iso-controls.md +98 -0
- package/skills/oma-db/resources/migration-playbook.md +93 -0
- package/skills/oma-db/resources/query-tuning.md +57 -0
- package/skills/oma-db/resources/vector-db.md +159 -0
- package/skills/oma-debug/SKILL.md +146 -0
- package/skills/oma-debug/resources/bug-report-template.md +327 -0
- package/skills/oma-debug/resources/checklist.md +31 -0
- package/skills/oma-debug/resources/common-patterns.md +734 -0
- package/skills/oma-debug/resources/debugging-checklist.md +364 -0
- package/skills/oma-debug/resources/error-playbook.md +94 -0
- package/skills/oma-debug/resources/execution-protocol.md +40 -0
- package/skills/oma-design/SKILL.md +135 -0
- package/skills/oma-design/resources/asset-strategy.md +34 -0
- package/skills/oma-design/resources/checklist.md +63 -0
- package/skills/oma-design/resources/data-grid.md +48 -0
- package/skills/oma-design/resources/design-md-spec.md +107 -0
- package/skills/oma-design/resources/design-tokens.md +53 -0
- package/skills/oma-design/resources/error-playbook.md +18 -0
- package/skills/oma-design/resources/execution-protocol.md +95 -0
- package/skills/oma-design/resources/external-design-skills.md +130 -0
- package/skills/oma-design/resources/getdesign-fetcher.md +104 -0
- package/skills/oma-design/resources/product-interface-review.md +59 -0
- package/skills/oma-design/resources/redesign-protocol.md +52 -0
- package/skills/oma-design/resources/stitch-integration.md +244 -0
- package/skills/oma-dev-workflow/SKILL.md +375 -0
- package/skills/oma-dev-workflow/resources/affected-checks.py +58 -0
- package/skills/oma-dev-workflow/resources/api-workflows.md +58 -0
- package/skills/oma-dev-workflow/resources/database-patterns.md +107 -0
- package/skills/oma-dev-workflow/resources/i18n-patterns.md +63 -0
- package/skills/oma-dev-workflow/resources/release-coordination.md +240 -0
- package/skills/oma-dev-workflow/resources/tooling-profiles.md +217 -0
- package/skills/oma-dev-workflow/resources/troubleshooting.md +78 -0
- package/skills/oma-dev-workflow/resources/validation-pipeline.md +246 -0
- package/skills/oma-docs/SKILL.md +77 -0
- package/skills/oma-docs/resources/commands.md +76 -0
- package/skills/oma-explanation/SKILL.md +212 -0
- package/skills/oma-explanation/resources/document-structure.md +115 -0
- package/skills/oma-explanation/resources/draft-format.md +199 -0
- package/skills/oma-explanation/resources/html-contract.md +102 -0
- package/skills/oma-frontend/SKILL.md +227 -0
- package/skills/oma-frontend/resources/angular-rules.md +110 -0
- package/skills/oma-frontend/resources/checklist.md +76 -0
- package/skills/oma-frontend/resources/error-playbook.md +125 -0
- package/skills/oma-frontend/resources/execution-protocol.md +46 -0
- package/skills/oma-frontend/resources/snippets.md +354 -0
- package/skills/oma-frontend/resources/specialized-visual-implementation.md +193 -0
- package/skills/oma-frontend/resources/tailwind-rules.md +83 -0
- package/skills/oma-frontend/resources/tech-stack.md +156 -0
- package/skills/oma-hwp/SKILL.md +166 -0
- package/skills/oma-hwp/config/hwp-config.yaml +35 -0
- package/skills/oma-hwp/resources/balanced-tables.ts +39 -0
- package/skills/oma-hwp/resources/execution-protocol.md +145 -0
- package/skills/oma-hwp/resources/flatten-tables.ts +101 -0
- package/skills/oma-hwp/resources/package.json +13 -0
- package/skills/oma-hwp/resources/troubleshooting.md +70 -0
- package/skills/oma-hwp/resources/tsconfig.json +10 -0
- package/skills/oma-hwp/resources/turndown-plugin-gfm.d.ts +9 -0
- package/skills/oma-image/SKILL.md +142 -0
- package/skills/oma-image/config/image-config.yaml +70 -0
- package/skills/oma-image/resources/checklist.md +18 -0
- package/skills/oma-image/resources/execution-protocol.md +117 -0
- package/skills/oma-image/resources/invocation.md +105 -0
- package/skills/oma-image/resources/prompt-tips.md +71 -0
- package/skills/oma-image/resources/vendor-matrix.md +90 -0
- package/skills/oma-market/SKILL.md +142 -0
- package/skills/oma-market/resources/checklist.md +12 -0
- package/skills/oma-market/resources/error-playbook.md +12 -0
- package/skills/oma-market/resources/execution-protocol.md +60 -0
- package/skills/oma-market/resources/frameworks/pestel.md +101 -0
- package/skills/oma-market/resources/frameworks/porters-5f.md +90 -0
- package/skills/oma-market/resources/frameworks/swot.md +61 -0
- package/skills/oma-market/resources/intent-rules.md +35 -0
- package/skills/oma-market/resources/output-laws.md +53 -0
- package/skills/oma-mobile/SKILL.md +168 -0
- package/skills/oma-mobile/resources/checklist.md +77 -0
- package/skills/oma-mobile/resources/error-playbook.md +198 -0
- package/skills/oma-mobile/resources/execution-protocol.md +47 -0
- package/skills/oma-mobile/resources/screen-template.dart +331 -0
- package/skills/oma-mobile/resources/screen-template.swift +239 -0
- package/skills/oma-mobile/resources/screen-template.tsx +179 -0
- package/skills/oma-mobile/resources/tech-stack.md +69 -0
- package/skills/oma-mobile/variants/README.md +45 -0
- package/skills/oma-mobile/variants/flutter/api-template.dart +461 -0
- package/skills/oma-mobile/variants/flutter/snippets.md +1353 -0
- package/skills/oma-mobile/variants/flutter/stack.yaml +21 -0
- package/skills/oma-mobile/variants/flutter/tech-stack.md +201 -0
- package/skills/oma-mobile/variants/kotlin-android/api-template.kt +182 -0
- package/skills/oma-mobile/variants/kotlin-android/snippets.md +871 -0
- package/skills/oma-mobile/variants/kotlin-android/stack.yaml +32 -0
- package/skills/oma-mobile/variants/kotlin-android/tech-stack.md +159 -0
- package/skills/oma-mobile/variants/react-native/api-template.ts +531 -0
- package/skills/oma-mobile/variants/react-native/snippets.md +1014 -0
- package/skills/oma-mobile/variants/react-native/stack.yaml +22 -0
- package/skills/oma-mobile/variants/react-native/tech-stack.md +192 -0
- package/skills/oma-mobile/variants/stack.schema.json +68 -0
- package/skills/oma-mobile/variants/swift-ios/api-template.swift +165 -0
- package/skills/oma-mobile/variants/swift-ios/snippets.md +1028 -0
- package/skills/oma-mobile/variants/swift-ios/stack.yaml +25 -0
- package/skills/oma-mobile/variants/swift-ios/tech-stack.md +174 -0
- package/skills/oma-observability/SKILL.md +225 -0
- package/skills/oma-observability/resources/anti-patterns.md +555 -0
- package/skills/oma-observability/resources/boundaries/cross-application.md +348 -0
- package/skills/oma-observability/resources/boundaries/multi-tenant.md +290 -0
- package/skills/oma-observability/resources/boundaries/release.md +372 -0
- package/skills/oma-observability/resources/boundaries/slo.md +225 -0
- package/skills/oma-observability/resources/checklist.md +123 -0
- package/skills/oma-observability/resources/examples.md +448 -0
- package/skills/oma-observability/resources/execution-protocol.md +166 -0
- package/skills/oma-observability/resources/incident-forensics.md +348 -0
- package/skills/oma-observability/resources/intent-rules.md +307 -0
- package/skills/oma-observability/resources/layers/L3-network.md +281 -0
- package/skills/oma-observability/resources/layers/L4-transport.md +299 -0
- package/skills/oma-observability/resources/layers/L7-application/crash-analytics.md +359 -0
- package/skills/oma-observability/resources/layers/L7-application/mobile-rum.md +278 -0
- package/skills/oma-observability/resources/layers/L7-application/waf.md +246 -0
- package/skills/oma-observability/resources/layers/L7-application/web-rum.md +350 -0
- package/skills/oma-observability/resources/layers/mesh.md +368 -0
- package/skills/oma-observability/resources/matrix.md +177 -0
- package/skills/oma-observability/resources/meta-observability.md +605 -0
- package/skills/oma-observability/resources/observability-as-code.md +666 -0
- package/skills/oma-observability/resources/signals/audit.md +310 -0
- package/skills/oma-observability/resources/signals/cost.md +303 -0
- package/skills/oma-observability/resources/signals/logs.md +263 -0
- package/skills/oma-observability/resources/signals/metrics.md +478 -0
- package/skills/oma-observability/resources/signals/privacy.md +351 -0
- package/skills/oma-observability/resources/signals/profiles.md +245 -0
- package/skills/oma-observability/resources/signals/traces.md +360 -0
- package/skills/oma-observability/resources/standards.md +214 -0
- package/skills/oma-observability/resources/transport/collector-topology.md +308 -0
- package/skills/oma-observability/resources/transport/otlp-grpc-vs-http.md +256 -0
- package/skills/oma-observability/resources/transport/sampling-recipes.md +297 -0
- package/skills/oma-observability/resources/transport/udp-statsd-mtu.md +167 -0
- package/skills/oma-observability/resources/vendor-categories.md +352 -0
- package/skills/oma-orchestration/SKILL.md +302 -0
- package/skills/oma-orchestration/config/cli-config.yaml +92 -0
- package/skills/oma-orchestration/resources/memory-schema.md +232 -0
- package/skills/oma-orchestration/resources/subagent-prompt-template.md +30 -0
- package/skills/oma-orchestration/scripts/parallel-run.sh +6 -0
- package/skills/oma-orchestration/scripts/spawn-agent.sh +5 -0
- package/skills/oma-orchestration/scripts/verify.sh +20 -0
- package/skills/oma-orchestration/templates/backend-task.md +19 -0
- package/skills/oma-orchestration/templates/debug-task.md +16 -0
- package/skills/oma-orchestration/templates/frontend-task.md +18 -0
- package/skills/oma-orchestration/templates/mobile-task.md +18 -0
- package/skills/oma-orchestration/templates/qa-task.md +16 -0
- package/skills/oma-orchestration/templates/tasks-example.yaml +15 -0
- package/skills/oma-pdf/SKILL.md +162 -0
- package/skills/oma-pdf/config/pdf-config.yaml +27 -0
- package/skills/oma-pdf/resources/execution-protocol.md +127 -0
- package/skills/oma-pm/SKILL.md +157 -0
- package/skills/oma-pm/resources/error-playbook.md +75 -0
- package/skills/oma-pm/resources/examples.md +439 -0
- package/skills/oma-pm/resources/execution-protocol.md +62 -0
- package/skills/oma-pm/resources/iso-planning.md +110 -0
- package/skills/oma-pm/resources/plan-phase-protocol.md +66 -0
- package/skills/oma-pm/resources/task-template.json +86 -0
- package/skills/oma-qa/SKILL.md +141 -0
- package/skills/oma-qa/resources/checklist.md +339 -0
- package/skills/oma-qa/resources/error-playbook.md +98 -0
- package/skills/oma-qa/resources/execution-protocol.md +169 -0
- package/skills/oma-qa/resources/iso-quality.md +82 -0
- package/skills/oma-qa/resources/verify-ship-protocol.md +116 -0
- package/skills/oma-recap/SKILL.md +245 -0
- package/skills/oma-recap/resources/output-formats.md +83 -0
- package/skills/oma-refactor/SKILL.md +184 -0
- package/skills/oma-refactor/resources/definition.md +108 -0
- package/skills/oma-refactor/resources/governance.md +33 -0
- package/skills/oma-refactor/resources/hotspots.py +44 -0
- package/skills/oma-refactor/resources/measurement.md +93 -0
- package/skills/oma-scholar/SKILL.md +276 -0
- package/skills/oma-scholar/config/scholar-config.yaml +79 -0
- package/skills/oma-scholar/resources/api-endpoints.md +174 -0
- package/skills/oma-scholar/resources/checklist.md +92 -0
- package/skills/oma-scholar/resources/execution-protocol.md +224 -0
- package/skills/oma-scholar/resources/fallback-providers.md +143 -0
- package/skills/oma-scholar/resources/setup-openalex.md +85 -0
- package/skills/oma-scholar/resources/sidecar-spec.md +341 -0
- package/skills/oma-scholar/resources/upstream-spec-cache.md +972 -0
- package/skills/oma-scm/SKILL.md +103 -0
- package/skills/oma-scm/resources/cm-operations.md +56 -0
- package/skills/oma-scm/resources/codeowners-playbook.md +45 -0
- package/skills/oma-scm/resources/conventional-commits.md +108 -0
- package/skills/oma-scm/resources/merge-risk.md +76 -0
- package/skills/oma-scm/resources/onboarding-risk-signals.md +71 -0
- package/skills/oma-search/SKILL.md +125 -0
- package/skills/oma-search/resources/checklist.md +36 -0
- package/skills/oma-search/resources/error-playbook.md +66 -0
- package/skills/oma-search/resources/examples.md +80 -0
- package/skills/oma-search/resources/execution-protocol.md +86 -0
- package/skills/oma-search/resources/intent-rules.md +47 -0
- package/skills/oma-search/resources/trust-registry.md +53 -0
- package/skills/oma-security/SKILL.md +172 -0
- package/skills/oma-security/resources/artex.md +108 -0
- package/skills/oma-security/resources/ci.md +134 -0
- package/skills/oma-security/resources/cisco-source.md +108 -0
- package/skills/oma-security/resources/deepsec-config.md +45 -0
- package/skills/oma-security/resources/deepsec-matchers.md +35 -0
- package/skills/oma-security/resources/deepsec-scanning.md +45 -0
- package/skills/oma-security/resources/deepsec-setup.md +41 -0
- package/skills/oma-security/resources/findings-contract.md +408 -0
- package/skills/oma-security/resources/mcp-scanning.md +122 -0
- package/skills/oma-security/resources/skill-scanning.md +106 -0
- package/skills/oma-security/resources/validation.md +71 -0
- package/skills/oma-skill-creation/SKILL.md +84 -0
- package/skills/oma-skill-creation/resources/prompt-evaluation.md +36 -0
- package/skills/oma-skill-creation/resources/ssl-lite-template.md +108 -0
- package/skills/oma-skill-creation/resources/validation-checklist.md +101 -0
- package/skills/oma-slide/SKILL.md +277 -0
- package/skills/oma-slide/resources/animation-patterns.md +245 -0
- package/skills/oma-slide/resources/assets/deck-stage.js +514 -0
- package/skills/oma-slide/resources/assets/viewport-base.css +257 -0
- package/skills/oma-slide/resources/canva-integration.md +203 -0
- package/skills/oma-slide/resources/checklist.md +46 -0
- package/skills/oma-slide/resources/design-doctrine.md +260 -0
- package/skills/oma-slide/resources/fixed-stage.md +232 -0
- package/skills/oma-slide/resources/generation-protocol.md +393 -0
- package/skills/oma-slide/resources/native-pptx.md +84 -0
- package/skills/oma-slide/resources/selection-index.json +461 -0
- package/skills/oma-slide/resources/style-presets.LICENSE +10 -0
- package/skills/oma-slide/resources/style-presets.md +520 -0
- package/skills/oma-tf-infra/SKILL.md +201 -0
- package/skills/oma-tf-infra/resources/checklist.md +53 -0
- package/skills/oma-tf-infra/resources/cost-optimization.md +574 -0
- package/skills/oma-tf-infra/resources/error-playbook.md +68 -0
- package/skills/oma-tf-infra/resources/examples.md +38 -0
- package/skills/oma-tf-infra/resources/execution-protocol.md +129 -0
- package/skills/oma-tf-infra/resources/iso-42001-infra.md +229 -0
- package/skills/oma-tf-infra/resources/multi-cloud-examples.md +241 -0
- package/skills/oma-tf-infra/resources/policy-testing-examples.md +332 -0
- package/skills/oma-translation/SKILL.md +229 -0
- package/skills/oma-translation/resources/anti-ai-patterns.md +104 -0
- package/skills/oma-translation/resources/lang/_template.md +73 -0
- package/skills/oma-translation/resources/lang/en.md +123 -0
- package/skills/oma-translation/resources/lang/ja.md +274 -0
- package/skills/oma-translation/resources/lang/ko.md +228 -0
- package/skills/oma-translation/resources/lang/zh.md +285 -0
- package/skills/oma-translation/resources/style-skills.md +104 -0
- package/skills/oma-translation/resources/translation-rubric.md +126 -0
- package/skills/oma-video/SKILL.md +229 -0
- package/skills/oma-video/config/video-config.yaml +60 -0
- package/skills/oma-video/resources/checklist.md +26 -0
- package/skills/oma-video/resources/execution-protocol.md +122 -0
- package/skills/oma-video/resources/existing-media.md +185 -0
- package/skills/oma-video/resources/hyperframes-authoring/README.md +44 -0
- package/skills/oma-video/resources/hyperframes-authoring/demo.md +31 -0
- package/skills/oma-video/resources/hyperframes-authoring/explainer.md +10 -0
- package/skills/oma-video/resources/hyperframes-authoring/shorts.md +10 -0
- package/skills/oma-video/resources/motion-principles.md +81 -0
- package/skills/oma-video/resources/mpt/driver.py +301 -0
- package/skills/oma-video/resources/prompt-tips.md +75 -0
- package/skills/oma-video/resources/script-schema.md +81 -0
- package/skills/oma-video/resources/sound-design.md +127 -0
- package/skills/oma-video/resources/strudel/package.json +11 -0
- package/skills/oma-video/resources/strudel/page.html +87 -0
- package/skills/oma-video/resources/strudel/render.mjs +295 -0
- package/skills/oma-video/resources/vendor-matrix.md +124 -0
- package/skills/oma-voice/SKILL.md +249 -0
- package/skills/oma-voice/config/voice-config.yaml +30 -0
- package/skills/oma-voice/resources/audio-processing.md +119 -0
- package/skills/oma-voice/resources/checklist.md +47 -0
- package/skills/oma-voice/resources/execution-protocol.md +215 -0
- package/skills/oma-voice/resources/prompt-tips.md +43 -0
- package/skills/oma-voice/resources/voice-matrix.md +51 -0
- package/skills/oma-voice/resources/voicestudio.md +87 -0
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
---
|
|
2
|
+
otel_spec: "1.x (stable API/SDK)"
|
|
3
|
+
otel_semconv: "1.43.0 (2026-07)"
|
|
4
|
+
specs:
|
|
5
|
+
- "W3C Trace Context: Level 1 Recommendation 2020-02-06; Level 2 Candidate Recommendation"
|
|
6
|
+
- "W3C Baggage: Recommendation 2022-12-22"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Cross-Application Observability Boundary
|
|
10
|
+
|
|
11
|
+
## 1. Scope
|
|
12
|
+
|
|
13
|
+
This file governs trace context, request correlation, causation chains, and baggage propagation across application boundaries; including service-to-service, cross-cloud, and cross-mesh calls.
|
|
14
|
+
|
|
15
|
+
Design decision D3 absorbs two formerly separate documents into this file:
|
|
16
|
+
|
|
17
|
+
- **Propagators** (formerly `propagators.md`): per-ecosystem header formats and normalization rules for W3C, B3, AWS X-Ray, GCP, Azure, Datadog, Cloudflare, Istio/Envoy, and Linkerd.
|
|
18
|
+
- **DDD bounded context** (formerly `multi-domain.md`): `service.namespace` as the domain grouping attribute for multi-service architectures.
|
|
19
|
+
|
|
20
|
+
Cross-references to other files in this skill use the `../` prefix convention.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 2. 4-Layer Correlation Model
|
|
25
|
+
|
|
26
|
+
Distributed systems require four distinct correlation identifiers, each serving a different audience and cardinality need. Using only `trace_id` conflates concerns; using only `request_id` loses async chain visibility.
|
|
27
|
+
|
|
28
|
+
| Layer | Identifier | Propagation mechanism | Cardinality | Primary audience |
|
|
29
|
+
|-------|-----------|----------------------|-------------|-----------------|
|
|
30
|
+
| Infra / Trace | `trace_id` / `span_id` | W3C `traceparent` header | 1 per trace | Platform engineers, trace backends |
|
|
31
|
+
| Correlation | `request_id` (`x-request-id`) | HTTP header + log field `http.request.id` | 1 per request | Customer support, error banners, frontend users |
|
|
32
|
+
| Causation | `causation_id` | Message headers (Kafka, SQS, RabbitMQ) | 1 per event chain | Async workflow lineage, CQRS / event sourcing |
|
|
33
|
+
| Idempotency | `idempotency_key` | HTTP header (`Idempotency-Key`) or message header | 1 per business operation | Duplicate-processing guard; distinct from causation |
|
|
34
|
+
| Business | `user.id`, `tenant.id`, `order.id` | W3C Baggage (`baggage` header) | Per business entity | Product analytics, cross-cutting dashboards |
|
|
35
|
+
|
|
36
|
+
> **Causation vs. idempotency are distinct**; `causation_id` expresses event ancestry (what triggered this event) and is often unique per edge in an event chain; `idempotency_key` is a business-level deduplication token shared by all retries of the same operation. Using a single header for both breaks dedup logic during retry if the causation chain diverges. Implement as two separate attributes / headers.
|
|
37
|
+
|
|
38
|
+
### 2.1 trace_id
|
|
39
|
+
|
|
40
|
+
Auto-generated by the OTel SDK at the trace root. 128-bit, encoded as 32 lowercase hex characters. Carried in `traceparent`. This is an **internal platform identifier**; do not expose it directly to end users because it reveals internal infrastructure topology. Its role is to be the carrier that links all spans in one distributed trace.
|
|
41
|
+
|
|
42
|
+
### 2.2 request_id
|
|
43
|
+
|
|
44
|
+
Human-facing correlation ID. Must appear in:
|
|
45
|
+
|
|
46
|
+
- Every outbound HTTP response header (`x-request-id`)
|
|
47
|
+
- Every log record as a structured field (`http.request.id` span attribute)
|
|
48
|
+
- User-visible error banners on the frontend (support ticket anchor)
|
|
49
|
+
|
|
50
|
+
The frontend generates a UUIDv4 `request_id` and sends it on every outbound request. Middleware sets the span attribute and logs the field. Customer support agents hand users a `request_id` from the error banner; platform engineers query logs to retrieve `trace_id` and pivot to the distributed trace waterfall.
|
|
51
|
+
|
|
52
|
+
Cross-ref `../incident-forensics.md §MRA` for the support-to-trace lookup flow.
|
|
53
|
+
|
|
54
|
+
### 2.3 causation_id / idempotency_key
|
|
55
|
+
|
|
56
|
+
Event-driven and async workflows break the synchronous call chain. A Kafka consumer processing a payment event may run minutes after the HTTP request that produced it. `causation_id` links the new trace back to the originating event chain without forcing a parent-child span relationship.
|
|
57
|
+
|
|
58
|
+
- HTTP POST: set `Idempotency-Key` request header → record as span attribute
|
|
59
|
+
- Kafka producer: write `causation_id` into Kafka message header
|
|
60
|
+
- Kafka consumer: extract `causation_id` → create OTel span link (not parent-child) to the originating span
|
|
61
|
+
|
|
62
|
+
Span links are the correct OTel primitive for async causation. Cross-ref `../signals/traces.md §Messaging patterns`.
|
|
63
|
+
|
|
64
|
+
### 2.4 Business context via Baggage
|
|
65
|
+
|
|
66
|
+
Business identifiers (`user.id`, `tenant.id`, `order.id`, `feature.variant`) propagate as W3C Baggage key-value pairs. They flow through every service on the call path and appear as span attributes and log fields, enabling cross-cutting dashboard filters (e.g., "all traces for tenant ACME in the last hour").
|
|
67
|
+
|
|
68
|
+
Baggage carries PII risk. See Section 4 for trust-boundary filtering rules.
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 3. Propagator Matrix
|
|
73
|
+
|
|
74
|
+
The recommended default for all new deployments is **W3C Trace Context**. At ingress or multi-cloud boundaries, extract all known propagator formats and emit W3C downstream; normalization at the edge prevents split-brain traces inside the cluster.
|
|
75
|
+
|
|
76
|
+
| Ecosystem | Header(s) | OTel propagator | Normalization notes |
|
|
77
|
+
|-----------|-----------|----------------|---------------------|
|
|
78
|
+
| **W3C Trace Context** (default) | `traceparent`, `tracestate`, `baggage` | `tracecontext`, `baggage` | L1 Rec 2020-02-06; L2 CR adds random-id flag. Mandatory baseline for all new services. |
|
|
79
|
+
| **B3** (Zipkin legacy) | `x-b3-traceid`, `x-b3-spanid`, `x-b3-parentspanid`, `x-b3-sampled` | `b3multi` / `b3` (single-header) | Use multi-header format. Keep as secondary propagator for Zipkin-legacy services; migrate to W3C for new work. |
|
|
80
|
+
| **AWS X-Ray** | `X-Amzn-Trace-Id` (`Root=1-<ts>-<hex>;Parent=<id>;Sampled=<0\|1>`) | `awsxray` | AWS X-Ray SDK supports W3C output since 2022. Prefer W3C; use X-Ray propagator only for Lambda or services that require X-Ray console trace linking. |
|
|
81
|
+
| **GCP Cloud Trace** | `traceparent` (W3C preferred), legacy `X-Cloud-Trace-Context` | `gcp` propagator | GCP supports both formats. Emit W3C; accept legacy for backward compat. |
|
|
82
|
+
| **Azure Monitor** | `traceparent` (W3C preferred), legacy `Request-Id` | W3C preferred | Application Insights SDK v3+ defaults to W3C. Treat `Request-Id` as read-only legacy input only. |
|
|
83
|
+
| **Datadog APM** | `x-datadog-trace-id`, `x-datadog-parent-id`, `x-datadog-sampling-priority` | `datadog` propagator | Configure Datadog Agent to accept W3C input; use OTel Datadog exporter for span forwarding. |
|
|
84
|
+
| **Cloudflare Workers** | `cf-ray` + W3C `traceparent` | Map `cf-ray` → baggage | `cf-ray` is not a trace ID. Map it to `baggage: cf.ray=<value>` for correlation. Emit W3C `traceparent` on Worker egress calls. |
|
|
85
|
+
| **Istio / Envoy** | W3C `traceparent` + Envoy internal `x-request-id`, `x-ot-span-context` (legacy) | W3C (OTLP tracer, Envoy 1.29+) | `x-ot-span-context` is deprecated as of Envoy 1.29. Cross-ref `../layers/mesh.md §Propagator headers`. |
|
|
86
|
+
| **Linkerd** | `l5d-ctx-trace`, `l5d-ctx-span`, `l5d-ctx-parent`, `l5d-ctx-deadline` | `linkerd` propagator | Linkerd headers are not W3C-compatible. Translate to W3C at the mesh boundary gateway. Cross-ref `../layers/mesh.md §Cross-mesh compatibility rule`. |
|
|
87
|
+
|
|
88
|
+
### 3.1 Multi-propagator strategy at ingress
|
|
89
|
+
|
|
90
|
+
Configure the ingress gateway or API gateway collector with a composite propagator that extracts all known formats. After extraction, emit only W3C downstream:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
Composite extract order (ingress):
|
|
94
|
+
1. tracecontext (W3C — primary)
|
|
95
|
+
2. b3multi (Zipkin legacy)
|
|
96
|
+
3. awsxray (AWS Lambda / API Gateway)
|
|
97
|
+
4. datadog (Datadog-instrumented upstream)
|
|
98
|
+
|
|
99
|
+
Inject order (egress, internal):
|
|
100
|
+
1. tracecontext (W3C — only format emitted internally)
|
|
101
|
+
2. baggage (W3C Baggage — always)
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
This pattern ensures that a request arriving from an AWS Lambda (X-Ray header) or a Datadog-instrumented partner API is absorbed into the W3C trace context and propagated uniformly to all internal services.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 4. Baggage Rules and PII Guidance
|
|
109
|
+
|
|
110
|
+
W3C Baggage propagates to every service on the call path. The W3C Baggage specification §Security states:
|
|
111
|
+
|
|
112
|
+
> "Application owners should either ensure that no proprietary or confidential information is stored in baggage, or ensure baggage is not present in requests that cross trust boundaries."
|
|
113
|
+
|
|
114
|
+
The OTel Baggage API spec does not independently repeat this warning; the normative source is the W3C parent specification. Implementers MUST read both.
|
|
115
|
+
|
|
116
|
+
Cross-ref `../signals/privacy.md §Baggage rules` for the enforcement implementation.
|
|
117
|
+
|
|
118
|
+
### 4.1 Trust-boundary rule
|
|
119
|
+
|
|
120
|
+
At every egress trust boundary (API gateway, external webhook, third-party vendor API), apply a baggage filter:
|
|
121
|
+
|
|
122
|
+
- **Default**: strip all baggage unless the receiving service is on the explicit allowlist.
|
|
123
|
+
- **Allowlist**: maintained per-environment; requires security team sign-off to add entries.
|
|
124
|
+
- **Internal-to-internal**: baggage passes through without filtering (intra-cluster calls within the same trust zone).
|
|
125
|
+
|
|
126
|
+
### 4.2 Allowed and prohibited baggage values
|
|
127
|
+
|
|
128
|
+
| Allowed (safe at any trust level) | Prohibited (must never appear in baggage) |
|
|
129
|
+
|-----------------------------------|------------------------------------------|
|
|
130
|
+
| `tenant.id` (opaque identifier) | `user.email` |
|
|
131
|
+
| `user.tier` (tier name, not PII) | Authentication tokens or session IDs |
|
|
132
|
+
| `feature.variant` | Credit card numbers or PAN |
|
|
133
|
+
| `deployment.sha` | Passwords or API keys |
|
|
134
|
+
| `region.hint` | Any field classified as PII under GDPR / PIPA |
|
|
135
|
+
|
|
136
|
+
### 4.3 Enforcement point
|
|
137
|
+
|
|
138
|
+
The mesh ingress gateway is the primary enforcement point. Configure Envoy's Lua filter or an OTel Collector `attributes` processor at the gateway to drop prohibited keys. Cross-ref `../layers/mesh.md §Baggage scrubbing`.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 5. DDD Bounded Context via service.namespace
|
|
143
|
+
|
|
144
|
+
OpenTelemetry resource attributes `service.name` and `service.namespace` map directly to DDD concepts:
|
|
145
|
+
|
|
146
|
+
| OTel attribute | DDD concept | Example |
|
|
147
|
+
|----------------|-------------|---------|
|
|
148
|
+
| `service.namespace` | Bounded context (domain group) | `payments`, `inventory`, `identity` |
|
|
149
|
+
| `service.name` | Individual microservice | `checkout-api`, `stock-api`, `auth-service` |
|
|
150
|
+
|
|
151
|
+
### 5.1 Why service.namespace matters
|
|
152
|
+
|
|
153
|
+
Without `service.namespace`, a system with 80+ microservices presents a flat list in trace backends and dashboards. Operators cannot distinguish domain-level KPIs from service-level noise.
|
|
154
|
+
|
|
155
|
+
With `service.namespace`, dashboards can be scoped:
|
|
156
|
+
|
|
157
|
+
- `service.namespace = payments` → filter all payment-domain spans, compute payment-domain SLI
|
|
158
|
+
- `service.namespace = inventory` → separate inventory burn-rate alert from payments alert
|
|
159
|
+
|
|
160
|
+
### 5.2 Configuration
|
|
161
|
+
|
|
162
|
+
Set `service.namespace` as an OTel resource attribute at deployment time, not at instrumentation time:
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
# OTel Collector resourcedetection / resource processor
|
|
166
|
+
processors:
|
|
167
|
+
resource:
|
|
168
|
+
attributes:
|
|
169
|
+
- key: service.namespace
|
|
170
|
+
value: payments
|
|
171
|
+
action: upsert
|
|
172
|
+
- key: service.name
|
|
173
|
+
value: checkout-api
|
|
174
|
+
action: upsert
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Alternatively, set via environment variable that the SDK's Environment Resource Detector picks up:
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
OTEL_RESOURCE_ATTRIBUTES=service.namespace=payments,service.name=checkout-api
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 5.3 Anti-pattern: flat service registry
|
|
184
|
+
|
|
185
|
+
One hundred services without namespace grouping causes cognitive overload in the trace backend service map. Namespace assignment is a required step in any multi-service deployment. Assign namespaces aligned with DDD bounded contexts, not with team names or infrastructure regions.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 6. Cross-Cloud Trace Continuity
|
|
190
|
+
|
|
191
|
+
When a request crosses cloud provider boundaries (e.g., App A on AWS calls App B on GCP calls App C on-premises), trace continuity requires W3C `traceparent` on every hop.
|
|
192
|
+
|
|
193
|
+
| Provider | W3C support status |
|
|
194
|
+
|----------|--------------------|
|
|
195
|
+
| AWS X-Ray SDK | W3C output supported since 2022 |
|
|
196
|
+
| GCP Cloud Trace | W3C `traceparent` preferred; legacy `X-Cloud-Trace-Context` still accepted |
|
|
197
|
+
| Azure Monitor | W3C `traceparent` preferred; Application Insights SDK v3+ default |
|
|
198
|
+
| Jaeger (self-managed) | W3C Trace Context since Jaeger v1.35 |
|
|
199
|
+
|
|
200
|
+
Collector bridge strategy: deploy an OTel Collector at each cloud egress point. The Collector normalizes incoming vendor headers to W3C before forwarding to the next cloud's ingress. This ensures that a trace rooted in AWS survives the GCP boundary and terminates in an on-premises Jaeger backend with an unbroken span chain.
|
|
201
|
+
|
|
202
|
+
Cross-ref `../transport/collector-topology.md §Multi-cluster/regional` for Collector deployment patterns.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 7. request_id to trace_id Integration
|
|
207
|
+
|
|
208
|
+
The support escalation flow depends on reliable linkage between the user-visible `request_id` and the internal `trace_id`.
|
|
209
|
+
|
|
210
|
+
**Flow:**
|
|
211
|
+
|
|
212
|
+
1. Frontend generates UUIDv4 `request_id` and sends it on every outbound request.
|
|
213
|
+
2. Backend middleware extracts `request_id`, sets span attribute `http.request.id`, and writes it as a structured log field.
|
|
214
|
+
3. On error, the frontend displays the `request_id` to the user (never `trace_id`; the latter leaks internal topology).
|
|
215
|
+
4. Customer support receives the `request_id` from the user's error screenshot.
|
|
216
|
+
5. Platform engineer queries the log system: `http.request.id = "<request_id>"` → retrieves `trace_id` from the matching log record.
|
|
217
|
+
6. Platform engineer opens the trace waterfall in the trace backend using `trace_id`.
|
|
218
|
+
|
|
219
|
+
Cross-ref `../incident-forensics.md §MRA` for the full minimum reproducible artifact workflow.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## 8. Idempotency and Event-Driven Trace Lineage
|
|
224
|
+
|
|
225
|
+
Idempotency keys and causation IDs are first-class observability primitives in event-driven architectures.
|
|
226
|
+
|
|
227
|
+
**HTTP pattern (Stripe-style):**
|
|
228
|
+
|
|
229
|
+
- Client sends `Idempotency-Key: <uuid>` header on POST.
|
|
230
|
+
- Server records the key as span attribute `http.idempotency_key`.
|
|
231
|
+
- On duplicate detection, the existing response is returned; the `trace_id` of the original attempt is logged alongside the duplicate attempt's `trace_id`.
|
|
232
|
+
|
|
233
|
+
**Kafka / SQS pattern:**
|
|
234
|
+
|
|
235
|
+
- Producer writes `causation_id` (UUIDv4) and original `traceparent` into message headers.
|
|
236
|
+
- Consumer extracts both headers before creating the `CONSUMER` span.
|
|
237
|
+
- Consumer span links to the producer span via `span.addLink(producerSpanContext)`.
|
|
238
|
+
- The link: not parent-child; preserves trace lineage without forcing synchronous ordering assumptions.
|
|
239
|
+
|
|
240
|
+
**DLQ replay:**
|
|
241
|
+
|
|
242
|
+
- When replaying from a dead letter queue, re-inject the original `traceparent` and `causation_id` from the failed message headers. Generating a new `trace_id` at replay severs the forensic chain.
|
|
243
|
+
|
|
244
|
+
Cross-ref `../signals/traces.md §Messaging patterns` for span link implementation details.
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 9. Trust Boundary Patterns
|
|
249
|
+
|
|
250
|
+
| Boundary type | Trace behavior | Baggage behavior |
|
|
251
|
+
|---------------|---------------|-----------------|
|
|
252
|
+
| Internal service to internal service (same cluster) | Forward `traceparent` unchanged | Forward baggage unchanged |
|
|
253
|
+
| Internal service to external API gateway (outbound) | Create new CLIENT span; include `traceparent` only if vendor is on allowlist | Strip all baggage unless vendor is on explicit allowlist |
|
|
254
|
+
| B2B webhook (outbound to partner) | Start a new trace; log original `trace_id` as annotation in the outbound span only | Do not propagate baggage |
|
|
255
|
+
| Third-party vendor API call | Do not propagate `traceparent` unless vendor explicitly supports it | Do not propagate baggage |
|
|
256
|
+
| External partner calling inbound | Extract `traceparent` if present; validate and sanitize | Strip baggage at ingress gateway; reattach only allowlisted keys |
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 10. Context Inheritance in Non-Interactive Sessions
|
|
261
|
+
|
|
262
|
+
CI/CD pipelines, agent workflows, and background jobs need trace context for end-to-end visibility across automated steps.
|
|
263
|
+
|
|
264
|
+
A parent process may explicitly inject W3C context into `TRACEPARENT` and
|
|
265
|
+
optionally `TRACESTATE`, but environment inheritance alone does not establish a
|
|
266
|
+
child span parent. The Environment Resource Detector populates resource attributes;
|
|
267
|
+
it does not extract this carrier as active trace context. Initialize the child's
|
|
268
|
+
SDK, context manager, and W3C propagator before extracting and activating context.
|
|
269
|
+
|
|
270
|
+
```js
|
|
271
|
+
// After SDK/context-manager/propagator initialization in the child process.
|
|
272
|
+
// runJob is the application's job implementation.
|
|
273
|
+
import { context, propagation, ROOT_CONTEXT, trace } from '@opentelemetry/api';
|
|
274
|
+
|
|
275
|
+
const carrier = {};
|
|
276
|
+
if (process.env.TRACEPARENT) carrier.traceparent = process.env.TRACEPARENT;
|
|
277
|
+
if (process.env.TRACESTATE) carrier.tracestate = process.env.TRACESTATE;
|
|
278
|
+
const parent = propagation.extract(ROOT_CONTEXT, carrier);
|
|
279
|
+
const tracer = trace.getTracer('background-job');
|
|
280
|
+
await context.with(parent, () => tracer.startActiveSpan('job', async span => {
|
|
281
|
+
try { return await runJob(); }
|
|
282
|
+
finally { span.end(); }
|
|
283
|
+
}));
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
The configured W3C propagator validates the carrier; absent/invalid trace context
|
|
287
|
+
starts an independent trace. Validate inherited context against the process's
|
|
288
|
+
trust boundary and verify actual parent/trace IDs in a fixture before relying on
|
|
289
|
+
end-to-end correlation. Sources: <https://opentelemetry.io/docs/specs/otel/context/api-propagators/>
|
|
290
|
+
and <https://github.com/open-telemetry/opentelemetry-js/tree/main/packages/opentelemetry-resources>.
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 11. Matrix Coverage
|
|
295
|
+
|
|
296
|
+
These cells from `../matrix.md` are primarily driven by this file:
|
|
297
|
+
|
|
298
|
+
| Layer | Boundary | Signal | Symbol | Primary artifact |
|
|
299
|
+
|-------|----------|--------|--------|-----------------|
|
|
300
|
+
| mesh | cross-application | traces | PASS | W3C `traceparent` in mesh proxy; zero-code injection |
|
|
301
|
+
| L7-application | cross-application | traces | PASS | OTel SDK W3C propagation; DDD `service.namespace` grouping |
|
|
302
|
+
| L7-application | cross-application | privacy | PASS | Baggage trust-boundary filtering at API gateway |
|
|
303
|
+
| L7-application | cross-application | audit | PASS | Correlation across audit events via `trace_id` + `request_id` |
|
|
304
|
+
| L3-network | cross-application | traces | PARTIAL | L3 packets carry no trace context; tagging at egress only |
|
|
305
|
+
| L4-transport | cross-application | traces | PARTIAL | TCP is not trace-native; trace context begins at mesh or L7 |
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
## 12. Anti-Patterns
|
|
310
|
+
|
|
311
|
+
The following extend `../anti-patterns.md §Cross-application`.
|
|
312
|
+
|
|
313
|
+
| Anti-pattern | Consequence | Remediation |
|
|
314
|
+
|---|---|---|
|
|
315
|
+
| Mixed propagators without normalization at ingress | Broken traces at mesh or cloud boundary; spans appear as disconnected root spans | Apply composite propagator at ingress gateway; normalize to W3C downstream |
|
|
316
|
+
| Baggage carrying PII crossing a trust boundary | W3C Baggage spec §Security violation; PII exposed to untrusted downstream services | Strip baggage at egress gateway; use allowlist; never put PII in baggage |
|
|
317
|
+
| `request_id` not exposed to frontend | Customer support cannot correlate user-reported errors to backend traces | Return `x-request-id` in every response; display in error banners |
|
|
318
|
+
| `service.namespace` not set | 100+ services appear as a flat unordered list; domain-level KPIs are impossible | Set `service.namespace` per DDD bounded context in OTel resource attributes |
|
|
319
|
+
| B3-only propagation without W3C fallback | Traces break when crossing any non-Zipkin boundary (GCP, AWS, Azure) | Add `tracecontext` as primary propagator; keep `b3multi` as secondary for legacy |
|
|
320
|
+
| New `trace_id` generated on DLQ replay | Original failure span is orphaned; forensic chain from root cause to replay is severed | Re-inject original `traceparent` and `causation_id` from failed message headers |
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## References
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
Internal cross-references:
|
|
329
|
+
|
|
330
|
+
- `../standards.md`: normative semconv stability tiers and W3C spec versions
|
|
331
|
+
- `../matrix.md`: full 112-cell coverage map (cross-application boundary row)
|
|
332
|
+
- `../layers/mesh.md`: propagator headers per mesh; baggage scrubbing at ingress gateway
|
|
333
|
+
- `../signals/traces.md`: OTel span data model, messaging span links, baggage security
|
|
334
|
+
- `../signals/privacy.md`: PII classification, baggage PII redaction rules
|
|
335
|
+
- `../signals/audit.md`: audit event correlation across application boundaries
|
|
336
|
+
- `../transport/collector-topology.md`: multi-cluster and multi-region Collector bridge patterns
|
|
337
|
+
- `../incident-forensics.md`: request_id to trace_id lookup flow (MRA section)
|
|
338
|
+
|
|
339
|
+
### Primary sources
|
|
340
|
+
|
|
341
|
+
- W3C Trace Context Level 1 Recommendation: <https://www.w3.org/TR/trace-context/>
|
|
342
|
+
- W3C Trace Context Level 2 Candidate Recommendation: <https://www.w3.org/TR/trace-context-2/>
|
|
343
|
+
- W3C Baggage Recommendation: <https://www.w3.org/TR/baggage/>
|
|
344
|
+
- OTel Baggage API specification: <https://opentelemetry.io/docs/specs/otel/baggage/api/>
|
|
345
|
+
- AWS X-Ray trace header: <https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader>
|
|
346
|
+
- GCP Cloud Trace context propagation: <https://cloud.google.com/trace/docs/trace-context>
|
|
347
|
+
- Datadog trace context propagation: <https://docs.datadoghq.com/tracing/trace_collection/trace_context_propagation/>
|
|
348
|
+
- Linkerd distributed tracing: <https://linkerd.io/2.15/features/distributed-tracing/>
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
---
|
|
2
|
+
otel_spec: "1.x (stable API/SDK)"
|
|
3
|
+
otel_semconv: "1.43.0 (2026-07)"
|
|
4
|
+
specs:
|
|
5
|
+
- "W3C Baggage: Recommendation 2022-12-22"
|
|
6
|
+
- "GDPR: Regulation (EU) 2016/679; KR PIPA: amended 2023"
|
|
7
|
+
notes:
|
|
8
|
+
- "OpenCost: CNCF Incubating (advanced 2024-10-31)"
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Multi-Tenant Observability
|
|
12
|
+
|
|
13
|
+
## 1. Scope
|
|
14
|
+
|
|
15
|
+
Multi-tenant observability covers the collection, routing, isolation, attribution, and residency of telemetry signals in a B2B SaaS platform where multiple customer tenants share underlying infrastructure.
|
|
16
|
+
|
|
17
|
+
**In scope:**
|
|
18
|
+
- Tenant isolation strategy across four tiers (soft / routing / dedicated-collector / dedicated-backend)
|
|
19
|
+
- Tenant attribute propagation via W3C Baggage
|
|
20
|
+
- Per-tenant sampling policies
|
|
21
|
+
- Per-tenant retention schedules
|
|
22
|
+
- Cost attribution per tenant (chargeback / showback)
|
|
23
|
+
- Data residency routing for GDPR (EU) and PIPA (KR) tenants
|
|
24
|
+
|
|
25
|
+
**Out of scope (related but distinct):**
|
|
26
|
+
- Cross-service propagation mechanics: see `cross-application.md` (propagators, baggage rules)
|
|
27
|
+
- FinOps unit economics and OpenCost metric surface; see `../signals/cost.md`
|
|
28
|
+
- PII redaction and anonymization rules per tenant; see `../signals/privacy.md`
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. OTel Attribute Conventions for Tenant
|
|
33
|
+
|
|
34
|
+
OpenTelemetry Semantic Conventions do not include a stable `tenant.*` group as of semconv 1.43.0. The attributes below are **custom application-defined** attributes. Follow the naming convention from `../standards.md §3` and prefix with the domain noun to avoid collisions with future OTel semconv additions.
|
|
35
|
+
|
|
36
|
+
| Attribute | Type | Example | Status |
|
|
37
|
+
|-----------|------|---------|--------|
|
|
38
|
+
| `tenant.id` | string | `"acme-corp"` | Custom (not OTel Stable); use consistently across all signals |
|
|
39
|
+
| `tenant.tier` | string enum | `"free"` / `"pro"` / `"enterprise"` | Custom; drives sampling and routing decisions |
|
|
40
|
+
| `tenant.region` | string | `"eu-west-1"` / `"ap-northeast-2"` | Custom; drives data residency routing |
|
|
41
|
+
|
|
42
|
+
**Naming rationale:** dot-separated namespace (`tenant.*`) matches OTel semconv style and avoids the underscore ambiguity common in Prometheus label names. Do not use `customer_id`, `org_id`, or `account_id` for the same concept; pick one canonical key and propagate it everywhere.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 3. Four-Tier Isolation Strategy
|
|
47
|
+
|
|
48
|
+
Most B2B SaaS organizations apply a mix of tiers: enterprise tenants get Tier 3 or 4, pro gets Tier 2, and free gets Tier 1. Select the highest tier required by the tenant's compliance obligations.
|
|
49
|
+
|
|
50
|
+
| Tier | Description | Relative Cost | Isolation Strength | Compliance Fit |
|
|
51
|
+
|------|-------------|---------------|--------------------|----------------|
|
|
52
|
+
| 1. Soft | Shared collector + shared backend; tenants are separated only by `tenant.id` label filtering in dashboards and queries | Low | Weak; no pipeline isolation; noisy-neighbor risk | Basic B2B without data separation requirements |
|
|
53
|
+
| 2. Routing | Shared collector pool; a verified routing connector or separate collector/exporter pipelines route by tenant tier; still shared backend | Medium | Medium; pipeline isolation; shared storage | Regulated tiers with data processing agreements |
|
|
54
|
+
| 3. Dedicated collector | Per-tenant collector instance in a dedicated Kubernetes namespace; isolates ingestion and processing; shared or per-region backend | High | Strong; ingestion isolated; namespace-level blast radius | Enterprise tenants, HIPAA, ISO 27001 requirements |
|
|
55
|
+
| 4. Dedicated backend | Per-tenant observability backend project or account (e.g., separate Grafana org, separate Datadog account, separate GCP project) | Highest | Strongest; full stack isolation from ingestion to storage | Highest compliance obligations (FedRAMP, SOC 2 Type II per tenant, GDPR Art. 28 sub-processor separation) |
|
|
56
|
+
|
|
57
|
+
**Routing vs sampling:** verify the routing connector stability/configuration for the pinned Collector version. `tail_sampling` `and` policies only decide keep/drop in a shared trace pipeline; they neither route signals nor provide pipeline isolation. If connector stability is unsuitable, use separately configured collector/exporter pipelines or dedicated collectors. Use per-tier sampling only when shared-pipeline retention rates satisfy the requirement.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 4. Tenant ID Propagation
|
|
62
|
+
|
|
63
|
+
Tenant context must be carried across service boundaries so every span, metric, and log record emitted by any service is attributable to its originating tenant.
|
|
64
|
+
|
|
65
|
+
**Mechanism:** W3C Baggage (`baggage` header, Recommendation 2022-12-22). Set `tenant.id` and `tenant.tier` as baggage entries at the ingress gateway. All downstream services read from the OTel Baggage API and apply these values as resource or span attributes.
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
Ingress Gateway
|
|
69
|
+
→ set baggage: tenant.id=acme-corp, tenant.tier=enterprise
|
|
70
|
+
↓
|
|
71
|
+
Service A (reads baggage → sets span attribute tenant.id)
|
|
72
|
+
↓
|
|
73
|
+
Service B (reads baggage → sets span attribute tenant.id)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Trust-boundary warning:** W3C Baggage is visible to every service in the propagation chain, including third-party or external services. The W3C Baggage specification (https://www.w3.org/TR/baggage/) explicitly notes that baggage values cross trust boundaries. Carrying `tenant.id` to external egress endpoints leaks customer account existence information.
|
|
77
|
+
|
|
78
|
+
Rule: strip or validate `tenant.*` baggage entries at the egress gateway before forwarding to any external third-party endpoint. Internal propagation only. Cross-ref `../signals/privacy.md §Common PII in Telemetry` for baggage PII rules.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 5. Per-Tenant Sampling
|
|
83
|
+
|
|
84
|
+
Different tenant tiers justify different sampling rates. Enterprise tenants have SLA obligations and full debugging requirements; free tenants justify only ambient visibility.
|
|
85
|
+
|
|
86
|
+
**Per-tier retention targets:**
|
|
87
|
+
|
|
88
|
+
| Tenant Tier | Trace Sampling Rate | Rationale |
|
|
89
|
+
|-------------|---------------------|-----------|
|
|
90
|
+
| `enterprise` | 100% | SLA obligations, full debugging capability, compliance audit trail |
|
|
91
|
+
| `pro` | 20% | Representative sample, cost-controlled |
|
|
92
|
+
| `free` | 2% | Ambient visibility only |
|
|
93
|
+
|
|
94
|
+
**Sampling configuration:** use the single tenant-aware YAML in
|
|
95
|
+
`../transport/sampling-recipes.md §4`. Option A branches pipelines with a verified
|
|
96
|
+
routing component; Option B changes keep/drop rates within a shared pipeline.
|
|
97
|
+
Neither a tier label nor a tail-sampling policy provides tenant storage/RBAC
|
|
98
|
+
isolation. Positive keep policies combine as OR, so the recipe's baseline also
|
|
99
|
+
evaluates traces from other tiers; it is not an ordered fallback.
|
|
100
|
+
|
|
101
|
+
Route by traceID to individual gateway samplers upstream of tail sampling
|
|
102
|
+
(`../transport/collector-topology.md §6`). Keep the tier consistent across each trace, derive it from server-side tenant
|
|
103
|
+
policy, and verify the observed retention rate and error/cost policies after
|
|
104
|
+
upgrades. The table above states example rate targets, not an authorization or
|
|
105
|
+
compliance requirement to collect every enterprise trace.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 6. Per-Tenant Retention
|
|
110
|
+
|
|
111
|
+
Retention schedules must be enforced per tier. Hot storage is fast-query; warm is compressed but queryable; cold is archival with retrieval latency.
|
|
112
|
+
|
|
113
|
+
| Tier | Hot | Warm | Cold |
|
|
114
|
+
|------|-----|------|------|
|
|
115
|
+
| Enterprise | 90 days | 1 year | 3 years |
|
|
116
|
+
| Pro | 30 days | 90 days | None |
|
|
117
|
+
| Free | 7 days | 30 days | None |
|
|
118
|
+
|
|
119
|
+
**Implementation:** Apply Kubernetes-native or backend-native lifecycle policies keyed on the `tenant.id` and `tenant.tier` labels. For shared backends (Tier 1–2), use label-based TTL rules or index lifecycle management (e.g., OpenSearch ISM policies, Loki retention rules, Thanos compactor retention). For dedicated backends (Tier 3–4), set backend project-level retention per tenant.
|
|
120
|
+
|
|
121
|
+
Cross-ref `../meta-observability.md §Retention Matrix` for the full retention policy table covering all seven signals.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 7. Cost Attribution
|
|
126
|
+
|
|
127
|
+
Tenant-level cost attribution enables chargeback (billing tenants for their resource consumption) and showback (internal reporting without billing).
|
|
128
|
+
|
|
129
|
+
**Kubernetes workload labeling:** maintain a verified mapping from workload labels to tenants. Aggregate cost through the OpenCost Allocation API using that mapping and an explicit window. The default `/metrics` endpoint does not automatically create `opencost_workload_cost_total` or a per-tenant cumulative cost counter; implement and document such a counter separately if needed. See `../signals/cost.md §5`.
|
|
130
|
+
|
|
131
|
+
```yaml
|
|
132
|
+
# Kubernetes Pod template label (applied via Helm values or admission webhook)
|
|
133
|
+
metadata:
|
|
134
|
+
labels:
|
|
135
|
+
tenant.id: "acme-corp"
|
|
136
|
+
tenant.tier: "enterprise"
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
**Telemetry cost attribution:** The observability bill itself (e.g., Datadog RUM sessions per tenant, Honeycomb events per tenant) must also be attributed. Instrument the collector pipeline with throughput counters per tenant to apportion the observability bill proportionally.
|
|
140
|
+
|
|
141
|
+
**Cardinality constraint:** `tenant.id` used as a metric label must be capped at the top-N active tenant count (100–1,000 tenants is safe for most TSDBs). Beyond this threshold, bucket overflow tenants under an `"other"` label to prevent metric series explosion. Cross-ref `../meta-observability.md §Cardinality Guardrails`.
|
|
142
|
+
|
|
143
|
+
Cross-ref `../signals/cost.md §4 Cost Attribution by Dimension` for FinOps unit economics (per-tenant PromQL formulas, OpenCost architecture, and FOCUS spec).
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 8. Data Residency
|
|
148
|
+
|
|
149
|
+
International-transfer requirements depend on the data, destination, and legal
|
|
150
|
+
basis. GDPR Chapter V permits mechanisms including adequacy decisions (Art.45),
|
|
151
|
+
appropriate safeguards (Art.46), and limited derogations (Art.49). Korean PIPA
|
|
152
|
+
Art.28-8 has its own permitted grounds and safeguards. Neither establishes a
|
|
153
|
+
blanket ban on every cross-region telemetry export. Separately enforce stricter
|
|
154
|
+
contractual residency requirements where they apply.
|
|
155
|
+
|
|
156
|
+
**Example adopted residency policy**, for tenants whose contracts require local
|
|
157
|
+
processing (not a universal statement of GDPR/PIPA):
|
|
158
|
+
|
|
159
|
+
| Tenant policy | Collector placement | Backend placement | Transfer decision |
|
|
160
|
+
|---|---|---|---|
|
|
161
|
+
| EU-local contract | Approved EU edge | Approved EU backend | Stay within the contract's residency boundary |
|
|
162
|
+
| KR-local contract | Approved KR edge | Approved KR backend | Stay within the contract's residency boundary |
|
|
163
|
+
| Transfer permitted | Approved source region | Approved destination | Document applicable transfer basis, safeguards, and contract scope |
|
|
164
|
+
|
|
165
|
+
Route by a server-verified tenant policy before export, including transient
|
|
166
|
+
processing locations and backups. When local residency is required, deploy
|
|
167
|
+
local collectors/backends; otherwise verify and document the permitted transfer
|
|
168
|
+
mechanism and destination rather than assuming that a region label authorizes it.
|
|
169
|
+
|
|
170
|
+
Sources: <https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32016R0679>
|
|
171
|
+
and <https://www.law.go.kr/LSW/lsLinkCommonInfo.do?chrClsCd=010202&lsJoLnkSeq=1029334957>.
|
|
172
|
+
|
|
173
|
+
**Source-of-truth rule (critical)**: `tenant.region` MUST be resolved from an internal, server-side authoritative source; tenant registry service, organization metadata table, or IdP claim stamped at session start. It MUST NOT be trusted from client-supplied input (HTTP header, baggage, query string, or JWT claim the client itself controls). A misconfigured or malicious tenant could otherwise self-declare a non-EU/KR region and bypass residency routing. Enforce at the ingress gateway: reject requests where a client-declared `tenant.region` disagrees with the registry lookup keyed on `tenant.id`. In practice, strip any inbound `tenant.region` attribute and re-attach the registry-sourced value before the Collector pipeline accepts the span/log.
|
|
174
|
+
|
|
175
|
+
Cross-ref `../transport/collector-topology.md §7 Federated / Multi-Cluster` for the multi-region edge topology diagram. Cross-ref `../signals/privacy.md §2 Regulatory Drivers` for GDPR and PIPA penalty context and `../signals/privacy.md §Cross-border transfer` for PII-specific cross-border rules.
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 9. Tenant Onboarding and Offboarding
|
|
180
|
+
|
|
181
|
+
**Onboarding checklist:**
|
|
182
|
+
1. Provision `tenant.id` and `tenant.tier` as Kubernetes labels on all tenant workloads (via Helm values or admission webhook).
|
|
183
|
+
2. Create per-tenant routing rule if Tier 2+.
|
|
184
|
+
3. Provision per-tenant collector namespace if Tier 3+.
|
|
185
|
+
4. Create per-tenant backend project or organization if Tier 4.
|
|
186
|
+
5. Create per-tenant dashboard folder with RBAC rules (see §10).
|
|
187
|
+
6. Register tenant in cardinality allowlist (top-N cap enforcement).
|
|
188
|
+
|
|
189
|
+
Automate steps 1–6 as code; cross-ref `../observability-as-code.md` for provisioning patterns.
|
|
190
|
+
|
|
191
|
+
**Offboarding and eligible erasure:**
|
|
192
|
+
|
|
193
|
+
Contract termination does not automatically require deletion of every audit,
|
|
194
|
+
cost, or telemetry record. Determine which records contain personal data and
|
|
195
|
+
which Art.17(1) erasure ground applies. Art.17(3) includes exceptions for legal
|
|
196
|
+
obligations and legal claims; purpose-limited lawful retention may continue.
|
|
197
|
+
Non-personal records and contractual retention require their own policy check.
|
|
198
|
+
|
|
199
|
+
Offboarding procedure:
|
|
200
|
+
1. Stop new tenant ingestion and inventory records across hot/warm/cold tiers,
|
|
201
|
+
backups, audit, and cost systems; classify personal data and applicable duties.
|
|
202
|
+
2. Delete eligible records through verified backend/backup procedures. Document
|
|
203
|
+
retained classes, legal basis, approved expiry, and access restrictions.
|
|
204
|
+
3. Remove active routing/dashboard access and the cardinality allowlist entry.
|
|
205
|
+
4. Deprovision collector/backend resources after required deletion and lawful
|
|
206
|
+
retention are handled; preserve necessary retained records under restricted access.
|
|
207
|
+
5. Emit a minimized audit event recording the action, scope, time, and operator.
|
|
208
|
+
|
|
209
|
+
Source: GDPR Art.17(1), Art.17(3)(b),(e),
|
|
210
|
+
<https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32016R0679>.
|
|
211
|
+
|
|
212
|
+
Cross-ref `../signals/audit.md` for audit event schema for offboarding erasure events.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 10. Dashboard Isolation
|
|
217
|
+
|
|
218
|
+
| Tier | Dashboard Isolation Mechanism |
|
|
219
|
+
|------|-------------------------------|
|
|
220
|
+
| Tier 1 | Grafana folder per tenant; dashboard variables filter by `tenant.id` label |
|
|
221
|
+
| Tier 2 | Grafana folder per tenant; Grafana RBAC restricts folder access by team |
|
|
222
|
+
| Tier 3 | Grafana organization per tenant; or Honeycomb environment per tenant |
|
|
223
|
+
| Tier 4 | Dedicated backend instance; tenant admin is org owner in their own account |
|
|
224
|
+
|
|
225
|
+
**RBAC rule:** a tenant admin identity claim must be mapped to a Grafana or backend role that scopes data access strictly to that tenant's `tenant.id`. Cross-org or cross-tenant data leakage via dashboard query is a compliance violation.
|
|
226
|
+
|
|
227
|
+
Cross-ref `../signals/privacy.md §Backend RBAC` for Grafana RBAC configuration patterns and OPA policy rules for query-level tenant isolation.
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## 11. Noisy Neighbor Protection
|
|
232
|
+
|
|
233
|
+
Shared infrastructure (Tier 1 and Tier 2) is vulnerable to one high-volume tenant degrading the observability pipeline for all other tenants.
|
|
234
|
+
|
|
235
|
+
**Controls:**
|
|
236
|
+
|
|
237
|
+
| Control | Scope | Mechanism |
|
|
238
|
+
|---------|-------|-----------|
|
|
239
|
+
| Per-tenant ingress rate limit | Collector receiver level | `ratelimiter` extension (alpha) or `filter` processor tied to per-tenant token-bucket state; pair with `memory_limiter` as backpressure |
|
|
240
|
+
| Per-tenant cardinality quota | Metrics pipeline | Top-N series cap per `tenant.id`; overflow bucketed as `"other"` |
|
|
241
|
+
| Circuit breaker on ingress | Collector pipeline | `memory_limiter` processor per-tenant pipeline; shed load when memory exceeds threshold |
|
|
242
|
+
| Per-tenant queue depth limit | Exporter queue | `sending_queue` max size per tenant pipeline (Tier 2 routing) |
|
|
243
|
+
|
|
244
|
+
Apply rate limits at the first collector tier (agent or edge). A tenant exceeding its quota must receive a well-defined error (e.g., OTLP `ResourceExhausted` gRPC status) rather than silently dropping data.
|
|
245
|
+
|
|
246
|
+
---
|
|
247
|
+
|
|
248
|
+
## 12. Matrix Cells: Multi-Tenant Row
|
|
249
|
+
|
|
250
|
+
Quick navigation for multi-tenant boundary cells in `../matrix.md`:
|
|
251
|
+
|
|
252
|
+
| Layer | Signal | Status | Artifact |
|
|
253
|
+
|-------|--------|--------|----------|
|
|
254
|
+
| L3-network | metrics | PASS | VPC flow logs per tenant; egress bytes attributed by source CIDR mapped to `tenant.id` |
|
|
255
|
+
| L7-application | traces | PASS | W3C Baggage carries `tenant.id`; all spans tagged at ingress |
|
|
256
|
+
| L7-application | cost | PASS | OpenCost workload attribution via `tenant.id` pod label; per-tenant PromQL aggregation |
|
|
257
|
+
| L7-application | privacy | PASS | Per-tenant PII redaction rules; per-tenant residency routing |
|
|
258
|
+
| L7-application | audit | PASS | Per-tenant audit trail; erasure events on offboarding |
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 13. Anti-Patterns
|
|
263
|
+
|
|
264
|
+
The following are candidates for `../anti-patterns.md §Multi-Tenant`:
|
|
265
|
+
|
|
266
|
+
| Anti-Pattern | Impact | Correction |
|
|
267
|
+
|-------------|--------|------------|
|
|
268
|
+
| `tenant.id` as metric label without top-N cap | Cardinality explosion in TSDB; ingestor OOM; query timeouts for all tenants | Enforce top-N cap (100–1,000); bucket overflow as `"other"`; cross-ref `../meta-observability.md §Cardinality Guardrails` |
|
|
269
|
+
| `tenant.id` in W3C Baggage crossing trust boundaries | Tenant account existence leaks to third-party services; GDPR personal data transfer without legal basis | Strip `tenant.*` baggage at egress gateway before forwarding to any external endpoint |
|
|
270
|
+
| Shared backend for regulated tiers (Tier 1 for compliance tenants) | Co-mingled data violates data processing agreements; one breach affects all tenants | Upgrade regulated tenants to Tier 3 or 4; apply isolation tier based on contractual obligation, not cost convenience |
|
|
271
|
+
| Cross-border export without checking data, transfer basis, safeguards, or contract | Unauthorized personal-data transfer or residency-contract breach | Verify applicable GDPR/PIPA transfer grounds and destination; enforce stricter local-residency contracts using server-side policy |
|
|
272
|
+
| No policy-based offboarding process | Eligible personal data persists or required evidence is erased prematurely | Inventory record classes; delete eligible data and retain legally required evidence under restricted access and approved expiry |
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## Cross-References
|
|
277
|
+
|
|
278
|
+
| Topic | File |
|
|
279
|
+
|-------|------|
|
|
280
|
+
| Baggage propagation mechanics and trust-boundary rules | `cross-application.md` |
|
|
281
|
+
| Full FinOps cost attribution and OpenCost metric surface | `../signals/cost.md` |
|
|
282
|
+
| PII redaction, anonymization, and GDPR/PIPA regulatory detail | `../signals/privacy.md` |
|
|
283
|
+
| Tenant-aware sampling recipes (routing_connector, tail_sampling) | `../transport/sampling-recipes.md §4` |
|
|
284
|
+
| Multi-cluster and regional collector topology | `../transport/collector-topology.md §7` |
|
|
285
|
+
| Retention matrix for all seven signals | `../meta-observability.md §Retention Matrix` |
|
|
286
|
+
| Cardinality guardrails and top-N cap | `../meta-observability.md §Cardinality Guardrails` |
|
|
287
|
+
| Dashboard RBAC and query-level tenant isolation | `../signals/privacy.md §Backend RBAC` |
|
|
288
|
+
| Audit event schema for offboarding erasure | `../signals/audit.md` |
|
|
289
|
+
| Observability-as-code provisioning for tenant onboarding | `../observability-as-code.md` |
|
|
290
|
+
| Full 112-cell coverage matrix | `../matrix.md` |
|