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,605 @@
|
|
|
1
|
+
---
|
|
2
|
+
otel_spec: "1.x (stable API/SDK)"
|
|
3
|
+
otel_semconv: "1.43.0 (2026-07)"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Meta-Observability
|
|
7
|
+
|
|
8
|
+
## Why Meta-Observability
|
|
9
|
+
|
|
10
|
+
"Observing the observer"; if the OTel Collector is silently dropping 10% of traces, every SLO
|
|
11
|
+
dashboard, every alerting rule, and every incident forensics query is built on incomplete data.
|
|
12
|
+
You will not know the pipeline is degraded unless you instrument the pipeline itself.
|
|
13
|
+
|
|
14
|
+
Other files in this skill assume a reliable telemetry pipeline. This file forces you to verify
|
|
15
|
+
that assumption. Four disciplines close the gap:
|
|
16
|
+
|
|
17
|
+
| Discipline | Risk if ignored | Section |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| Pipeline self-health | Silent data loss, metric gaps, memory crashes | A |
|
|
20
|
+
| Clock skew / NTP | Waterfall charts lie; phantom race conditions chased | B |
|
|
21
|
+
| Cardinality guardrails | TSDB storage explosion, query latency, vendor bill spikes | C |
|
|
22
|
+
| Retention matrix | Compliance violations, over-spend on raw data, data unavailable at audit | D |
|
|
23
|
+
|
|
24
|
+
Cross-cutting failure modes and recovery paths are in Section E. Alert/dashboard scaffolding
|
|
25
|
+
that feeds `resources/observability-as-code.md` is in Section F.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Section A: Pipeline Self-Health
|
|
30
|
+
|
|
31
|
+
### A1. OTel Collector Self-Metrics
|
|
32
|
+
|
|
33
|
+
The Collector exposes its own telemetry via a Prometheus scrape endpoint (default `:8888/metrics`).
|
|
34
|
+
Enable it explicitly:
|
|
35
|
+
|
|
36
|
+
```yaml
|
|
37
|
+
# otelcol-config.yaml — telemetry block
|
|
38
|
+
service:
|
|
39
|
+
telemetry:
|
|
40
|
+
metrics:
|
|
41
|
+
level: detailed # normal | detailed | none
|
|
42
|
+
address: 0.0.0.0:8888
|
|
43
|
+
logs:
|
|
44
|
+
level: info
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Scrape this endpoint from a separate Prometheus instance (or a second Collector) so that
|
|
48
|
+
Collector failures do not destroy their own observability.
|
|
49
|
+
|
|
50
|
+
### A2. Key otelcol_* Metrics
|
|
51
|
+
|
|
52
|
+
| Metric | What it measures | Alert threshold |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| `otelcol_receiver_accepted_spans` | Spans accepted from upstream | Baseline drop > 10% |
|
|
55
|
+
| `otelcol_receiver_refused_spans` | Spans refused (parse failure, queue full) | > 0 sustained for 2m |
|
|
56
|
+
| `otelcol_exporter_sent_spans` | Spans successfully shipped to backend | Baseline drop > 10% |
|
|
57
|
+
| `otelcol_exporter_send_failed_spans` | Export failures (network, auth, rate-limit) | > 1% of sent for 5m |
|
|
58
|
+
| `otelcol_processor_queued_retry_send_queue_length` | Backpressure queue depth | > 80% of queue capacity |
|
|
59
|
+
| `otelcol_process_runtime_heap_alloc_bytes` | Collector heap usage | > 75% of container limit |
|
|
60
|
+
| `otelcol_processor_memory_limiter_refused_spans` | Forced drops due to memory limit | > 0 |
|
|
61
|
+
| `otelcol_processor_memory_limiter_refused_metric_points` | Same, for metrics | > 0 |
|
|
62
|
+
| `otelcol_processor_memory_limiter_refused_log_records` | Same, for logs | > 0 |
|
|
63
|
+
|
|
64
|
+
The same `*_accepted_*`, `*_refused_*`, `*_sent_*`, and `*_send_failed_*` counter families exist
|
|
65
|
+
for metric points (`metric_points`) and log records (`log_records`). Apply identical thresholds.
|
|
66
|
+
|
|
67
|
+
### A3. Memory Limiter Processor (Required)
|
|
68
|
+
|
|
69
|
+
Add `memory_limiter` as the first processor in every pipeline to prevent OOM crashes:
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
processors:
|
|
73
|
+
memory_limiter:
|
|
74
|
+
check_interval: 1s
|
|
75
|
+
limit_percentage: 75 # hard limit: refuse new data above 75% heap
|
|
76
|
+
spike_limit_percentage: 20 # headroom for burst above limit_percentage
|
|
77
|
+
|
|
78
|
+
service:
|
|
79
|
+
pipelines:
|
|
80
|
+
traces:
|
|
81
|
+
receivers: [otlp]
|
|
82
|
+
processors: [memory_limiter, batch, ...]
|
|
83
|
+
exporters: [otlp]
|
|
84
|
+
metrics:
|
|
85
|
+
receivers: [otlp, prometheus]
|
|
86
|
+
processors: [memory_limiter, batch, ...]
|
|
87
|
+
exporters: [prometheusremotewrite]
|
|
88
|
+
logs:
|
|
89
|
+
receivers: [otlp, fluentforward]
|
|
90
|
+
processors: [memory_limiter, batch, ...]
|
|
91
|
+
exporters: [loki]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### A4. Self-Scrape Configuration
|
|
95
|
+
|
|
96
|
+
Scrape Collector self-metrics into the same metrics pipeline so they land in the same TSDB
|
|
97
|
+
alongside application metrics:
|
|
98
|
+
|
|
99
|
+
```yaml
|
|
100
|
+
receivers:
|
|
101
|
+
prometheus:
|
|
102
|
+
config:
|
|
103
|
+
scrape_configs:
|
|
104
|
+
- job_name: otelcol-self
|
|
105
|
+
scrape_interval: 15s
|
|
106
|
+
static_configs:
|
|
107
|
+
- targets: ["localhost:8888"]
|
|
108
|
+
metric_relabel_configs:
|
|
109
|
+
- source_labels: [__name__]
|
|
110
|
+
regex: otelcol_.*
|
|
111
|
+
action: keep
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### A5. Agent Self-Resource Consumption
|
|
115
|
+
|
|
116
|
+
| Agent | Typical RAM | Typical CPU | Source |
|
|
117
|
+
|---|---|---|---|
|
|
118
|
+
| Fluent Bit | 5–15 MB | < 1% (idle), < 5% (burst) | Fluent Bit 2.x benchmarks |
|
|
119
|
+
| OTel Collector (DaemonSet) | 30–100 MB | < 5% (moderate load) | VictoriaMetrics 2026 benchmark |
|
|
120
|
+
| OTel Collector (gateway) | 100–500 MB | scales with throughput | VictoriaMetrics 2026 benchmark |
|
|
121
|
+
|
|
122
|
+
Collect host-level CPU and memory for agent processes via `hostmetrics` receiver:
|
|
123
|
+
|
|
124
|
+
```yaml
|
|
125
|
+
receivers:
|
|
126
|
+
hostmetrics:
|
|
127
|
+
collection_interval: 30s
|
|
128
|
+
scrapers:
|
|
129
|
+
process:
|
|
130
|
+
include:
|
|
131
|
+
names: ["otelcol", "fluent-bit"]
|
|
132
|
+
match_type: regexp
|
|
133
|
+
mute_process_name_error: true
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Fluent Bit exposes its own Prometheus metrics at `:2020/api/v1/metrics/prometheus`:
|
|
137
|
+
|
|
138
|
+
- `fluentbit_input_records_total`: records ingested per input plugin
|
|
139
|
+
- `fluentbit_output_proc_records_total`: records successfully processed per output plugin
|
|
140
|
+
- `fluentbit_output_errors_total`: output failures
|
|
141
|
+
|
|
142
|
+
### A6. End-to-End Delivery Checks
|
|
143
|
+
|
|
144
|
+
Do not divide global exporter-sent spans by global receiver-accepted spans to
|
|
145
|
+
estimate delivery. Sampling and filters intentionally remove spans; fan-out and
|
|
146
|
+
multiple Collector hops can count a span several times. Queueing also shifts
|
|
147
|
+
the accounting windows. Diagnose each pipeline/hop separately using receiver
|
|
148
|
+
refusals, exporter failures, queue depth, and expected post-policy volume.
|
|
149
|
+
Collector counters alone do not establish backend ingestion.
|
|
150
|
+
|
|
151
|
+
Implement an end-to-end synthetic probe: send identifiable traces expected to
|
|
152
|
+
be retained under the configured policy, query the selected backend after its
|
|
153
|
+
ingestion deadline, and record each completed check once. The following is a
|
|
154
|
+
**team-implemented metric**, not a Collector default:
|
|
155
|
+
`telemetry_probe_completed_total{pipeline="...",result="delivered|missing"}`.
|
|
156
|
+
Keep pipeline labels bounded and initialize both result counters to zero for
|
|
157
|
+
each pipeline, so an all-missing population still has a delivered=0 series.
|
|
158
|
+
Count only completed checks in both numerator
|
|
159
|
+
and denominator so ingestion lag does not compare different populations.
|
|
160
|
+
|
|
161
|
+
```promql
|
|
162
|
+
sum by (pipeline) (rate(telemetry_probe_completed_total{result="delivered"}[5m]))
|
|
163
|
+
/
|
|
164
|
+
(sum by (pipeline) (rate(telemetry_probe_completed_total[5m])) > 0)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Set the probe deadline, volume, and threshold for the selected pipeline; 99%
|
|
168
|
+
below is an example target. Verify sampling expectations and query permissions
|
|
169
|
+
before enabling the alert. Missing probe runs need a separate job-health check.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Section B: Clock Skew & NTP Discipline
|
|
174
|
+
|
|
175
|
+
### B1. Why Trace Waterfalls Lie
|
|
176
|
+
|
|
177
|
+
Distributed traces use wall-clock timestamps from the node where each span is recorded.
|
|
178
|
+
If two nodes have diverging clocks, the waterfall view in any tracing backend will show:
|
|
179
|
+
|
|
180
|
+
- A child span appearing to start before its parent span started.
|
|
181
|
+
- Negative durations on synthetic computed spans.
|
|
182
|
+
|
|
183
|
+
These patterns warrant investigation, not an automatic clock-drift verdict.
|
|
184
|
+
An asynchronous child can legitimately outlive its parent; ending the parent
|
|
185
|
+
does not end its children. Compare measured host offsets and operation semantics
|
|
186
|
+
before attributing suspicious cross-host ordering to clocks.
|
|
187
|
+
|
|
188
|
+
Typical NTP accuracy on well-connected cloud VMs: < 50 ms. On baremetal with good NTP: < 10 ms.
|
|
189
|
+
PTP (IEEE 1588) achieves sub-millisecond accuracy for financial and telco workloads.
|
|
190
|
+
|
|
191
|
+
Reference: `resources/standards.md §Clock Discipline` for the span timestamp validation rule.
|
|
192
|
+
|
|
193
|
+
### B2. NTP Requirements
|
|
194
|
+
|
|
195
|
+
All host VMs, container hosts, and Kubernetes nodes MUST run a time synchronization daemon:
|
|
196
|
+
|
|
197
|
+
- **Linux (systemd)**: `systemd-timesyncd` (lightweight) or `chrony` (recommended for accuracy)
|
|
198
|
+
- **Kubernetes**: Node time sync is the Linux host's responsibility. The kubelet and containers
|
|
199
|
+
inherit the host clock. The path is: hypervisor NTP → node OS → container runtime → container.
|
|
200
|
+
Confirm this chain with your cloud provider's documentation.
|
|
201
|
+
|
|
202
|
+
Cloud-provider time sources:
|
|
203
|
+
|
|
204
|
+
| Cloud | NTP endpoint | Notes |
|
|
205
|
+
|---|---|---|
|
|
206
|
+
| AWS | `169.254.169.123` (Amazon Time Sync Service) | PTP-backed, link-local; add to `chrony.conf`; verify with `chronyc sources -v` |
|
|
207
|
+
| GCP | `metadata.google.internal` | Internal hypervisor sync. `timedatectl show` only shows daemon state; use `chronyc sources -v` for actual offset |
|
|
208
|
+
| Azure | Hyper-V IC timesync primary; `time.windows.com` external NTP is fallback only | Azure Linux VMs with IC tools use host time. External NTP as a parallel peer can conflict; configure as fallback. Docs: <https://learn.microsoft.com/azure/virtual-machines/linux/time-sync> |
|
|
209
|
+
|
|
210
|
+
For sub-millisecond requirements (financial trading, high-frequency event processing):
|
|
211
|
+
use **PTP (IEEE 1588)** with hardware timestamping. Cloud support varies; AWS supports PTP on
|
|
212
|
+
Nitro instances via the Amazon Time Sync Service; verify availability before committing.
|
|
213
|
+
|
|
214
|
+
### B3. Span Timestamp Diagnostics
|
|
215
|
+
|
|
216
|
+
Validate each span's own start/end ordering and compare suspicious cross-host
|
|
217
|
+
timestamps with measured NTP/PTP offsets. The Trace API does not require child
|
|
218
|
+
intervals to be contained in parent intervals. Do not emit a clock violation
|
|
219
|
+
merely because a child ends later, and do not use nonexistent OTTL parent-time
|
|
220
|
+
fields as an executable Collector rule. Backend diagnostics need the operation's
|
|
221
|
+
actual synchronous/asynchronous semantics to classify timestamp evidence.
|
|
222
|
+
|
|
223
|
+
Source: <https://opentelemetry.io/docs/specs/otel/trace/api/>.
|
|
224
|
+
|
|
225
|
+
### B4. chrony Offset Metric
|
|
226
|
+
|
|
227
|
+
Emit `node.clock.drift_ms` from each host using a cron job or node exporter textfile collector:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
#!/bin/sh
|
|
231
|
+
# /etc/cron.d/chrony-offset — runs every minute
|
|
232
|
+
OFFSET=$(chronyc tracking | awk '/System time/ {gsub(/[^0-9.-]/, "", $4); print $4 * 1000}')
|
|
233
|
+
echo "node_clock_drift_ms $OFFSET" > /var/lib/node_exporter/textfile/chrony_offset.prom
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Alert rule (see Section F, Alert 3):
|
|
237
|
+
|
|
238
|
+
```promql
|
|
239
|
+
node_clock_drift_ms > 100
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Section C: Cardinality Guardrails
|
|
245
|
+
|
|
246
|
+
### C1. Why Cardinality Matters
|
|
247
|
+
|
|
248
|
+
Every unique label combination in a TSDB (Prometheus, VictoriaMetrics, Thanos, Mimir) creates a
|
|
249
|
+
separate time series. A metric with 3 labels each having 100 values creates 1,000,000 series.
|
|
250
|
+
|
|
251
|
+
Consequences of label explosion:
|
|
252
|
+
- TSDB storage grows quadratically with cardinality.
|
|
253
|
+
- Query latency increases: each query fans out across more series.
|
|
254
|
+
- Vendor bill spikes: SaaS TSDBs charge per active series.
|
|
255
|
+
- Ingestion falls behind; scrape intervals are missed.
|
|
256
|
+
|
|
257
|
+
### C2. Hard Rules
|
|
258
|
+
|
|
259
|
+
| Label | Rule | Reason |
|
|
260
|
+
|---|---|---|
|
|
261
|
+
| `user.id` | **NEVER** as metric label | Unbounded; one series per user |
|
|
262
|
+
| `request.id` | **NEVER** as metric label | One series per request; instant explosion |
|
|
263
|
+
| `trace.id` | **NEVER** as metric label | One series per trace |
|
|
264
|
+
| `user.email` | **NEVER** as metric label | PII + cardinality double violation |
|
|
265
|
+
| `tenant.id` | Cap at top-N (e.g., top-1000); overflow → label value `"other"` | Bounded set of known tenants |
|
|
266
|
+
| `endpoint` / `route` | Normalize high-cardinality routes: `/users/42` → `/users/_` | URL parameters are unbounded |
|
|
267
|
+
| `url.full` | **NEVER** raw; use `http.route` (normalized) | Query strings are unbounded |
|
|
268
|
+
| `error.message` | **NEVER** as label; use error type/code only | Free-text strings are unbounded |
|
|
269
|
+
|
|
270
|
+
Implement route normalization in the Collector `transform` processor:
|
|
271
|
+
|
|
272
|
+
```yaml
|
|
273
|
+
processors:
|
|
274
|
+
transform/normalize_routes:
|
|
275
|
+
error_mode: ignore
|
|
276
|
+
metric_statements:
|
|
277
|
+
- context: datapoint
|
|
278
|
+
statements:
|
|
279
|
+
- replace_pattern(attributes["http.route"], "/[0-9]+", "/_")
|
|
280
|
+
- replace_pattern(attributes["http.route"], "/[0-9a-f-]{36}", "/_") # UUID
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### C3. Cardinality Measurement
|
|
284
|
+
|
|
285
|
+
Measure active series per metric name in Prometheus-compatible TSDBs:
|
|
286
|
+
|
|
287
|
+
```promql
|
|
288
|
+
# Count distinct series for a specific metric
|
|
289
|
+
count(http_request_duration_seconds_bucket) by (job)
|
|
290
|
+
|
|
291
|
+
# Top 10 highest-cardinality metrics in the entire TSDB
|
|
292
|
+
topk(10, count({__name__!=""}) by (__name__))
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
VictoriaMetrics exposes `/api/v1/status/tsdb` for cardinality breakdown by metric name
|
|
296
|
+
and label value; use this for bulk auditing.
|
|
297
|
+
|
|
298
|
+
OTel metric SDK cardinality limit (Development feature as of SDK 1.x):
|
|
299
|
+
|
|
300
|
+
```python
|
|
301
|
+
# Python SDK example
|
|
302
|
+
from opentelemetry.sdk.metrics import MeterProvider
|
|
303
|
+
from opentelemetry.sdk.metrics.view import View
|
|
304
|
+
|
|
305
|
+
view = View(
|
|
306
|
+
instrument_name="http_request_duration",
|
|
307
|
+
attribute_keys={"http.request.method", "http.response.status_code", "http.route"}, # explicit allow-list
|
|
308
|
+
)
|
|
309
|
+
provider = MeterProvider(views=[view])
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Explicitly allow-listing attributes is the most effective cardinality control.
|
|
313
|
+
|
|
314
|
+
### C4. Series Budget
|
|
315
|
+
|
|
316
|
+
Set a per-service series budget. The 5,000-series figure below is an illustrative starting baseline; high-throughput services legitimately operate at 20k-100k series. Calibrate to your service's traffic shape and TSDB ingestion cost.
|
|
317
|
+
|
|
318
|
+
```promql
|
|
319
|
+
# Alert: service approaching cardinality budget (example baseline: 5000 series/service)
|
|
320
|
+
count({job="my-service"}) > 4000
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
Cardinality explosion is an anti-pattern. See `resources/anti-patterns.md §Section B` for
|
|
324
|
+
the full cardinality anti-pattern list.
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## Section D: Retention Matrix
|
|
329
|
+
|
|
330
|
+
Retention policy governs how long raw and aggregated data is kept, at what resolution,
|
|
331
|
+
and under what storage class. Failing to set explicit retention leads to either:
|
|
332
|
+
- Over-spend: keeping full-resolution data for years.
|
|
333
|
+
- Compliance violation: flushing audit logs before mandatory retention periods expire.
|
|
334
|
+
|
|
335
|
+
### D1. Unified Per-Signal Retention Policy
|
|
336
|
+
|
|
337
|
+
| Signal | Raw resolution | Aggregated / downsampled | Archive |
|
|
338
|
+
|---|---|---|---|
|
|
339
|
+
| Metrics | 15d full-res | 90d @ 5m resolution | 2y @ 1h resolution |
|
|
340
|
+
| Logs (operational) | 7d | 30d | 90d |
|
|
341
|
+
| Logs (audit) | Per-class approved schedule | Per-class approved schedule | Tamper protection; WORM if required |
|
|
342
|
+
| Traces (sampled, tail-based) | 30d | N/A | N/A |
|
|
343
|
+
| Traces (full 100% sample) | 3d | N/A | N/A |
|
|
344
|
+
| Profiles | 14d | N/A | N/A |
|
|
345
|
+
| Events | 30d | 90d | N/A |
|
|
346
|
+
|
|
347
|
+
### D2. Rationale by Signal
|
|
348
|
+
|
|
349
|
+
**Metrics (15d / 90d / 2y)**: Full-resolution metrics are needed for hourly/daily incident
|
|
350
|
+
investigation (15d covers most post-incident reviews). Downsampled 5m aggregates cover quarterly
|
|
351
|
+
business reviews and SLO trend reporting (90d). 1h aggregates for 2y support year-over-year
|
|
352
|
+
capacity planning without raw-data storage cost.
|
|
353
|
+
|
|
354
|
+
**Logs (operational, 7d / 30d / 90d)**: Operational logs (app errors, access logs) are used
|
|
355
|
+
within days of generation. 30d aggregated (e.g., error-count rollups) covers sprint-level
|
|
356
|
+
incident retrospectives. 90d archive is a common compliance floor for operational data.
|
|
357
|
+
|
|
358
|
+
**Logs (audit)**: document the applicable obligation and purpose for each
|
|
359
|
+
record class, then select retention and tamper-protection controls. There is no
|
|
360
|
+
universal seven-year WORM minimum across SOC 2, ISO 27001, PCI DSS, and HIPAA.
|
|
361
|
+
HIPAA's six-year requirement covers required security documentation, not every
|
|
362
|
+
raw audit event. Personal audit data still requires a lawful purpose and
|
|
363
|
+
eligible erasure, subject to GDPR Article 17(3) exceptions such as a legal
|
|
364
|
+
obligation or legal claims. A longer lock is not automatically safer.
|
|
365
|
+
Cross-ref: `signals/audit.md` for evidence-specific retention and integrity.
|
|
366
|
+
|
|
367
|
+
**Traces (sampled, 30d)**: Sampled traces (tail-based, typically 1-10% of production traffic)
|
|
368
|
+
are the primary debugging artifact. 30d covers cross-sprint incident investigations. No
|
|
369
|
+
aggregation applies; traces are point-in-time artifacts, not time-series.
|
|
370
|
+
|
|
371
|
+
**Traces (full 100% sample, 3d)**: 100% sampling is expensive. Keep for 3 days only; long
|
|
372
|
+
enough to cover a release rollout + initial stability period. Use head-based or tail-based
|
|
373
|
+
sampling to reduce to 1-10% thereafter.
|
|
374
|
+
|
|
375
|
+
**Profiles (14d)**: Continuous profiling data (Parca, Pyroscope) is used for performance
|
|
376
|
+
regression detection immediately after a deploy and for on-call debugging. 14d covers
|
|
377
|
+
two sprint cycles. No aggregation standard exists for profiling data yet.
|
|
378
|
+
|
|
379
|
+
**Events (30d / 90d)**: Structured events (deployment markers, feature flag changes, SLO
|
|
380
|
+
breaches) are retained for 30d raw (covers post-release review). Aggregated event counts
|
|
381
|
+
(deploys per day, flag toggles per week) are retained for 90d to support quarterly reviews.
|
|
382
|
+
|
|
383
|
+
### D3. Storage Class Configuration Example (Loki)
|
|
384
|
+
|
|
385
|
+
```yaml
|
|
386
|
+
# loki-config.yaml — example retention per stream selector
|
|
387
|
+
# NOTE: table_manager was removed in Loki 3.x. For Loki 3+, configure retention
|
|
388
|
+
# via compactor only. The block below applies to Loki 2.8-2.9 legacy.
|
|
389
|
+
|
|
390
|
+
# Legacy (Loki 2.x): table_manager
|
|
391
|
+
table_manager:
|
|
392
|
+
retention_deletes_enabled: true
|
|
393
|
+
retention_period: 720h # default 30d
|
|
394
|
+
|
|
395
|
+
# Per-stream retention via compactor (Loki 2.8+ and required on Loki 3.x)
|
|
396
|
+
compactor:
|
|
397
|
+
retention_enabled: true
|
|
398
|
+
retention_delete_delay: 2h
|
|
399
|
+
|
|
400
|
+
# Stream-level policy in ruler or via label matchers:
|
|
401
|
+
# {log_type="audit"} → approved per-class period, with hold/erasure rules
|
|
402
|
+
# {log_type="operational"} → 2160h (90d)
|
|
403
|
+
# {log_type="debug"} → 168h (7d)
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
Cross-ref: `signals/audit.md` for WORM immutable storage configuration (S3 Object Lock,
|
|
407
|
+
GCS Object Hold, Azure Immutable Blob Storage). Cross-ref: `signals/privacy.md` for
|
|
408
|
+
GDPR Article 5(1)(e) storage limitation (data not kept longer than necessary for the purpose).
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## Section E: Pipeline Failure Modes
|
|
413
|
+
|
|
414
|
+
| Failure mode | Symptom | Remediation |
|
|
415
|
+
|---|---|---|
|
|
416
|
+
| Upstream receiver overflow | `otelcol_receiver_refused_*` rising; `send_queue_length` climbing | Add `memory_limiter` processor; scale gateway Collector replicas horizontally |
|
|
417
|
+
| Exporter backpressure | `otelcol_processor_queued_retry_send_queue_length` rising; `send_failed_*` incrementing | Check vendor rate limits; tune exporter `retry_on_failure` with exponential backoff; reduce batch size |
|
|
418
|
+
| Clock drift spike | Waterfall inversion; `node_clock_drift_ms > 100` alert fires | Run `chronyc makestep` to force immediate re-sync; for persistent drift, check NTP source reachability; escalate to PTP for sub-ms requirements |
|
|
419
|
+
| Cardinality bomb | TSDB ingestion lag; query timeouts; vendor bill alert | Identify offending metric with `topk(10, count({__name__!=""}) by (__name__))`, add `filter` processor to drop or `transform` to remove offending label |
|
|
420
|
+
| Memory OOM crash | Collector process exits; gap in all signals | `memory_limiter` prevents this if configured; if reached anyway, increase container memory limit or reduce `limit_percentage` |
|
|
421
|
+
| Audit log retention violation | Audit records purged before WORM period | Verify S3/GCS Object Lock policy; confirm `retention_period` in log backend matches 7y; cross-ref `signals/audit.md §WORM` |
|
|
422
|
+
|
|
423
|
+
### E1. Exporter Retry Configuration
|
|
424
|
+
|
|
425
|
+
```yaml
|
|
426
|
+
exporters:
|
|
427
|
+
otlp:
|
|
428
|
+
endpoint: backend:4317
|
|
429
|
+
retry_on_failure:
|
|
430
|
+
enabled: true
|
|
431
|
+
initial_interval: 5s
|
|
432
|
+
max_interval: 30s
|
|
433
|
+
max_elapsed_time: 300s # give up after 5 minutes; prevents infinite queue growth
|
|
434
|
+
sending_queue:
|
|
435
|
+
enabled: true
|
|
436
|
+
num_consumers: 10
|
|
437
|
+
queue_size: 1000
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
### E2. Filter Processor for Cardinality Drop
|
|
441
|
+
|
|
442
|
+
```yaml
|
|
443
|
+
processors:
|
|
444
|
+
filter/drop_high_cardinality:
|
|
445
|
+
error_mode: ignore
|
|
446
|
+
metrics:
|
|
447
|
+
datapoint:
|
|
448
|
+
- 'attributes["user.id"] != nil' # drop any datapoint carrying user.id
|
|
449
|
+
- 'attributes["request.id"] != nil' # drop request.id label
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
Cross-ref: `resources/checklist.md §7 Recovery` for the full recovery procedure checklist.
|
|
453
|
+
Cross-ref: `resources/anti-patterns.md §Section C Pipeline` for pipeline anti-patterns.
|
|
454
|
+
|
|
455
|
+
---
|
|
456
|
+
|
|
457
|
+
## Section F: Alerts & Dashboards
|
|
458
|
+
|
|
459
|
+
### F1. Five Golden Meta-Observability Alerts
|
|
460
|
+
|
|
461
|
+
These five alerts MUST be in place before any other observability alerting is considered
|
|
462
|
+
reliable. Without them, you cannot trust your alerts.
|
|
463
|
+
|
|
464
|
+
**Alert 1; Synthetic pipeline delivery below the selected target**
|
|
465
|
+
|
|
466
|
+
Requires the team-implemented completed-probe metric defined in A6; this is not
|
|
467
|
+
a ratio of default Collector receiver/exporter counters.
|
|
468
|
+
|
|
469
|
+
```yaml
|
|
470
|
+
# Alert rule entry within a PrometheusRule.spec.groups[].rules[] list
|
|
471
|
+
- alert: TelemetryProbeDeliveryBelowTarget
|
|
472
|
+
expr: |
|
|
473
|
+
(
|
|
474
|
+
sum by (pipeline) (rate(telemetry_probe_completed_total{result="delivered"}[5m]))
|
|
475
|
+
/
|
|
476
|
+
(sum by (pipeline) (rate(telemetry_probe_completed_total[5m])) > 0)
|
|
477
|
+
) < 0.99
|
|
478
|
+
for: 5m
|
|
479
|
+
labels:
|
|
480
|
+
severity: critical
|
|
481
|
+
annotations:
|
|
482
|
+
summary: "Synthetic telemetry delivery below the selected 99% target"
|
|
483
|
+
description: "Inspect completed probes, configured sampling, backend ingestion, exporter errors, and queues."
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
**Alert 2; Exporter send failures above 1%**
|
|
487
|
+
|
|
488
|
+
```promql
|
|
489
|
+
# Ratio of failed exports to sent (any signal)
|
|
490
|
+
(
|
|
491
|
+
sum(rate(otelcol_exporter_send_failed_spans[5m]))
|
|
492
|
+
/
|
|
493
|
+
(sum(rate(otelcol_exporter_sent_spans[5m])) > 0)
|
|
494
|
+
) > 0.01
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
```yaml
|
|
498
|
+
- alert: OtelcolExporterSendFailed
|
|
499
|
+
expr: |
|
|
500
|
+
(
|
|
501
|
+
sum(rate(otelcol_exporter_send_failed_spans[5m]))
|
|
502
|
+
/
|
|
503
|
+
(sum(rate(otelcol_exporter_sent_spans[5m])) > 0)
|
|
504
|
+
) > 0.01
|
|
505
|
+
for: 5m
|
|
506
|
+
labels:
|
|
507
|
+
severity: warning
|
|
508
|
+
annotations:
|
|
509
|
+
summary: "OTel Collector exporter failures above 1%"
|
|
510
|
+
description: "Check vendor rate limits, network connectivity, and exporter authentication."
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
**Alert 3; Node clock drift above 100 ms**
|
|
514
|
+
|
|
515
|
+
```yaml
|
|
516
|
+
- alert: NodeClockDriftHigh
|
|
517
|
+
expr: node_clock_drift_ms > 100
|
|
518
|
+
for: 5m
|
|
519
|
+
labels:
|
|
520
|
+
severity: warning
|
|
521
|
+
annotations:
|
|
522
|
+
summary: "Node clock drift exceeds 100ms on {{ $labels.instance }}"
|
|
523
|
+
description: "Trace waterfall ordering may be unreliable. Run chronyc makestep or check NTP source."
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
**Alert 4; Service approaching cardinality budget**
|
|
527
|
+
|
|
528
|
+
```yaml
|
|
529
|
+
- alert: MetricCardinalityBudgetExceeded
|
|
530
|
+
expr: count({job=~".+"}) by (job) > 4000
|
|
531
|
+
for: 10m
|
|
532
|
+
labels:
|
|
533
|
+
severity: warning
|
|
534
|
+
annotations:
|
|
535
|
+
summary: "{{ $labels.job }} exceeds 80% of 5000-series cardinality budget"
|
|
536
|
+
description: "Identify high-cardinality labels with topk(10, count({job='{{ $labels.job }}'}) by (__name__)). Apply attribute filter."
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
**Alert 5; Audit log retention policy violation**
|
|
540
|
+
|
|
541
|
+
This alert cannot be expressed in PromQL alone; implement it as a scheduled policy check in
|
|
542
|
+
your compliance tooling. The metric below must be implemented by that job;
|
|
543
|
+
it is not automatically emitted by a storage backend or Collector. Check
|
|
544
|
+
both premature expiry and unjustified over-retention against the approved
|
|
545
|
+
record-class policy, and monitor job freshness separately:
|
|
546
|
+
|
|
547
|
+
```yaml
|
|
548
|
+
- alert: AuditLogRetentionViolation
|
|
549
|
+
expr: audit_log_retention_compliant{log_type="audit"} == 0 # custom policy-check job: 1=compliant, 0=violation
|
|
550
|
+
for: 1h
|
|
551
|
+
labels:
|
|
552
|
+
severity: critical
|
|
553
|
+
annotations:
|
|
554
|
+
summary: "Audit retention violates the approved record-class policy"
|
|
555
|
+
description: "Check the applicable schedule, lock/lifecycle controls, eligible erasure, and legal holds. Cross-ref signals/audit.md."
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### F2. Grafana Dashboard Blueprint
|
|
559
|
+
|
|
560
|
+
A meta-observability Grafana dashboard MUST include the following panels:
|
|
561
|
+
|
|
562
|
+
| Panel | Query summary | Visualization |
|
|
563
|
+
|---|---|---|
|
|
564
|
+
| Pipeline delivery ratio (traces) | `sent / accepted` rate | Stat (green > 99%, red < 99%) |
|
|
565
|
+
| Pipeline delivery ratio (metrics) | same for metric_points | Stat |
|
|
566
|
+
| Pipeline delivery ratio (logs) | same for log_records | Stat |
|
|
567
|
+
| Receiver accepted vs refused | `rate(accepted)` and `rate(refused)` | Time series |
|
|
568
|
+
| Exporter sent vs failed | `rate(sent)` and `rate(failed)` | Time series |
|
|
569
|
+
| Queue depth | `send_queue_length` per exporter | Gauge |
|
|
570
|
+
| Collector heap usage | `heap_alloc_bytes` vs limit | Gauge |
|
|
571
|
+
| Node clock drift (all hosts) | `node_clock_drift_ms` | Heatmap by instance |
|
|
572
|
+
| Top cardinality metrics | `topk(10, count(...) by (__name__))` | Table (auto-refresh 5m) |
|
|
573
|
+
| Fluent Bit input vs output records | `fluentbit_input_records_total` vs `fluentbit_output_proc_records_total` | Time series |
|
|
574
|
+
|
|
575
|
+
The full Jsonnet/YAML implementation of this dashboard belongs in `resources/observability-as-code.md`
|
|
576
|
+
(Grafana-as-code section). This section provides the blueprint; that file provides the code.
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
## Cross-References
|
|
581
|
+
|
|
582
|
+
| Topic | File |
|
|
583
|
+
|---|---|
|
|
584
|
+
| Clock discipline normative requirements | `resources/standards.md §Clock Discipline` |
|
|
585
|
+
| WORM immutable storage for audit logs | `signals/audit.md` |
|
|
586
|
+
| GDPR storage limitation (Art. 5(1)(e)) | `signals/privacy.md` |
|
|
587
|
+
| Cardinality anti-patterns (Section B) | `resources/anti-patterns.md` |
|
|
588
|
+
| Pipeline anti-patterns (Section C) | `resources/anti-patterns.md` |
|
|
589
|
+
| Recovery checklist (§7) | `resources/checklist.md` |
|
|
590
|
+
| Dashboard/alert as code | `resources/observability-as-code.md` |
|
|
591
|
+
| Two-tier Collector topology | `transport/collector-topology.md` |
|
|
592
|
+
| Tail-based sampling configuration | `transport/sampling-recipes.md` |
|
|
593
|
+
| SLO burn-rate alerts | `boundaries/slo.md` |
|
|
594
|
+
| Incident forensics (6-dimension localization) | `resources/incident-forensics.md` |
|
|
595
|
+
|
|
596
|
+
---
|
|
597
|
+
|
|
598
|
+
## Review and Maintenance
|
|
599
|
+
|
|
600
|
+
- **Review triggers**: same as `resources/standards.md` (no scheduled cadence; see `SKILL.md` §Versioning & Deprecation).
|
|
601
|
+
- On OTel Collector minor version bump: verify `otelcol_*` metric names have not changed.
|
|
602
|
+
Metric names are stable within a major version but have changed between 0.x and 1.x.
|
|
603
|
+
- On cloud provider NTP endpoint changes: update Section B2 table.
|
|
604
|
+
- On TSDB migration (e.g., Prometheus → VictoriaMetrics): verify cardinality query syntax
|
|
605
|
+
in Section C3; VictoriaMetrics uses `/api/v1/status/tsdb` instead of PromQL cardinality queries.
|