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,299 @@
|
|
|
1
|
+
---
|
|
2
|
+
otel_semconv: "1.43.0 (2026-07)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# L4 Transport Layer Observability
|
|
6
|
+
|
|
7
|
+
> **DISAMBIGUATION; read before proceeding.**
|
|
8
|
+
>
|
|
9
|
+
> This file covers **observing the OSI Layer 4 (TCP/UDP/QUIC) transport in your application systems**;
|
|
10
|
+
> retransmits, RTT, connection lifecycle, eBPF-based socket instrumentation, and QUIC/HTTP3 semantics.
|
|
11
|
+
>
|
|
12
|
+
> This file is **NOT** about the observability pipeline transport:
|
|
13
|
+
> - `../transport/udp-statsd-mtu.md`; StatsD payload sizing over UDP
|
|
14
|
+
> - `../transport/otlp-grpc-vs-http.md`; OTLP exporter protocol choice
|
|
15
|
+
> - `../transport/collector-topology.md`; OTel Collector deployment topologies
|
|
16
|
+
> - `../transport/sampling-recipes.md`; tail/head sampling strategies
|
|
17
|
+
>
|
|
18
|
+
> The word "transport" is overloaded. When a cross-reference says `transport/`, it refers to the
|
|
19
|
+
> observability pipeline. When it says "L4", "TCP/UDP/QUIC", or this filename, it refers to this file.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 1. Scope
|
|
24
|
+
|
|
25
|
+
OSI Layer 4 observability for production systems: TCP, UDP, QUIC/HTTP3, eBPF auto-instrumentation,
|
|
26
|
+
and connection lifecycle. Out of scope: L5 session (gRPC/WebSocket → L7), L6 full TLS inspection
|
|
27
|
+
(use Wireshark/vendor tooling), security-focused eBPF (Cilium Tetragon/Falco → security skill).
|
|
28
|
+
See `../standards.md §5` for the authoritative OSI boundary decision.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. L4 Semconv (OTel)
|
|
33
|
+
|
|
34
|
+
Source: <https://opentelemetry.io/docs/specs/semconv/attributes-registry/network/>
|
|
35
|
+
|
|
36
|
+
| Attribute | Values | Stability | Notes |
|
|
37
|
+
|-----------|--------|-----------|-------|
|
|
38
|
+
| `network.transport` | `tcp`, `udp`, `unix`, `pipe`, `quic` | **Stable** | Set on spans and metrics describing a socket |
|
|
39
|
+
| `network.protocol.name` | `http`, `grpc`, `amqp`, … | **Stable** | Application protocol over the transport |
|
|
40
|
+
| `network.protocol.version` | `1.1`, `2`, `3` | **Stable** | `3` = HTTP/3 over QUIC |
|
|
41
|
+
| `network.peer.address` | IP or hostname | **Stable** | Apply IP-masking before retention; `../signals/privacy.md §IP addresses` |
|
|
42
|
+
| `network.connection.state` | `established`, `close_wait`, … | **Development** | Do not build SLOs against this; schema may change |
|
|
43
|
+
| `network.connection.type` | `wifi`, `cell`, … | **Development** | Mobile/RUM only; flag in production use |
|
|
44
|
+
|
|
45
|
+
`network.connection.*` attributes are Development tier (`../standards.md §3`). Use them in test
|
|
46
|
+
environments and tolerate breaking changes before promoting to production dashboards.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 3. TCP Observability
|
|
51
|
+
|
|
52
|
+
### 3.1 Key Metrics
|
|
53
|
+
|
|
54
|
+
| Metric | Type | Measures | Source |
|
|
55
|
+
|--------|------|----------|--------|
|
|
56
|
+
| `tcp_retransmits_total` | Counter | Retransmit segments; rate spike = congestion or loss | hostmetrics, eBPF |
|
|
57
|
+
| `tcp_rtt_ms` (p50/p99) | Histogram | Round-trip time per connection | eBPF socket stats |
|
|
58
|
+
| `tcp_active_connections` | Gauge | In-flight established connections; growth = pool leak | `/proc/net/sockstat` |
|
|
59
|
+
| `tcp_time_wait_connections` | Gauge | TIME_WAIT count; high under short-lived connection churn | `/proc/net/sockstat` |
|
|
60
|
+
| `tcp_syn_queue_drops_total` | Counter | SYN queue overflow; SYN flood or low `tcp_max_syn_backlog` | netlink / eBPF |
|
|
61
|
+
| `tcp_close_wait_connections` | Gauge | CLOSE_WAIT growth = server not closing half-open connections | hostmetrics |
|
|
62
|
+
|
|
63
|
+
```promql
|
|
64
|
+
# Retransmit rate per node
|
|
65
|
+
rate(tcp_retransmits_total[5m])
|
|
66
|
+
|
|
67
|
+
# p99 RTT per service
|
|
68
|
+
histogram_quantile(0.99, sum by (le, service_name) (rate(tcp_rtt_ms_bucket[5m])))
|
|
69
|
+
|
|
70
|
+
# TIME_WAIT pressure alert
|
|
71
|
+
tcp_time_wait_connections > 10000
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### 3.2 Collection
|
|
75
|
+
|
|
76
|
+
| Method | Mechanism | Privilege |
|
|
77
|
+
|--------|-----------|-----------|
|
|
78
|
+
| OTel hostmetrics receiver | `/proc/net/tcp`, `/proc/net/snmp`, `/proc/net/sockstat` | Root or CAP_SYS_PTRACE |
|
|
79
|
+
| eBPF socket filter | kprobes on `tcp_retransmit_skb`, `tcp_sendmsg` | CAP_BPF (kernel ≥ 5.8) or root |
|
|
80
|
+
| Linux netlink SOCK_DIAG | TCP socket state enumeration | Unprivileged in most distros |
|
|
81
|
+
|
|
82
|
+
### 3.3 Common Pitfalls
|
|
83
|
+
|
|
84
|
+
**Connection pool exhaustion.** High `tcp_active_connections` with high application latency but no TCP errors
|
|
85
|
+
points to pool queue saturation, not network failure. Cross-ref: `../signals/traces.md §DB connection pool patterns`.
|
|
86
|
+
|
|
87
|
+
**SYN cookie activation.** `tcp_syn_queue_drops_total` > 0 in normal traffic means `tcp_max_syn_backlog`
|
|
88
|
+
is too low. SYN cookies mask drop counters in `/proc/net/snmp`; use eBPF for reliable counts.
|
|
89
|
+
|
|
90
|
+
**TIME_WAIT accumulation.** Short-lived HTTP/1.1 connections exhaust ephemeral ports. Remediation:
|
|
91
|
+
`SO_REUSEADDR`, wider `ip_local_port_range`, or HTTP/2 multiplexing.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 4. UDP Observability
|
|
96
|
+
|
|
97
|
+
| Metric | Source | Measures |
|
|
98
|
+
|--------|--------|----------|
|
|
99
|
+
| `udp_datagrams_sent_total` | `/proc/net/snmp` | Baseline send throughput |
|
|
100
|
+
| `udp_receive_buffer_errors_total` | `/proc/net/snmp` `RcvbufErrors` | Socket buffer overflow; increase `net.core.rmem_max` |
|
|
101
|
+
| `udp_no_ports_total` | `/proc/net/snmp` `NoPorts` | Drop because no listener on destination port |
|
|
102
|
+
| `udp_checksum_errors_total` | `/proc/net/snmp` `InCsumErrors` | Corrupted datagrams; NIC or path corruption |
|
|
103
|
+
|
|
104
|
+
OTel hostmetrics `network` scraper covers these counters automatically.
|
|
105
|
+
Cross-ref: `../transport/udp-statsd-mtu.md` for StatsD payload sizing constraints that affect
|
|
106
|
+
`udp_receive_buffer_errors_total` in high-throughput StatsD pipelines.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 5. eBPF-Based L4 Observability
|
|
111
|
+
|
|
112
|
+
eBPF instruments the Linux kernel without application code changes. Three tools are in scope.
|
|
113
|
+
|
|
114
|
+
### 5.1 Tool Comparison
|
|
115
|
+
|
|
116
|
+
| Tool | CNCF Status | Primary signal | OTel output | Key use case |
|
|
117
|
+
|------|-------------|----------------|-------------|--------------|
|
|
118
|
+
| **Grafana Beyla** | CNCF Incubating (2024) | HTTP/gRPC traces + Go/C++ runtime | OTLP natively | Zero-code HTTP/gRPC auto-instrumentation via uprobes; also emits `tcp_rtt_us` histograms. Requires kernel ≥ 5.2 with BTF enabled |
|
|
119
|
+
| **Pixie** | CNCF Sandbox | Multi-protocol traces + L4 metrics via PxL | OTLP via `px-export` | Scriptable cluster-wide eBPF; auto-discovers pods |
|
|
120
|
+
| **Parca** | CNCF Sandbox | Continuous CPU + off-CPU flame graphs | pprof-compatible | Whole-cluster profiling; cross-ref `../signals/profiles.md` |
|
|
121
|
+
|
|
122
|
+
Sources: <https://grafana.com/oss/beyla/>, <https://px.dev/>, <https://parca.dev/>
|
|
123
|
+
|
|
124
|
+
**Out of scope: Cilium Tetragon.** Security-focused runtime policy enforcement (syscall filtering, process
|
|
125
|
+
exec tracing) belongs to a security skill. Falco is the comparable alternative for kernel security events.
|
|
126
|
+
|
|
127
|
+
### 5.2 Kernel and Privilege Requirements
|
|
128
|
+
|
|
129
|
+
| Requirement | Detail |
|
|
130
|
+
|-------------|--------|
|
|
131
|
+
| Minimum kernel | ≥ 4.14 for most eBPF features; ≥ 5.8 for CAP_BPF without root |
|
|
132
|
+
| Capabilities | CAP_BPF + CAP_PERFMON (kernel ≥ 5.8) or root on older kernels |
|
|
133
|
+
| GKE Autopilot | eBPF DaemonSets disallowed; use Standard node pools |
|
|
134
|
+
| EKS Fargate | No DaemonSet support; eBPF unavailable |
|
|
135
|
+
| AKS | Supported on standard node pools; verify with `uname -r` |
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Preflight kernel check (run in initContainer or node admission)
|
|
139
|
+
uname -r # must be >= 4.14, ideally >= 5.8
|
|
140
|
+
capsh --print | grep cap_bpf
|
|
141
|
+
|
|
142
|
+
# Beyla deploy via Helm
|
|
143
|
+
helm repo add grafana https://grafana.github.io/helm-charts
|
|
144
|
+
helm install beyla grafana/beyla --namespace beyla --create-namespace
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 5.3 Pixie PxL (Conceptual)
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
# Conceptual PxL — TCP retransmit counts per pod
|
|
151
|
+
import px
|
|
152
|
+
df = px.DataFrame(table='tcp_retransmits', start_time='-5m')
|
|
153
|
+
df = df.groupby(['pod', 'namespace']).agg(retransmits=('retransmits', px.sum))
|
|
154
|
+
px.display(df)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 6. Connection Lifecycle Observability
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
LISTEN → SYN_RECEIVED → ESTABLISHED → (data transfer)
|
|
163
|
+
→ FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED (active close)
|
|
164
|
+
→ CLOSE_WAIT → LAST_ACK → CLOSED (passive close)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
| State | Observable signal | Tooling |
|
|
168
|
+
|-------|------------------|---------|
|
|
169
|
+
| SYN → ESTABLISHED | Setup latency (SYN-ACK RTT) | eBPF `tcp_v4_connect` kprobe |
|
|
170
|
+
| ESTABLISHED idle | Keepalive probe success/failure | `/proc/net/tcp` + hostmetrics |
|
|
171
|
+
| FIN_WAIT / TIME_WAIT | TIME_WAIT gauge; ephemeral port pressure | hostmetrics `/proc/net/sockstat` |
|
|
172
|
+
| CLOSE_WAIT growth | Server not releasing half-open connections | hostmetrics + eBPF alert |
|
|
173
|
+
|
|
174
|
+
**TLS handshake boundary.** TLS sits at L4/L5. `tls.*` semconv is Development tier; do not build
|
|
175
|
+
production SLOs on it. Use eBPF uprobes on OpenSSL/BoringSSL or vendor tooling for handshake latency.
|
|
176
|
+
Cross-ref: `../signals/privacy.md §TLS context`.
|
|
177
|
+
|
|
178
|
+
**Keepalive tuning.** TCP keepalive interval must be shorter than the upstream LB idle timeout
|
|
179
|
+
(AWS ALB: 60 s; AWS NLB: 350 s; GCP CLB: 600 s default). Mismatches cause silent connection resets.
|
|
180
|
+
|
|
181
|
+
**WebSocket and gRPC streams**; full lifecycle coverage is deferred to L7 (`../standards.md §5`).
|
|
182
|
+
Long-lived streams mitigate TIME_WAIT accumulation but introduce reconnection-storm risk on restart.
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 7. QUIC / HTTP/3 Transport Semantics
|
|
187
|
+
|
|
188
|
+
QUIC (RFC 9000) is a UDP-based transport with built-in TLS 1.3, stream multiplexing, and connection
|
|
189
|
+
migration. HTTP/3 (RFC 9114) runs exclusively over QUIC.
|
|
190
|
+
|
|
191
|
+
### 7.1 Observability Differences from TCP
|
|
192
|
+
|
|
193
|
+
| TCP concept | QUIC equivalent | Observability impact |
|
|
194
|
+
|-------------|----------------|----------------------|
|
|
195
|
+
| 3-way SYN handshake | 1-RTT or 0-RTT | No SYN/FIN to observe; connection state is QUIC-internal |
|
|
196
|
+
| 5-tuple for correlation | Connection ID (opaque bytes) | Connection ID survives NAT rebinding; log it on establishment |
|
|
197
|
+
| `/proc/net/tcp` retransmit | QUIC loss recovery (packet number gaps) | Not visible in proc; requires QUIC-aware tooling |
|
|
198
|
+
| TCP FIN / RST | QUIC GOAWAY / CONNECTION_CLOSE frames | Surfaced in Envoy access logs |
|
|
199
|
+
| HTTP/2 HOL blocking | Per-stream flow control; no HOL blocking | Stream errors do not block other streams |
|
|
200
|
+
|
|
201
|
+
### 7.2 OTel Semconv for QUIC
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
network.transport: quic
|
|
205
|
+
network.protocol.name: http
|
|
206
|
+
network.protocol.version: "3"
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 7.3 0-RTT Observability
|
|
210
|
+
|
|
211
|
+
0-RTT sends data before the handshake completes. Emit a span attribute or metric label
|
|
212
|
+
distinguishing 0-RTT from 1-RTT connections to detect replay exposure on non-idempotent endpoints.
|
|
213
|
+
|
|
214
|
+
### 7.4 Firewall and Enterprise Deployment Considerations
|
|
215
|
+
|
|
216
|
+
Enterprise networks frequently block outbound UDP 443 and UDP 8443 because legacy firewall rules assume HTTP(S) is TCP-only. QUIC (and therefore HTTP/3) rides on UDP and silently falls back to HTTP/1.1 or HTTP/2 when UDP is blocked; the fallback is invisible to application telemetry unless you instrument it.
|
|
217
|
+
|
|
218
|
+
Detect QUIC blocking:
|
|
219
|
+
- Emit `network.transport` attribute on client spans; compare ratio of `quic` vs `tcp` across deployment zones
|
|
220
|
+
- CDN access logs (Cloudflare, Fastly) expose QUIC negotiation outcome per edge
|
|
221
|
+
- Alert when `quic` ratio drops below baseline (for example, office network where UDP 443 is firewalled)
|
|
222
|
+
|
|
223
|
+
Action: coordinate with network security to allowlist UDP 443/8443 for validated destinations; document the fallback behavior so regressions do not silently halve transport performance.
|
|
224
|
+
|
|
225
|
+
### 7.5 Tool Support (2026)
|
|
226
|
+
|
|
227
|
+
| Tool | QUIC support |
|
|
228
|
+
|------|-------------|
|
|
229
|
+
| Envoy 1.29+ | QUIC upstream and downstream; stats in admin API and access logs |
|
|
230
|
+
| Istio 1.22+ | QUIC upstream via Envoy; mTLS over QUIC experimental; see `layers/mesh.md` |
|
|
231
|
+
| Grafana Beyla | HTTP/3 uprobes in roadmap; verify release notes before QUIC-heavy deployments |
|
|
232
|
+
| Cloudflare QUIC telemetry | <https://blog.cloudflare.com/tag/quic/>; public connection migration + 0-RTT metrics |
|
|
233
|
+
| Google QUIC metrics | <https://research.google>; packet loss recovery timing |
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 8. OS-Level Integration
|
|
238
|
+
|
|
239
|
+
| Source | Signal | Cross-ref |
|
|
240
|
+
|--------|--------|-----------|
|
|
241
|
+
| systemd-journal / syslog | TCP resets, netfilter drops, NIC errors | `../signals/logs.md §OS-level log sources` |
|
|
242
|
+
| cgroup v2 net accounting | Per-container byte/packet counters | `../transport/collector-topology.md §kubernetes` |
|
|
243
|
+
| nf_conntrack | NAT and stateful firewall connection table size | Requires `nf_conntrack` kernel module |
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## 9. Matrix Cells: L4 Row
|
|
248
|
+
|
|
249
|
+
From `../matrix.md §L4-transport`:
|
|
250
|
+
|
|
251
|
+
| Cell | Symbol | Rationale |
|
|
252
|
+
|------|--------|-----------|
|
|
253
|
+
| L4 × cross-application × traces | PARTIAL | TCP is not trace-native; log socket 5-tuple for post-hoc correlation to L7 spans only |
|
|
254
|
+
| L4 × * × profiles | PASS | eBPF off-CPU profiling via Parca captures kernel socket overhead and network-wait; pprof output |
|
|
255
|
+
| L4 × privacy (all boundaries) | PARTIAL | Source/destination IPs in TCP logs are PII (GDPR Art. 4(1)); apply masking at pipeline ingress |
|
|
256
|
+
| L4 × SLO and L4 × release | N/A | SLO budgets and release markers are application-layer; TCP health is infra-SLI fallback only |
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 10. Anti-Patterns: Candidates for `../anti-patterns.md §Section H`
|
|
261
|
+
|
|
262
|
+
**H-L4-1: Connection pool observability absent.** Pool queue saturation is invisible in TCP metrics
|
|
263
|
+
alone; neither retransmit rate nor error rate spikes until the pool times out. Instrument pool size,
|
|
264
|
+
wait time, and timeout counters at the application layer. Severity: HIGH.
|
|
265
|
+
|
|
266
|
+
**H-L4-2: QUIC adoption without HTTP/3 trace tooling validation.** Enabling QUIC without verifying
|
|
267
|
+
that OTel SDKs emit `network.transport: quic` and `network.protocol.version: "3"` creates a
|
|
268
|
+
transport-layer blind spot. Add a canary assertion in staging before production rollout. Severity: HIGH.
|
|
269
|
+
|
|
270
|
+
**H-L4-3: eBPF agent deployed without kernel/capability preflight.** Beyla or Pixie DaemonSets on
|
|
271
|
+
incompatible kernels fail silently with no operator-visible error. Add an `initContainer` asserting
|
|
272
|
+
kernel version and CAP_BPF presence; fail non-zero if requirements are unmet. Severity: HIGH.
|
|
273
|
+
|
|
274
|
+
**H-L4-4: WebSocket reconnection storm undetected.** Server restart without graceful WebSocket drain
|
|
275
|
+
causes simultaneous mass-reconnect. TCP SYN counts look like normal new connections. Instrument client
|
|
276
|
+
reconnection counters and alert on rate spikes; implement exponential backoff + jitter. Severity: MEDIUM.
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## 11. References
|
|
281
|
+
|
|
282
|
+
- OTel network attributes registry: <https://opentelemetry.io/docs/specs/semconv/attributes-registry/network/>
|
|
283
|
+
- Grafana Beyla: <https://grafana.com/oss/beyla/>
|
|
284
|
+
- Pixie (CNCF Sandbox): <https://px.dev/>
|
|
285
|
+
- Parca (CNCF Sandbox): <https://parca.dev/>
|
|
286
|
+
- QUIC RFC 9000: <https://www.rfc-editor.org/rfc/rfc9000>
|
|
287
|
+
- HTTP/3 RFC 9114: <https://www.rfc-editor.org/rfc/rfc9114>
|
|
288
|
+
- Cloudflare QUIC telemetry: <https://blog.cloudflare.com/tag/quic/>
|
|
289
|
+
- OTel hostmetrics receiver: <https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver>
|
|
290
|
+
- Linux `/proc/net/tcp` format: <https://www.kernel.org/doc/html/latest/networking/proc_net_tcp.html>
|
|
291
|
+
- Semconv stability tiers: `../standards.md §3`
|
|
292
|
+
- OSI boundary decisions: `../standards.md §5`
|
|
293
|
+
- Coverage matrix (L4 row): `../matrix.md §L4-transport`
|
|
294
|
+
- IP masking rules: `../signals/privacy.md §IP addresses`
|
|
295
|
+
- Profiling (eBPF/Parca): `../signals/profiles.md`
|
|
296
|
+
- OS-level logs: `../signals/logs.md §OS-level log sources`
|
|
297
|
+
- Collector Kubernetes topology: `../transport/collector-topology.md`
|
|
298
|
+
- StatsD UDP sizing: `../transport/udp-statsd-mtu.md`
|
|
299
|
+
- Service mesh + QUIC: `layers/mesh.md`
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
---
|
|
2
|
+
otel_semconv: "1.43.0 (2026-07)"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Crash Analytics: L7 Application Layer
|
|
6
|
+
|
|
7
|
+
## 1. Scope and Why Separate from RUM
|
|
8
|
+
|
|
9
|
+
Crash analytics is not RUM. The distinction matters for pipeline design, KPI selection, and vendor choice.
|
|
10
|
+
|
|
11
|
+
| Dimension | RUM | Crash Analytics |
|
|
12
|
+
|-----------|-----|----------------|
|
|
13
|
+
| Session type | Successful sessions (UX measured) | Abnormal terminations (failed sessions) |
|
|
14
|
+
| Primary KPI | Core Web Vitals / INP / startup time | Crash-Free Rate (CFR), ANR Rate |
|
|
15
|
+
| Pipeline | Beacon / SDK event stream → backend | Crash report queued on device → uploaded on restart |
|
|
16
|
+
| Symbolication | N/A (JS source maps for errors only) | dSYM / ProGuard / R8 / Dart symbols required |
|
|
17
|
+
| Offline behavior | Events dropped if offline | Report queued locally; uploaded on next launch |
|
|
18
|
+
|
|
19
|
+
This file documents the common crash pipeline shared across mobile native, web, and backend uncaught exceptions. Platform-specific symbolication flows are cross-referenced:
|
|
20
|
+
|
|
21
|
+
- Mobile native detail: `mobile-rum.md §Crash + ANR`
|
|
22
|
+
- Web JS error detail: `web-rum.md §Error Boundary and window.onerror`
|
|
23
|
+
|
|
24
|
+
Platforms in scope: iOS native, Android native, React Native, Flutter, web (JS), backend uncaught exceptions.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 2. Core Metrics
|
|
29
|
+
|
|
30
|
+
### Crash-Free Rate (CFR)
|
|
31
|
+
|
|
32
|
+
CFR is the primary stability KPI for mobile and web applications.
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Session CFR = (sessions without crash) / (total sessions)
|
|
36
|
+
User CFR = (users not experiencing any crash) / (total active users)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Targets by application category:
|
|
40
|
+
|
|
41
|
+
| Category | Minimum Session CFR | Notes |
|
|
42
|
+
|----------|--------------------|----|
|
|
43
|
+
| Consumer mobile | 99.5% | Google Play bad-behavior threshold: < 99.0% triggers review |
|
|
44
|
+
| Enterprise / B2B mobile | 99.7% | Internal SLA baseline |
|
|
45
|
+
| Regulated (fintech, health) | 99.9%+ | Near-zero tolerance; compliance-linked |
|
|
46
|
+
| Web SPA | 99.8%+ | JS errors below `Error Boundary` counted as crashes |
|
|
47
|
+
|
|
48
|
+
### ANR Rate and Hang Rate
|
|
49
|
+
|
|
50
|
+
Near-crash experiences that degrade user perception without a fatal signal:
|
|
51
|
+
|
|
52
|
+
- **Google Play user-perceived ANR rate** = daily active users experiencing at least one user-perceived ANR / daily active users. The overall bad-behavior threshold is 0.47%; it is not an ANR-events/session threshold. Input dispatch typically times out at 5 s. Broadcast receiver timeouts are 10 s (foreground) / 60 s (background) on Android 13 and lower, and 10–20 s / 60–120 s on Android 14+, depending on CPU starvation. Keep any custom session-based stall metric separate. Sources: <https://developer.android.com/topic/performance/anrs/diagnose-and-fix-anrs> and <https://developer.android.com/google/play/vitals>.
|
|
53
|
+
- **iOS Hang Rate** = main-thread hangs > 250 ms / sessions. Visible in Xcode Organizer → Hangs and via MetricKit `MXHangDiagnostic` (iOS 14+).
|
|
54
|
+
|
|
55
|
+
### Supporting Metrics
|
|
56
|
+
|
|
57
|
+
| Metric | Definition |
|
|
58
|
+
|--------|-----------|
|
|
59
|
+
| Affected Users % | `(users who hit crash X) / (DAU)`; scope of a specific crash group |
|
|
60
|
+
| Time-to-Symbolication | Duration from crash report ingestion to readable stack trace |
|
|
61
|
+
| Crash Volume | Raw crash event count; use with CFR, not instead of it |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 3. Platform-Specific Symbolication Pipelines
|
|
66
|
+
|
|
67
|
+
Each platform requires a distinct artifact upload strategy. Failure to automate upload results in unreadable stack traces in production.
|
|
68
|
+
|
|
69
|
+
| Platform | Symbol artifact | Upload trigger | Key complexity |
|
|
70
|
+
|----------|----------------|---------------|----------------|
|
|
71
|
+
| iOS | dSYM bundle (per build UUID) | Xcode archive → CI upload | Bitcode deprecated in Xcode 14; no re-symbolication |
|
|
72
|
+
| Android (JVM) | `mapping.txt` (ProGuard / R8) | Gradle task post-minify | Must match exact build; obfuscation mapping is one-way |
|
|
73
|
+
| Android (NDK) | `.so` files with debug info stripped separately | CI symbol upload | Requires `--build-id` linkage; `.so` from APK lacks debug info |
|
|
74
|
+
| React Native | JS sourcemap + iOS dSYM + Android mapping.txt | Three uploads per release | Hermes bytecode adds an extra sourcemap layer |
|
|
75
|
+
| Flutter | Dart symbol files from `--split-debug-info` | CI upload after `flutter build` | Both iOS dSYM and Android mapping still needed for platform channels |
|
|
76
|
+
| Web | JS sourcemap | CI deploy pipeline | `window.onerror` + `onunhandledrejection`; React/Vue Error Boundary |
|
|
77
|
+
| Backend | N/A (source available) | OTel `exception.*` attributes | Sentry Python/Node/Ruby SDK for crash-like grouping |
|
|
78
|
+
|
|
79
|
+
### iOS
|
|
80
|
+
|
|
81
|
+
dSYM (Debug Symbols) is the binary artifact that maps obfuscated addresses to function names and line numbers. Each Xcode build generates a UUID-stamped dSYM. The UUID must match the crash report exactly; re-using a dSYM from a different build produces wrong or partial symbolication.
|
|
82
|
+
|
|
83
|
+
Bitcode was deprecated in Xcode 14. Prior to Xcode 14, Apple re-compiled bitcode for App Store distribution, requiring vendors (Firebase, Sentry, Datadog) to download the re-compiled dSYM from App Store Connect via the API. Xcode 14+ removes this complexity; the Xcode-generated dSYM is final.
|
|
84
|
+
|
|
85
|
+
Apple App Store Connect crash API: Firebase Crashlytics, Sentry, and Datadog can pull crash data from App Store Connect for devices where the user has opted into analytics sharing.
|
|
86
|
+
|
|
87
|
+
### Android
|
|
88
|
+
|
|
89
|
+
ProGuard / R8 generates `mapping.txt` which maps obfuscated class/method names back to source. The NDK layer produces native `.so` libraries; the release variant strips debug info into a separate symbol file. Upload both `mapping.txt` and NDK symbol `.so` files for full stack traces covering Java/Kotlin and C++ frames.
|
|
90
|
+
|
|
91
|
+
Play Console crashes API: available for complementary data, not a replacement for vendor SDK.
|
|
92
|
+
|
|
93
|
+
### React Native
|
|
94
|
+
|
|
95
|
+
Three separate symbol artifacts per release:
|
|
96
|
+
|
|
97
|
+
1. JS bundle sourcemap (Metro bundler output)
|
|
98
|
+
2. iOS dSYM (for native frames)
|
|
99
|
+
3. Android `mapping.txt` (for native frames)
|
|
100
|
+
|
|
101
|
+
Hermes JS engine compiles JS to bytecode. The sourcemap chain is: Hermes bytecode address → JS sourcemap → original TS/JS source. Some vendors (Sentry, Datadog) have Hermes-aware symbolication; verify vendor documentation before assuming standard sourcemap upload suffices.
|
|
102
|
+
|
|
103
|
+
### Flutter
|
|
104
|
+
|
|
105
|
+
`flutter build --split-debug-info=<dir> --obfuscate` produces Dart symbol files. These must be uploaded to the crash vendor's symbol storage. Platform-channel crashes (e.g., method channel calls into Kotlin/Swift) still require iOS dSYM and Android `mapping.txt` in addition to Dart symbols.
|
|
106
|
+
|
|
107
|
+
### Web
|
|
108
|
+
|
|
109
|
+
Cross-reference `web-rum.md §Error tracking`. Key patterns:
|
|
110
|
+
- `window.onerror` catches uncaught synchronous errors
|
|
111
|
+
- `window.addEventListener('unhandledrejection', ...)` catches unhandled Promise rejections
|
|
112
|
+
- React `ErrorBoundary`, Vue `app.config.errorHandler`, Svelte `<svelte:component this={ErrorBoundary}>` prevent full-page crashes and capture component-tree context
|
|
113
|
+
|
|
114
|
+
### Backend
|
|
115
|
+
|
|
116
|
+
Backend services rarely produce binary crash reports. OTel `exception.*` attributes (Stable semconv) capture the exception type, message, and stacktrace on spans. Sentry Python / Node.js / Ruby SDKs provide crash-like aggregation with grouping, release tracking, and breadcrumbs that mirror the mobile crash experience.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 4. Release Tracking Integration
|
|
121
|
+
|
|
122
|
+
Release tracking is the most commonly omitted step in crash pipelines. Without it, a crash spike cannot be correlated to a specific deploy.
|
|
123
|
+
|
|
124
|
+
**CI must set `service.version` on every build.** The OTel semconv `service.version` attribute (Stable) is the canonical release identifier. All crash events, spans, and metrics must carry this attribute.
|
|
125
|
+
|
|
126
|
+
**Symbol upload must be automated per release.** Manual upload is an anti-pattern (see Section 12). Use:
|
|
127
|
+
|
|
128
|
+
- Sentry CLI: `sentry-cli releases propose-version` + `sentry-cli releases files upload-sourcemaps`
|
|
129
|
+
- Fastlane plugin: `fastlane-plugin-sentry` for iOS/Android
|
|
130
|
+
- Gradle plugin: `io.sentry.android.gradle` for Android automatic upload
|
|
131
|
+
- Firebase: `firebase crashlytics:symbols:upload` for dSYM (Fastlane or Gradle)
|
|
132
|
+
|
|
133
|
+
**Release marker events** are structured log records written at deploy time (see `../../boundaries/release.md`). Crash vendors use these to draw vertical lines on CFR trend charts, enabling before/after comparison. Flagger and Argo Rollouts canary analysis can use CFR as a promotion/rollback gate signal; cross-reference `../../boundaries/release.md §Canary analysis`.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## 5. Vendor Comparison Matrix (as of 2026-Q2)
|
|
138
|
+
|
|
139
|
+
Cross-reference `../../vendor-categories.md §Category (j): Crash Analytics`.
|
|
140
|
+
|
|
141
|
+
| Vendor | iOS | Android | Web JS | Backend | OSS/Free | Key differentiator |
|
|
142
|
+
|--------|-----|---------|--------|---------|----------|--------------------|
|
|
143
|
+
| Firebase Crashlytics | Yes | Yes | No | No | Free | Google-owned; zero cost; mobile-only; dSYM auto-upload via Xcode plugin |
|
|
144
|
+
| Sentry | Yes | Yes | Yes | Yes | OSS + SaaS | Full-stack (mobile + web + backend); release tracking; OTel trace correlation |
|
|
145
|
+
| Bugsnag | Yes | Yes | Yes | Yes | Commercial | Stability score; smart grouping noise reduction; breadcrumb API |
|
|
146
|
+
| Embrace | Yes | Yes | No | No | Commercial | ANR/startup crash specialist; session replay; network body capture |
|
|
147
|
+
| Datadog Error Tracking | Yes | Yes | Yes | Yes | Commercial | Native RUM + APM integration; unified with Datadog traces |
|
|
148
|
+
|
|
149
|
+
**Key differentiators:**
|
|
150
|
+
|
|
151
|
+
- **Firebase Crashlytics**: best choice when budget is zero and stack is mobile-only. No web or backend support. Google ecosystem (Analytics, BigQuery export).
|
|
152
|
+
- **Sentry**: strongest cross-platform story. The only vendor in the matrix with meaningful OSS options. Release health dashboard is the most mature. OTel `trace_id` in crash context enables backend span lookup.
|
|
153
|
+
- **Bugsnag**: stability metrics and smart grouping reduce alert fatigue. Breadcrumb API is the most flexible for custom event recording.
|
|
154
|
+
- **Embrace**: purpose-built for mobile ANR, startup crash, and user-journey session replay. Not a general-purpose crash tool.
|
|
155
|
+
- **Datadog Error Tracking**: optimal when Datadog APM is already in use. RUM + APM linkage is native; no separate SDK integration.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 6. Crash Pipeline Flow
|
|
160
|
+
|
|
161
|
+
```
|
|
162
|
+
App crashes → crash report generated
|
|
163
|
+
(stack trace + breadcrumbs + device context + user context)
|
|
164
|
+
|
|
|
165
|
+
v
|
|
166
|
+
Queued locally on device (if offline — see mobile-rum.md §offline queuing)
|
|
167
|
+
|
|
|
168
|
+
v
|
|
169
|
+
Uploaded to vendor on next launch or when network available
|
|
170
|
+
|
|
|
171
|
+
v
|
|
172
|
+
Vendor-side symbolication
|
|
173
|
+
(dSYM / ProGuard / sourcemap matched by build UUID / version)
|
|
174
|
+
|
|
|
175
|
+
v
|
|
176
|
+
Deduplication by stack fingerprint
|
|
177
|
+
(vendor groups similar crashes into one issue)
|
|
178
|
+
|
|
|
179
|
+
v
|
|
180
|
+
Aggregation: Affected Users %, Event Count, CFR delta
|
|
181
|
+
|
|
|
182
|
+
v
|
|
183
|
+
Alert + ticket creation
|
|
184
|
+
(PagerDuty / OpsGenie for CFR breach; JIRA / Linear for issue triage)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 7. Breadcrumbs and Context
|
|
190
|
+
|
|
191
|
+
Breadcrumbs are the sequence of events recorded before the crash. They are the primary debugging context beyond the stack trace.
|
|
192
|
+
|
|
193
|
+
| Category | Examples |
|
|
194
|
+
|----------|---------|
|
|
195
|
+
| User actions | Button taps, navigation events, form submissions |
|
|
196
|
+
| Network calls | HTTP request URL, status code, duration |
|
|
197
|
+
| Log events | Application log statements recorded by SDK |
|
|
198
|
+
| State changes | Authentication events, feature flag changes |
|
|
199
|
+
|
|
200
|
+
Context attached to every crash report:
|
|
201
|
+
|
|
202
|
+
| Field | Source | Notes |
|
|
203
|
+
|-------|--------|-------|
|
|
204
|
+
| `device.model` | OS API | Device model identifier |
|
|
205
|
+
| `os.version` | OS API | OS version string |
|
|
206
|
+
| `service.version` | Build config | Release version; must match symbol upload |
|
|
207
|
+
| `screen_resolution` | OS API | Pixel dimensions |
|
|
208
|
+
| `free_memory_mb` | OS API | Available RAM at crash time |
|
|
209
|
+
| `user.id` | App session | Hash or opaque ID only; see Section 8 |
|
|
210
|
+
|
|
211
|
+
Custom keys (e.g., `order.id`, `tenant.id`, `experiment.variant`) enable correlation with business context. Restrict to non-PII values or apply redaction before send.
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 8. Privacy and PII in Crash Reports
|
|
216
|
+
|
|
217
|
+
Stack traces frequently contain PII because exception messages capture method arguments, query strings, and HTTP headers verbatim.
|
|
218
|
+
|
|
219
|
+
**Common PII leaks in crash reports:**
|
|
220
|
+
|
|
221
|
+
- SQL query in exception message containing `user.email` or SSN
|
|
222
|
+
- HTTP response body logged in a network error containing `Authorization: Bearer <token>`
|
|
223
|
+
- URL query parameters with `?email=user@example.com`
|
|
224
|
+
- Custom key set with `user.email` directly
|
|
225
|
+
|
|
226
|
+
**Vendor SDK redaction hooks:**
|
|
227
|
+
|
|
228
|
+
Sentry `beforeSend` callback (JavaScript/TypeScript example):
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
Sentry.init({
|
|
232
|
+
dsn: "...",
|
|
233
|
+
beforeSend(event) {
|
|
234
|
+
// Strip email from exception values
|
|
235
|
+
if (event.exception?.values) {
|
|
236
|
+
event.exception.values = event.exception.values.map((ex) => ({
|
|
237
|
+
...ex,
|
|
238
|
+
value: ex.value?.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, "[email]"),
|
|
239
|
+
}));
|
|
240
|
+
}
|
|
241
|
+
// Remove auth headers from request context
|
|
242
|
+
if (event.request?.headers) {
|
|
243
|
+
delete event.request.headers["Authorization"];
|
|
244
|
+
delete event.request.headers["Cookie"];
|
|
245
|
+
}
|
|
246
|
+
return event;
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
- **Firebase Crashlytics**: use `setCustomKey` with an explicit allowlist; never pass user.email or tokens as custom keys.
|
|
252
|
+
- **Datadog**: `beforeSend` callback mirrors Sentry's pattern; apply to both RUM and Error Tracking initializations.
|
|
253
|
+
|
|
254
|
+
Cross-reference: `../../signals/privacy.md §Crash report redaction` and `../../anti-patterns.md §Section A Privacy`.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## 9. CI Integration for Symbol Upload
|
|
259
|
+
|
|
260
|
+
Symbols must never be stored in git. Upload to the vendor on every CI build that produces a release artifact.
|
|
261
|
+
|
|
262
|
+
Conceptual GitHub Actions workflow (adapt per vendor):
|
|
263
|
+
|
|
264
|
+
```yaml
|
|
265
|
+
# .github/workflows/release.yml (conceptual — adapt version and paths)
|
|
266
|
+
- name: Build iOS release
|
|
267
|
+
run: xcodebuild archive -scheme MyApp -archivePath build/MyApp.xcarchive
|
|
268
|
+
|
|
269
|
+
- name: Upload dSYM to Sentry
|
|
270
|
+
env:
|
|
271
|
+
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
|
272
|
+
SENTRY_ORG: my-org
|
|
273
|
+
SENTRY_PROJECT: my-app-ios
|
|
274
|
+
run: |
|
|
275
|
+
sentry-cli releases propose-version
|
|
276
|
+
sentry-cli upload-dif build/MyApp.xcarchive/dSYMs \
|
|
277
|
+
--include-sources
|
|
278
|
+
|
|
279
|
+
- name: Tag release with service.version
|
|
280
|
+
run: |
|
|
281
|
+
sentry-cli releases new "${GITHUB_REF_NAME}"
|
|
282
|
+
sentry-cli releases set-commits "${GITHUB_REF_NAME}" --auto
|
|
283
|
+
sentry-cli releases finalize "${GITHUB_REF_NAME}"
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
For Android, replace the dSYM upload step with a Gradle task invocation (`./gradlew :app:uploadSentryProguardMappings`) or `sentry-cli upload-proguard --android`.
|
|
287
|
+
|
|
288
|
+
Cross-reference `../../observability-as-code.md` for observability-as-code patterns and repository structure for symbol upload configuration.
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## 10. ANR and Hang Detection
|
|
293
|
+
|
|
294
|
+
ANR and hangs are near-crash events that degrade UX without generating a fatal crash report. They require distinct detection and alerting strategies.
|
|
295
|
+
|
|
296
|
+
### Android ANR
|
|
297
|
+
|
|
298
|
+
- Definition: input-dispatch ANRs typically use a 5 s timeout; broadcast receiver timeouts depend on foreground/background priority and OS version (see §2). A 200 ms stall is not the broadcast ANR threshold.
|
|
299
|
+
- Detection sources:
|
|
300
|
+
- `ApplicationExitInfo` API (Android 11+): query ANR reasons from the OS after the fact.
|
|
301
|
+
- `ANRWatchDog` library: third-party watchdog thread that detects main-thread stalls in-process.
|
|
302
|
+
- Sentry, Embrace, Datadog: vendor SDK ANR detection via watchdog thread.
|
|
303
|
+
- Alert threshold: compare the Google Play user-perceived ANR rate against 0.47% of daily active users. Do not apply that threshold to a custom ANR-events/session series.
|
|
304
|
+
|
|
305
|
+
### iOS Hang
|
|
306
|
+
|
|
307
|
+
- Definition: main thread blocked for more than 250 ms (Xcode Organizer threshold).
|
|
308
|
+
- Detection sources:
|
|
309
|
+
- Xcode Organizer → Hangs report (aggregated from devices with diagnostic sharing enabled).
|
|
310
|
+
- Sentry App Hang Detection SDK: configurable threshold, default 2 seconds; reports hangs as separate issue type.
|
|
311
|
+
- MetricKit: `MXHangDiagnostic` (iOS 14+) for on-device hang diagnostics.
|
|
312
|
+
- Alert threshold: no Google Play equivalent; apply product-specific target (e.g., < 0.1% of sessions for consumer apps).
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 11. Matrix Cross-References (L7 Row)
|
|
317
|
+
|
|
318
|
+
These cells from `../../matrix.md` are directly informed by this file:
|
|
319
|
+
|
|
320
|
+
| Matrix cell | Artifact | Note |
|
|
321
|
+
|-------------|---------|------|
|
|
322
|
+
| L7 × multi-tenant × logs | Per-tenant crash rate segmentation | `tenant.id` as custom key in crash context |
|
|
323
|
+
| L7 × release × traces | Release-tagged crash correlates canary rollback | `service.version` on crash event + span `trace_id` linkage |
|
|
324
|
+
| L7 × privacy × logs | Crash report redaction before send | `beforeSend` hook; allowlist custom keys |
|
|
325
|
+
| L7 × cross-application × traces | Backend `trace_id` in crash context | Sentry / Datadog: attach active `trace_id` to crash report for backend span lookup |
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## 12. Anti-Patterns
|
|
330
|
+
|
|
331
|
+
Candidates for `../../anti-patterns.md §Section G — Crash Analytics`:
|
|
332
|
+
|
|
333
|
+
| Anti-pattern | Impact | Remediation |
|
|
334
|
+
|-------------|--------|------------|
|
|
335
|
+
| Crash report contains `user.email`, auth tokens, or card numbers without redaction filter | GDPR / PIPA breach; PII in vendor SaaS storage | Implement `beforeSend` allowlist; cross-ref Section 8 |
|
|
336
|
+
| Symbol upload not automated in CI | Stack traces unreadable in production | Add symbol upload step to release pipeline; cross-ref Section 9 |
|
|
337
|
+
| No release marker → cannot correlate deploy to crash spike | Crash spike investigation requires manual git bisect | Set `service.version` on every build; emit release event at deploy |
|
|
338
|
+
| ANR rate unmonitored on Android | Google Play app suppression; degraded store ranking | Monitor Play user-perceived ANRs per daily active user at the 0.47% overall threshold; define custom session metrics separately |
|
|
339
|
+
| Single aggregate CFR target ignoring device-tier or OS-version distribution | p10 device users (low-end hardware) masked by p90 average | Segment CFR by `device.model`, `os.version`, and network type |
|
|
340
|
+
| dSYM stored in git LFS instead of vendor symbol storage | Git LFS cost; symbol-build UUID drift | Use vendor upload; never commit dSYMs |
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## References
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
### Primary sources
|
|
350
|
+
|
|
351
|
+
- Firebase Crashlytics: <https://firebase.google.com/docs/crashlytics>
|
|
352
|
+
- Sentry iOS: <https://docs.sentry.io/platforms/apple/>
|
|
353
|
+
- Sentry Android: <https://docs.sentry.io/platforms/android/>
|
|
354
|
+
- Sentry React Native: <https://docs.sentry.io/platforms/react-native/>
|
|
355
|
+
- Sentry Flutter: <https://docs.sentry.io/platforms/flutter/>
|
|
356
|
+
- Xcode Organizer Hangs: <https://developer.apple.com/documentation/xcode/understanding-user-interface-responsiveness>
|
|
357
|
+
- Android ANR: <https://developer.android.com/topic/performance/vitals/anr>
|
|
358
|
+
- Android ApplicationExitInfo: <https://developer.android.com/reference/android/app/ApplicationExitInfo>
|
|
359
|
+
- OTel `exception.*` semconv (Stable): <https://opentelemetry.io/docs/specs/semconv/exceptions/>
|