e11y 0.2.0 → 1.1.0

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.
Files changed (288) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +130 -10
  3. data/CHANGELOG.md +80 -1
  4. data/CLAUDE.md +168 -0
  5. data/CONTRIBUTING.md +640 -0
  6. data/README.md +165 -701
  7. data/RELEASE.md +41 -12
  8. data/Rakefile +249 -57
  9. data/config/README.md +1 -1
  10. data/config/loki-local-config.yaml +12 -0
  11. data/config/otel-collector-config.yaml +44 -0
  12. data/cucumber.yml +1 -0
  13. data/docker-compose.yml +18 -2
  14. data/docs/ADAPTERS.md +76 -0
  15. data/docs/ADAPTIVE_SAMPLING.md +59 -0
  16. data/docs/COMPARISON.md +104 -0
  17. data/docs/CONFIGURATION.md +52 -0
  18. data/docs/DISTRIBUTED_TRACING.md +44 -0
  19. data/docs/LIMITATIONS.md +13 -0
  20. data/docs/METRICS_DSL.md +84 -0
  21. data/docs/PERFORMANCE.md +60 -0
  22. data/docs/PII_FILTERING.md +40 -0
  23. data/docs/PRESETS.md +65 -0
  24. data/docs/QUICK-START.md +546 -587
  25. data/docs/RAILS_INTEGRATION.md +79 -0
  26. data/docs/SCHEMA_VALIDATION.md +63 -0
  27. data/docs/SLO-PROMQL-ALERTS.md +161 -0
  28. data/docs/TESTING.md +69 -0
  29. data/docs/{ADR-001-architecture.md → architecture/ADR-001-architecture.md} +36 -65
  30. data/docs/{ADR-002-metrics-yabeda.md → architecture/ADR-002-metrics-yabeda.md} +62 -236
  31. data/docs/architecture/ADR-003-slo-observability.md +1402 -0
  32. data/docs/{ADR-004-adapter-architecture.md → architecture/ADR-004-adapter-architecture.md} +163 -146
  33. data/docs/{ADR-005-tracing-context.md → architecture/ADR-005-tracing-context.md} +10 -9
  34. data/docs/{ADR-006-security-compliance.md → architecture/ADR-006-security-compliance.md} +184 -191
  35. data/docs/{ADR-007-opentelemetry-integration.md → architecture/ADR-007-opentelemetry-integration.md} +3 -21
  36. data/docs/{ADR-008-rails-integration.md → architecture/ADR-008-rails-integration.md} +182 -743
  37. data/docs/{ADR-009-cost-optimization.md → architecture/ADR-009-cost-optimization.md} +45 -54
  38. data/docs/architecture/ADR-010-developer-experience.md +522 -0
  39. data/docs/{ADR-011-testing-strategy.md → architecture/ADR-011-testing-strategy.md} +44 -86
  40. data/docs/{ADR-012-event-evolution.md → architecture/ADR-012-event-evolution.md} +11 -11
  41. data/docs/{ADR-013-reliability-error-handling.md → architecture/ADR-013-reliability-error-handling.md} +37 -12
  42. data/docs/{ADR-014-event-driven-slo.md → architecture/ADR-014-event-driven-slo.md} +12 -24
  43. data/docs/{ADR-015-middleware-order.md → architecture/ADR-015-middleware-order.md} +43 -59
  44. data/docs/{ADR-016-self-monitoring-slo.md → architecture/ADR-016-self-monitoring-slo.md} +58 -355
  45. data/docs/{ADR-017-multi-rails-compatibility.md → architecture/ADR-017-multi-rails-compatibility.md} +4 -11
  46. data/docs/architecture/ADR-018-memory-optimization.md +366 -0
  47. data/docs/{ADR-INDEX.md → architecture/ADR-INDEX.md} +11 -6
  48. data/docs/plans/2026-03-20-browser-overlay-svelte.md +281 -0
  49. data/docs/{00-ICP-AND-TIMELINE.md → prd/00-ICP-AND-TIMELINE.md} +6 -6
  50. data/docs/{01-SCALE-REQUIREMENTS.md → prd/01-SCALE-REQUIREMENTS.md} +6 -6
  51. data/docs/prd/01-overview-vision.md +19 -14
  52. data/docs/use_cases/README.md +22 -23
  53. data/docs/use_cases/UC-001-request-scoped-debug-buffering.md +50 -44
  54. data/docs/use_cases/UC-002-business-event-tracking.md +26 -95
  55. data/docs/use_cases/UC-003-event-metrics.md +66 -0
  56. data/docs/use_cases/UC-004-zero-config-slo-tracking.md +33 -684
  57. data/docs/use_cases/UC-005-sentry-integration.md +13 -15
  58. data/docs/use_cases/UC-006-trace-context-management.md +30 -28
  59. data/docs/use_cases/UC-007-pii-filtering.md +35 -87
  60. data/docs/use_cases/UC-008-opentelemetry-integration.md +51 -89
  61. data/docs/use_cases/UC-009-multi-service-tracing.md +30 -178
  62. data/docs/use_cases/UC-010-background-job-tracking.md +24 -91
  63. data/docs/use_cases/UC-011-rate-limiting.md +95 -168
  64. data/docs/use_cases/UC-012-audit-trail.md +21 -46
  65. data/docs/use_cases/UC-013-high-cardinality-protection.md +29 -167
  66. data/docs/use_cases/UC-014-adaptive-sampling.md +2 -2
  67. data/docs/use_cases/UC-015-cost-optimization.md +46 -99
  68. data/docs/use_cases/UC-016-rails-logger-migration.md +39 -213
  69. data/docs/use_cases/UC-017-local-development.md +203 -777
  70. data/docs/use_cases/UC-018-testing-events.md +3 -3
  71. data/docs/use_cases/UC-019-retention-based-routing.md +53 -106
  72. data/docs/use_cases/UC-020-event-versioning.md +8 -9
  73. data/docs/use_cases/UC-021-error-handling-retry-dlq.md +18 -22
  74. data/docs/use_cases/UC-022-event-registry.md +15 -21
  75. data/docs/use_cases/backlog.md +119 -87
  76. data/e11y.gemspec +2 -2
  77. data/gems/e11y-devtools/README.md +158 -0
  78. data/gems/e11y-devtools/config/routes.rb +15 -0
  79. data/gems/e11y-devtools/e11y-devtools.gemspec +25 -0
  80. data/gems/e11y-devtools/exe/e11y +34 -0
  81. data/gems/e11y-devtools/frontend/.gitignore +24 -0
  82. data/gems/e11y-devtools/frontend/README.md +51 -0
  83. data/gems/e11y-devtools/frontend/index.html +14 -0
  84. data/gems/e11y-devtools/frontend/package-lock.json +3707 -0
  85. data/gems/e11y-devtools/frontend/package.json +28 -0
  86. data/gems/e11y-devtools/frontend/public/mocks/v1/events/recent.json +4205 -0
  87. data/gems/e11y-devtools/frontend/public/mocks/v1/interactions.json +194 -0
  88. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/0a2e04027cfa22d014bc22e8b27cd913/events.json +86 -0
  89. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/0e1543af6a630fb3af6b52283154b3e0/events.json +169 -0
  90. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/1838b691faa49564f97db8592ff3978d/events.json +78 -0
  91. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/29f198f6588dacffb687777eb5f8f118/events.json +197 -0
  92. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/34bc3c9c0097de28a7a6f99b90a8e7bc/events.json +194 -0
  93. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/3ba6c20d068ab9cee00e51b180e66444/events.json +184 -0
  94. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/435bfd8f17b9009146a79812d7c3726d/events.json +144 -0
  95. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/4c7676e3fe668e99edb2b94d7d5678a9/events.json +222 -0
  96. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/6daf0d47974bedfc55d5de7004a3ea9f/events.json +194 -0
  97. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/8a81ada42834d15f287bb40010043605/events.json +194 -0
  98. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/8c0a98900edaae105469df8daedccf02/events.json +198 -0
  99. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/8e4f645180f8a7d1dce426b07380466b/events.json +222 -0
  100. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/93db346fa5d44a032605a13b627f4b80/events.json +128 -0
  101. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/98ff6146faf7bd9be8bd03a8275817ba/events.json +223 -0
  102. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/9997ddd0247bc7e25f2ca7a5c415c93d/events.json +197 -0
  103. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/99e35f8ef3baedd798cc4fd085980ad9/events.json +194 -0
  104. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/b4f3095c1909924cbc98889a86c83d6d/events.json +131 -0
  105. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/b54b7fc32b7575a7110de809d11ccda0/events.json +128 -0
  106. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/c0b48033fa06746bcc5886745e053cff/events.json +169 -0
  107. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/c44649ac76701b4558927cd2305ab535/events.json +169 -0
  108. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/d601ae3320057580a39dbdac2edfdf4a/events.json +248 -0
  109. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/e67e724bab422d2b52eeb49635e512e1/events.json +194 -0
  110. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/e6c72765a28f158a8485b35fa63f73da/events.json +194 -0
  111. data/gems/e11y-devtools/frontend/public/mocks/v1/traces/f541b87405c9a54819b18ebe529f6419/events.json +194 -0
  112. data/gems/e11y-devtools/frontend/scripts/generate_mocks.rb +397 -0
  113. data/gems/e11y-devtools/frontend/src/App.svelte +827 -0
  114. data/gems/e11y-devtools/frontend/src/components/Fab.svelte +19 -0
  115. data/gems/e11y-devtools/frontend/src/components/FilterBar.svelte +38 -0
  116. data/gems/e11y-devtools/frontend/src/components/FullscreenPanel.svelte +82 -0
  117. data/gems/e11y-devtools/frontend/src/components/InteractionsTimeline.svelte +264 -0
  118. data/gems/e11y-devtools/frontend/src/components/RecentHistogram.svelte +354 -0
  119. data/gems/e11y-devtools/frontend/src/lib/api.ts +37 -0
  120. data/gems/e11y-devtools/frontend/src/lib/eventIdentity.ts +12 -0
  121. data/gems/e11y-devtools/frontend/src/lib/format.ts +37 -0
  122. data/gems/e11y-devtools/frontend/src/lib/listFilter.ts +43 -0
  123. data/gems/e11y-devtools/frontend/src/lib/recentVolume.ts +80 -0
  124. data/gems/e11y-devtools/frontend/src/lib/router.ts +12 -0
  125. data/gems/e11y-devtools/frontend/src/lib/transitions.ts +34 -0
  126. data/gems/e11y-devtools/frontend/src/lib/viewportOrigin.ts +25 -0
  127. data/gems/e11y-devtools/frontend/src/main.ts +8 -0
  128. data/gems/e11y-devtools/frontend/src/overlay-entry.ts +24 -0
  129. data/gems/e11y-devtools/frontend/src/overlay.css +1080 -0
  130. data/gems/e11y-devtools/frontend/svelte.config.js +2 -0
  131. data/gems/e11y-devtools/frontend/test_puppeteer.js +41 -0
  132. data/gems/e11y-devtools/frontend/test_scale.js +3 -0
  133. data/gems/e11y-devtools/frontend/tsconfig.app.json +21 -0
  134. data/gems/e11y-devtools/frontend/tsconfig.json +7 -0
  135. data/gems/e11y-devtools/frontend/tsconfig.node.json +26 -0
  136. data/gems/e11y-devtools/frontend/vite.config.ts +36 -0
  137. data/gems/e11y-devtools/lib/e11y/devtools/mcp/server.rb +96 -0
  138. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tool_base.rb +25 -0
  139. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/clear.rb +31 -0
  140. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/errors.rb +35 -0
  141. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/event_detail.rb +33 -0
  142. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/events_by_trace.rb +33 -0
  143. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/interactions.rb +40 -0
  144. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/recent_events.rb +34 -0
  145. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/search.rb +34 -0
  146. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/stats.rb +30 -0
  147. data/gems/e11y-devtools/lib/e11y/devtools/overlay/assets/overlay.js +20 -0
  148. data/gems/e11y-devtools/lib/e11y/devtools/overlay/controller.rb +94 -0
  149. data/gems/e11y-devtools/lib/e11y/devtools/overlay/engine.rb +26 -0
  150. data/gems/e11y-devtools/lib/e11y/devtools/overlay/middleware.rb +80 -0
  151. data/gems/e11y-devtools/lib/e11y/devtools/overlay/rails_controller.rb +67 -0
  152. data/gems/e11y-devtools/lib/e11y/devtools/tui/app.rb +262 -0
  153. data/gems/e11y-devtools/lib/e11y/devtools/tui/grouping.rb +66 -0
  154. data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/event_detail.rb +62 -0
  155. data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/event_list.rb +70 -0
  156. data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/interaction_list.rb +47 -0
  157. data/gems/e11y-devtools/lib/e11y/devtools/version.rb +8 -0
  158. data/gems/e11y-devtools/lib/e11y/devtools.rb +13 -0
  159. data/gems/e11y-devtools/spec/e11y/devtools/mcp/tools_spec.rb +107 -0
  160. data/gems/e11y-devtools/spec/e11y/devtools/overlay/controller_spec.rb +91 -0
  161. data/gems/e11y-devtools/spec/e11y/devtools/overlay/middleware_spec.rb +46 -0
  162. data/gems/e11y-devtools/spec/e11y/devtools/tui/app_spec.rb +85 -0
  163. data/gems/e11y-devtools/spec/e11y/devtools/tui/grouping_spec.rb +64 -0
  164. data/gems/e11y-devtools/spec/spec_helper.rb +5 -0
  165. data/gems/e11y-devtools/spec/tui/widgets/event_list_spec.rb +44 -0
  166. data/gems/e11y-devtools/spec/tui/widgets/interaction_list_spec.rb +62 -0
  167. data/lib/e11y/adapters/audit_encrypted.rb +53 -11
  168. data/lib/e11y/adapters/base.rb +33 -34
  169. data/lib/e11y/adapters/dev_log/file_store.rb +143 -0
  170. data/lib/e11y/adapters/dev_log/query.rb +219 -0
  171. data/lib/e11y/adapters/dev_log.rb +118 -0
  172. data/lib/e11y/adapters/file.rb +3 -6
  173. data/lib/e11y/adapters/in_memory.rb +52 -5
  174. data/lib/e11y/adapters/in_memory_test.rb +29 -0
  175. data/lib/e11y/adapters/loki.rb +58 -23
  176. data/lib/e11y/adapters/null.rb +82 -0
  177. data/lib/e11y/adapters/opentelemetry_collector.rb +183 -0
  178. data/lib/e11y/adapters/otel_logs.rb +136 -23
  179. data/lib/e11y/adapters/sentry.rb +4 -7
  180. data/lib/e11y/adapters/stdout.rb +73 -7
  181. data/lib/e11y/adapters/yabeda.rb +153 -29
  182. data/lib/e11y/buffers/adaptive_buffer.rb +3 -17
  183. data/lib/e11y/buffers/{request_scoped_buffer.rb → ephemeral_buffer.rb} +72 -58
  184. data/lib/e11y/buffers/ring_buffer.rb +3 -16
  185. data/lib/e11y/configuration.rb +272 -0
  186. data/lib/e11y/console.rb +10 -17
  187. data/lib/e11y/current.rb +53 -1
  188. data/lib/e11y/debug/pipeline_inspector.rb +96 -0
  189. data/lib/e11y/documentation/generator.rb +48 -0
  190. data/lib/e11y/event/base.rb +176 -82
  191. data/lib/e11y/event/value_sampling_config.rb +1 -5
  192. data/lib/e11y/events/rails/database/query.rb +1 -4
  193. data/lib/e11y/events/rails/job/failed.rb +2 -0
  194. data/lib/e11y/instruments/active_job.rb +44 -12
  195. data/lib/e11y/instruments/rails_instrumentation.rb +49 -24
  196. data/lib/e11y/instruments/sidekiq.rb +135 -31
  197. data/lib/e11y/linters/base.rb +11 -0
  198. data/lib/e11y/linters/pii/pii_declaration_linter.rb +120 -0
  199. data/lib/e11y/linters/slo/config_consistency_linter.rb +76 -0
  200. data/lib/e11y/linters/slo/explicit_declaration_linter.rb +36 -0
  201. data/lib/e11y/linters/slo/slo_status_from_linter.rb +41 -0
  202. data/lib/e11y/logger/bridge.rb +26 -7
  203. data/lib/e11y/metrics/cardinality_protection.rb +10 -15
  204. data/lib/e11y/metrics/cardinality_tracker.rb +16 -6
  205. data/lib/e11y/metrics/registry.rb +3 -5
  206. data/lib/e11y/metrics/test_backend.rb +62 -0
  207. data/lib/e11y/metrics.rb +56 -10
  208. data/lib/e11y/middleware/adapter_resolver.rb +40 -0
  209. data/lib/e11y/middleware/audit_signing.rb +43 -6
  210. data/lib/e11y/middleware/baggage_protection.rb +75 -0
  211. data/lib/e11y/middleware/dev_log_source.rb +24 -0
  212. data/lib/e11y/middleware/event_slo.rb +23 -9
  213. data/lib/e11y/middleware/otel_span.rb +23 -0
  214. data/lib/e11y/middleware/pii_filter.rb +104 -75
  215. data/lib/e11y/middleware/rate_limiting.rb +54 -27
  216. data/lib/e11y/middleware/request.rb +70 -23
  217. data/lib/e11y/middleware/routing.rb +78 -21
  218. data/lib/e11y/middleware/sampling.rb +66 -17
  219. data/lib/e11y/middleware/self_monitoring_emit.rb +39 -0
  220. data/lib/e11y/middleware/trace_context.rb +45 -10
  221. data/lib/e11y/middleware/track_latency.rb +34 -0
  222. data/lib/e11y/middleware/validation.rb +7 -16
  223. data/lib/e11y/middleware/versioning.rb +26 -22
  224. data/lib/e11y/opentelemetry/semantic_conventions.rb +109 -0
  225. data/lib/e11y/opentelemetry/span_creator.rb +142 -0
  226. data/lib/e11y/pii/patterns.rb +12 -1
  227. data/lib/e11y/pipeline/builder.rb +4 -4
  228. data/lib/e11y/presets/audit_event.rb +13 -2
  229. data/lib/e11y/railtie.rb +52 -14
  230. data/lib/e11y/registry.rb +306 -0
  231. data/lib/e11y/reliability/circuit_breaker.rb +19 -21
  232. data/lib/e11y/reliability/dlq/base.rb +71 -0
  233. data/lib/e11y/reliability/dlq/file_adapter.rb +301 -0
  234. data/lib/e11y/reliability/dlq/file_storage.rb +63 -34
  235. data/lib/e11y/reliability/dlq/filter.rb +37 -54
  236. data/lib/e11y/reliability/retry_handler.rb +26 -29
  237. data/lib/e11y/reliability/retry_rate_limiter.rb +3 -11
  238. data/lib/e11y/sampling/error_spike_detector.rb +0 -2
  239. data/lib/e11y/sampling/load_monitor.rb +5 -9
  240. data/lib/e11y/sampling/stratified_tracker.rb +18 -0
  241. data/lib/e11y/self_monitoring/buffer_monitor.rb +2 -0
  242. data/lib/e11y/self_monitoring/performance_monitor.rb +19 -61
  243. data/lib/e11y/self_monitoring/reliability_monitor.rb +4 -74
  244. data/lib/e11y/slo/config_loader.rb +40 -0
  245. data/lib/e11y/slo/config_validator.rb +58 -0
  246. data/lib/e11y/slo/dashboard_generator.rb +122 -0
  247. data/lib/e11y/slo/event_driven.rb +8 -0
  248. data/lib/e11y/slo/tracker.rb +31 -4
  249. data/lib/e11y/testing/have_tracked_event_matcher.rb +190 -0
  250. data/lib/e11y/testing/rspec_matchers.rb +21 -0
  251. data/lib/e11y/testing/snapshot_matcher.rb +86 -0
  252. data/lib/e11y/trace_context/sampler.rb +35 -0
  253. data/lib/e11y/tracing/faraday_middleware.rb +31 -0
  254. data/lib/e11y/tracing/net_http_patch.rb +33 -0
  255. data/lib/e11y/tracing/propagator.rb +144 -0
  256. data/lib/e11y/tracing.rb +47 -0
  257. data/lib/e11y/version.rb +1 -1
  258. data/lib/e11y/versioning/version_extractor.rb +32 -0
  259. data/lib/e11y.rb +123 -266
  260. data/lib/generators/e11y/event/event_generator.rb +22 -0
  261. data/lib/generators/e11y/event/templates/event.rb.tt +16 -0
  262. data/lib/generators/e11y/grafana_dashboard/grafana_dashboard_generator.rb +30 -0
  263. data/lib/generators/e11y/grafana_dashboard/templates/e11y_dashboard.json +81 -0
  264. data/lib/generators/e11y/install/install_generator.rb +34 -0
  265. data/lib/generators/e11y/install/templates/e11y.rb +239 -0
  266. data/lib/generators/e11y/prometheus_alerts/prometheus_alerts_generator.rb +29 -0
  267. data/lib/generators/e11y/prometheus_alerts/templates/e11y_alerts.yml +28 -0
  268. data/lib/tasks/e11y_docs.rake +30 -0
  269. data/lib/tasks/e11y_events.rake +71 -0
  270. data/lib/tasks/e11y_lint.rake +91 -0
  271. data/lib/tasks/e11y_slo.rake +29 -0
  272. metadata +186 -39
  273. data/docs/ADR-003-slo-observability.md +0 -3337
  274. data/docs/ADR-010-developer-experience.md +0 -2166
  275. data/docs/API-REFERENCE-L28.md +0 -914
  276. data/docs/COMPREHENSIVE-CONFIGURATION.md +0 -2366
  277. data/docs/CONTRIBUTING.md +0 -312
  278. data/docs/IMPLEMENTATION_NOTES.md +0 -2804
  279. data/docs/IMPLEMENTATION_PLAN.md +0 -1971
  280. data/docs/IMPLEMENTATION_PLAN_ARCHITECTURE.md +0 -586
  281. data/docs/PLAN.md +0 -148
  282. data/docs/README.md +0 -296
  283. data/docs/design/00-memory-optimization.md +0 -593
  284. data/docs/guides/MIGRATION-L27-L28.md +0 -692
  285. data/docs/guides/PERFORMANCE-BENCHMARKS.md +0 -434
  286. data/docs/guides/README.md +0 -44
  287. data/docs/use_cases/UC-003-pattern-based-metrics.md +0 -1627
  288. data/lib/e11y/adapters/registry.rb +0 -141
@@ -65,7 +65,7 @@ end
65
65
 
66
66
  ## 🎯 Features
67
67
 
68
- > **Implementation:** See [ADR-007: OpenTelemetry Integration](../ADR-007-opentelemetry-integration.md) for complete architecture, including [Section 3: OTel Collector Adapter](../ADR-007-opentelemetry-integration.md#3-otel-collector-adapter), [Section 4: Semantic Conventions](../ADR-007-opentelemetry-integration.md#4-semantic-conventions), and [Section 5: Logs Signal Export](../ADR-007-opentelemetry-integration.md#5-logs-signal-export).
68
+ > **Implementation:** See [ADR-007: OpenTelemetry Integration](../architecture/ADR-007-opentelemetry-integration.md) for complete architecture, including [Section 3: OTel Collector Adapter](../architecture/ADR-007-opentelemetry-integration.md#3-otel-collector-adapter), [Section 4: Semantic Conventions](../architecture/ADR-007-opentelemetry-integration.md#4-semantic-conventions), and [Section 5: Logs Signal Export](../architecture/ADR-007-opentelemetry-integration.md#5-logs-signal-export).
69
69
 
70
70
  ### 1. OpenTelemetry Collector Adapter
71
71
 
@@ -73,28 +73,11 @@ end
73
73
  ```ruby
74
74
  # config/initializers/e11y.rb
75
75
  E11y.configure do |config|
76
- config.adapters << E11y::Adapters::OpenTelemetryCollectorAdapter.new(
76
+ config.adapters[:otel] = E11y::Adapters::OpenTelemetryCollector.new(
77
77
  endpoint: ENV['OTEL_EXPORTER_OTLP_ENDPOINT'] || 'http://localhost:4318',
78
- protocol: :http, # :http or :grpc
79
- headers: {
80
- 'X-API-Key' => ENV['OTEL_API_KEY']
81
- },
82
-
83
- # Signal types
84
- export_logs: true, # E11y events → OTel Logs Signal
85
- export_traces: true, # Spans from events → OTel Traces
86
- export_metrics: false, # Use Yabeda for metrics (better)
87
-
88
- # Batching
89
- batch_size: 100,
90
- flush_interval: 10.seconds,
91
-
92
- # Compression
93
- compression: :gzip,
94
-
95
- # Retry
96
- retry_enabled: true,
97
- max_retries: 3
78
+ service_name: 'my-app',
79
+ headers: { 'X-API-Key' => ENV['OTEL_API_KEY'] },
80
+ compress: true # default, gzip on HTTP body
98
81
  )
99
82
  end
100
83
 
@@ -103,14 +86,14 @@ end
103
86
  # ├─→ Jaeger (traces)
104
87
  # ├─→ Loki (logs)
105
88
  # ├─→ Prometheus (metrics)
106
- # └─→ S3 (archive)
89
+ # └─→ Object storage (archive, via OTel exporter)
107
90
  ```
108
91
 
109
92
  ---
110
93
 
111
94
  ### 2. Semantic Conventions Mapping
112
95
 
113
- > **Implementation:** See [ADR-007 Section 4: Semantic Conventions](../ADR-007-opentelemetry-integration.md#4-semantic-conventions) for automatic field mapping across HTTP, DB, RPC, Messaging, and Exception patterns.
96
+ > **Implementation:** See [ADR-007 Section 4: Semantic Conventions](../architecture/ADR-007-opentelemetry-integration.md#4-semantic-conventions) for automatic field mapping across HTTP, DB, RPC, Messaging, and Exception patterns.
114
97
 
115
98
  **Automatic field mapping to OTel standards:**
116
99
  ```ruby
@@ -171,7 +154,7 @@ Events::HttpRequest.track(
171
154
 
172
155
  ### 3. Automatic Span Creation
173
156
 
174
- > **Implementation:** See [ADR-007 Section 6: Traces Signal Export](../ADR-007-opentelemetry-integration.md#6-traces-signal-export) for automatic span creation rules and parent-child relationships.
157
+ > **Implementation:** See [ADR-007 Section 6: Traces Signal Export](../architecture/ADR-007-opentelemetry-integration.md#6-traces-signal-export) for automatic span creation rules and parent-child relationships.
175
158
 
176
159
  **Create spans from E11y events:**
177
160
  ```ruby
@@ -207,7 +190,7 @@ Events::OrderProcessingStarted.track(
207
190
 
208
191
  ### 4. W3C Trace Context Integration
209
192
 
210
- > **Implementation:** See [ADR-007 Section 8: Trace Context Integration](../ADR-007-opentelemetry-integration.md#8-trace-context-integration) for OTel SDK as primary trace context source.
193
+ > **Implementation:** See [ADR-007 Section 8: Trace Context Integration](../architecture/ADR-007-opentelemetry-integration.md#8-trace-context-integration) for OTel SDK as primary trace context source.
211
194
 
212
195
  **Automatic trace context from OpenTelemetry SDK:**
213
196
  ```ruby
@@ -240,7 +223,7 @@ Events::OrderCreated.track(order_id: '123')
240
223
 
241
224
  ### 5. OTel Logs Signal Export
242
225
 
243
- > **Implementation:** See [ADR-007 Section 5: Logs Signal Export](../ADR-007-opentelemetry-integration.md#5-logs-signal-export) for OTLP JSON format and trace correlation details.
226
+ > **Implementation:** See [ADR-007 Section 5: Logs Signal Export](../architecture/ADR-007-opentelemetry-integration.md#5-logs-signal-export) for OTLP JSON format and trace correlation details.
244
227
 
245
228
  **Export E11y events as OpenTelemetry Logs:**
246
229
  ```ruby
@@ -297,7 +280,7 @@ Events::OrderCreated.track(order_id: '123')
297
280
  ### 6. Baggage PII Protection (C08 Resolution) ⚠️ CRITICAL
298
281
 
299
282
  > **⚠️ CRITICAL: C08 Conflict Resolution - PII Leaking via OpenTelemetry Baggage**
300
- > **See:** [ADR-006 Section 5.5](../ADR-006-security-compliance.md#55-opentelemetry-baggage-pii-protection-c08-resolution--critical) for detailed architecture and GDPR compliance rationale.
283
+ > **See:** [ADR-006 Section 5.5](../architecture/ADR-006-security-compliance.md#55-opentelemetry-baggage-pii-protection-c08-resolution--critical) for detailed architecture and GDPR compliance rationale.
301
284
  > **Problem:** OpenTelemetry Baggage propagates data via HTTP headers (`baggage: key1=value1,key2=value2`), bypassing E11y's PII filtering. If a developer accidentally adds PII to baggage, it leaks across all services.
302
285
  > **Solution:** Block ALL baggage keys by default, allow ONLY safe keys via allowlist.
303
286
 
@@ -330,33 +313,23 @@ E11y blocks ALL baggage keys by default, allowing ONLY safe keys (no PII):
330
313
  ```ruby
331
314
  # config/initializers/e11y.rb
332
315
  E11y.configure do |config|
333
- config.security.baggage_protection do
334
- enabled true # ✅ CRITICAL: Always enable in production
335
-
336
- # Allowlist: ONLY these keys are safe
337
- allowed_keys [
338
- 'trace_id', # ✅ Safe: Correlation ID
339
- 'span_id', # ✅ Safe: Trace context
340
- 'environment', # ✅ Safe: Deployment context
341
- 'version', # ✅ Safe: Service version
342
- 'service_name', # ✅ Safe: Service identifier
343
- 'request_id', # Safe: Request identifier
344
- # Custom safe keys (no PII!):
345
- 'feature_flag_id', # ✅ Safe: Feature flag name
346
- 'ab_test_variant' # ✅ Safe: A/B test group
347
- ]
348
-
349
- # Block mode: What happens when PII detected?
350
- block_mode :silent # Options: :silent (log), :warn (log+warn), :raise (exception)
351
-
352
- # Monitoring: Track violations
353
- on_blocked_key do |key, value, caller_location|
354
- Yabeda.e11y_baggage_pii_blocked.increment(
355
- key: key,
356
- service: ENV['SERVICE_NAME']
357
- )
358
- end
359
- end
316
+ config.security_baggage_protection_enabled = true # ✅ CRITICAL: Always enable in production
317
+
318
+ # Allowlist: ONLY these keys are safe
319
+ config.security_baggage_protection_allowed_keys = [
320
+ 'trace_id', # ✅ Safe: Correlation ID
321
+ 'span_id', # ✅ Safe: Trace context
322
+ 'environment', # ✅ Safe: Deployment context
323
+ 'version', # ✅ Safe: Service version
324
+ 'service_name', # ✅ Safe: Service identifier
325
+ 'request_id', # ✅ Safe: Request identifier
326
+ # Custom safe keys (no PII!):
327
+ 'feature_flag_id', # Safe: Feature flag name
328
+ 'ab_test_variant' # ✅ Safe: A/B test group
329
+ ]
330
+
331
+ # Block mode: What happens when PII detected?
332
+ config.security_baggage_protection_block_mode = :silent # Options: :silent (log), :warn (log+warn), :raise (exception)
360
333
  end
361
334
  ```
362
335
 
@@ -421,11 +394,9 @@ Fail fast in non-production environments:
421
394
  ```ruby
422
395
  # config/environments/development.rb
423
396
  E11y.configure do |config|
424
- config.security.baggage_protection do
425
- enabled true
426
- block_mode :raise # RAISE exception on blocked keys (fail fast)
427
- allowed_keys E11y::Middleware::BaggageProtection::ALLOWED_KEYS
428
- end
397
+ config.security_baggage_protection_enabled = true
398
+ config.security_baggage_protection_block_mode = :raise # ← RAISE exception on blocked keys (fail fast)
399
+ config.security_baggage_protection_allowed_keys = E11y::BAGGAGE_PROTECTION_DEFAULT_ALLOWED_KEYS
429
400
  end
430
401
 
431
402
  # Developer tries to set PII:
@@ -531,18 +502,14 @@ exporters:
531
502
  prometheus:
532
503
  endpoint: 0.0.0.0:8889
533
504
 
534
- # Archive S3
535
- s3:
536
- region: us-east-1
537
- bucket: telemetry-archive
538
- prefix: logs/
505
+ # Archive: OTel Collector can export to object storage (add exporter config as needed)
539
506
 
540
507
  service:
541
508
  pipelines:
542
509
  logs:
543
510
  receivers: [otlp]
544
511
  processors: [batch, resource, filter]
545
- exporters: [loki, s3]
512
+ exporters: [loki]
546
513
 
547
514
  traces:
548
515
  receivers: [otlp]
@@ -558,11 +525,9 @@ service:
558
525
  ```ruby
559
526
  # config/initializers/e11y.rb
560
527
  E11y.configure do |config|
561
- config.adapters << E11y::Adapters::OpenTelemetryCollectorAdapter.new(
528
+ config.adapters[:otel] = E11y::Adapters::OpenTelemetryCollector.new(
562
529
  endpoint: 'http://otel-collector:4318',
563
- protocol: :http,
564
- export_logs: true,
565
- export_traces: true
530
+ service_name: 'my-app'
566
531
  )
567
532
  end
568
533
 
@@ -742,14 +707,11 @@ end
742
707
  # config/initializers/e11y.rb
743
708
  E11y.configure do |config|
744
709
  # Single adapter: OTel Collector
745
- config.adapters = [
746
- E11y::Adapters::OpenTelemetryCollectorAdapter.new(
747
- endpoint: 'http://otel-collector:4318',
748
- export_logs: true,
749
- export_traces: true
750
- )
751
- ]
752
-
710
+ config.adapters[:otel] = E11y::Adapters::OpenTelemetryCollector.new(
711
+ endpoint: 'http://otel-collector:4318',
712
+ service_name: 'my-app'
713
+ )
714
+
753
715
  # OTel Collector handles routing to multiple backends!
754
716
  # No need for multiple E11y adapters
755
717
  end
@@ -757,7 +719,7 @@ end
757
719
  # OTel Collector routes to:
758
720
  # - Loki (logs, last 30 days)
759
721
  # - Jaeger (traces, last 7 days)
760
- # - S3 (archive, long-term storage)
722
+ # - Object storage (archive, long-term; OTel exporter)
761
723
  # - Prometheus (metrics via remote write)
762
724
 
763
725
  # Benefits:
@@ -931,7 +893,7 @@ end
931
893
  ┌─────────────┐ │ ├─→ Loki (logs)
932
894
  │ Sidekiq │─┘ ├─→ Jaeger (traces)
933
895
  └─────────────┘ ├─→ Prometheus (metrics)
934
- ├─→ S3 (archive)
896
+ ├─→ Object storage (archive)
935
897
  └─→ Datadog (optional)
936
898
  ```
937
899
 
@@ -1048,11 +1010,10 @@ end
1048
1010
  **1. Use OTel Collector in production**
1049
1011
  ```ruby
1050
1012
  # ✅ GOOD: Central pipeline
1051
- config.adapters = [
1052
- E11y::Adapters::OpenTelemetryCollectorAdapter.new(
1053
- endpoint: 'http://otel-collector:4318'
1054
- )
1055
- ]
1013
+ config.adapters[:otel] = E11y::Adapters::OpenTelemetryCollector.new(
1014
+ endpoint: 'http://otel-collector:4318',
1015
+ service_name: 'my-app'
1016
+ )
1056
1017
 
1057
1018
  # OTel Collector handles:
1058
1019
  # - Sampling
@@ -1094,13 +1055,14 @@ end
1094
1055
  config.adapters = [
1095
1056
  E11y::Adapters::JaegerAdapter.new(...),
1096
1057
  E11y::Adapters::LokiAdapter.new(...),
1097
- E11y::Adapters::S3Adapter.new(...)
1058
+ E11y::Adapters::FileAdapter.new(...) # Direct to file (bypasses OTel routing)
1098
1059
  ]
1099
1060
 
1100
1061
  # ✅ GOOD: Through OTel Collector
1101
- config.adapters = [
1102
- E11y::Adapters::OpenTelemetryCollectorAdapter.new(...)
1103
- ]
1062
+ config.adapters[:otel] = E11y::Adapters::OpenTelemetryCollector.new(
1063
+ endpoint: ENV['OTEL_EXPORTER_OTLP_ENDPOINT'],
1064
+ service_name: 'my-app'
1065
+ )
1104
1066
  ```
1105
1067
 
1106
1068
  **2. Don't use custom field names**
@@ -60,7 +60,7 @@ Events::OrderShipping.track(order_id: '789', tracking: 'TRACK123')
60
60
 
61
61
  ## 🎯 Features
62
62
 
63
- > **Implementation:** See [ADR-005: Tracing Context](../ADR-005-tracing-context.md) for complete architecture, including [Section 5: W3C Trace Context](../ADR-005-tracing-context.md#5-w3c-trace-context), [Section 6.1: HTTP Propagator](../ADR-005-tracing-context.md#61-http-propagator-outgoing-requests), and [Section 8: Context Inheritance](../ADR-005-tracing-context.md#8-context-inheritance-thread-fiber-support).
63
+ > **Implementation:** See [ADR-005: Tracing Context](../architecture/ADR-005-tracing-context.md) for complete architecture, including [Section 5: W3C Trace Context](../architecture/ADR-005-tracing-context.md#5-w3c-trace-context), [Section 6.1: HTTP Propagator](../architecture/ADR-005-tracing-context.md#61-http-propagator-outgoing-requests), and [Section 8: Context Inheritance](../architecture/ADR-005-tracing-context.md#8-context-inheritance-thread-fiber-support).
64
64
 
65
65
  ### 1. Automatic W3C Trace Context Propagation
66
66
 
@@ -206,7 +206,7 @@ end
206
206
 
207
207
  ### 3. Background Job Trace Propagation (C17 Resolution) ⚠️
208
208
 
209
- > **Implementation:** See [ADR-005 Section 8.3: Background Job Tracing Strategy](../ADR-005-tracing-context.md#83-background-job-tracing-strategy-c17-resolution) for the hybrid tracing model.
209
+ > **Implementation:** See [ADR-005 Section 8.3: Background Job Tracing Strategy](../architecture/ADR-005-tracing-context.md#83-background-job-tracing-strategy-c17-resolution) for the hybrid tracing model.
210
210
 
211
211
  **Hybrid Tracing Model (New Trace + Parent Link):**
212
212
  ```ruby
@@ -279,7 +279,7 @@ end
279
279
  3. **Trace clarity:** Separate timelines for sync (request) vs async (job) operations
280
280
  4. **Link preserved:** `parent_trace_id` allows reconstructing full flow
281
281
 
282
- See [ADR-005 §8.3](../ADR-005-tracing-context.md#83-background-job-tracing-strategy-c17-resolution) for detailed rationale.
282
+ See [ADR-005 §8.3](../architecture/ADR-005-tracing-context.md#83-background-job-tracing-strategy-c17-resolution) for detailed rationale.
283
283
 
284
284
  **Visual Diagram: Request Trace → Job Trace (with parent link)**
285
285
 
@@ -356,47 +356,23 @@ ORDER BY timestamp ASC;
356
356
 
357
357
  ### 4. Cross-Service Latency Measurement
358
358
 
359
- **Automatic service-to-service timing:**
360
- ```ruby
361
- # config/initializers/e11y.rb
362
- E11y.configure do |config|
363
- config.distributed_tracing do
364
- # Measure cross-service latency
365
- measure_service_latency true
366
-
367
- # Track service hops
368
- track_service_hops true
369
- end
370
- end
359
+ **Service-to-service timing** is not switched on by a `config.distributed_tracing` block (that DSL does not exist). Model it with **event payloads and your metrics stack** (timestamps, `trace_id`, PromQL / LogQL), or extend tracing per [ADR-005](../architecture/ADR-005-tracing-context.md).
371
360
 
361
+ ```ruby
362
+ # Example only: emit your own correlation fields from each service
372
363
  # Service A: API Gateway
373
- Events::OrderCreated.track(
374
- order_id: '789',
375
- timestamp_sent: Time.current # Auto-added!
376
- )
377
-
364
+ Events::OrderCreated.track(order_id: "789", timestamp_sent: Time.current.iso8601)
378
365
  # Service B: Payment Service
379
- Events::PaymentReceived.track(
380
- order_id: '789',
381
- timestamp_received: Time.current # Auto-added!
382
- )
366
+ Events::PaymentReceived.track(order_id: "789", timestamp_received: Time.current.iso8601)
383
367
 
384
- # E11y automatically calculates:
385
- # - Network latency: timestamp_received - timestamp_sent
386
- # - Service hop count: 1 (API → Payment)
387
- # - Total trace duration: last event - first event
388
-
389
- # Metrics (automatic!):
390
- # e11y_service_to_service_latency_ms{from="api",to="payment"} = 50
391
- # e11y_service_hops{trace_id="abc-123"} = 3
392
- # e11y_trace_duration_ms{trace_id="abc-123"} = 5020
368
+ # You derive latency / hop counts in Loki, Prometheus, or SQL — not from a magic config block.
393
369
  ```
394
370
 
395
371
  ---
396
372
 
397
373
  ### 5. Service Mesh Integration
398
374
 
399
- > **Implementation:** See [ADR-005 Section 5.3: HTTP Header Extraction](../ADR-005-tracing-context.md#53-http-header-extraction-w3c-legacy-headers) for W3C standard header support enabling service mesh compatibility.
375
+ > **Implementation:** See [ADR-005 Section 5.3: HTTP Header Extraction](../architecture/ADR-005-tracing-context.md#53-http-header-extraction-w3c-legacy-headers) for W3C standard header support enabling service mesh compatibility.
400
376
 
401
377
  **Automatic integration with Istio/Linkerd:**
402
378
  ```ruby
@@ -707,7 +683,7 @@ class OrdersController < ApplicationController
707
683
  key: order.id,
708
684
  value: order.to_json,
709
685
  headers: {
710
- 'traceparent' => E11y::TraceContext.current.to_traceparent
686
+ "traceparent" => E11y::Tracing::Propagator.build_traceparent
711
687
  # ↑ W3C Trace Context header in Kafka message!
712
688
  }
713
689
  )
@@ -777,127 +753,24 @@ end
777
753
 
778
754
  ## 🔧 Configuration
779
755
 
780
- ### Full Configuration
756
+ Older revisions of this document showed nested `config.distributed_tracing do`, `background_jobs do`, `message_queues do`, and similar blocks—**that DSL is not implemented** in the current gem. Do not paste those snippets into an app.
757
+
758
+ ### What exists today
781
759
 
782
760
  ```ruby
783
761
  # config/initializers/e11y.rb
784
762
  E11y.configure do |config|
785
- config.distributed_tracing do
786
- # === TRACE PROPAGATION ===
787
- propagation do
788
- # W3C Trace Context (standard)
789
- w3c_trace_context enabled: true
790
-
791
- # B3 (Zipkin)
792
- b3 enabled: true, single_header: true
793
-
794
- # Jaeger
795
- jaeger enabled: false
796
-
797
- # Datadog
798
- datadog enabled: false
799
- end
800
-
801
- # === HTTP CLIENTS ===
802
- http_clients do
803
- # Faraday
804
- faraday do
805
- enabled true
806
- inject_headers true
807
- extract_headers true
808
- end
809
-
810
- # Net::HTTP
811
- net_http do
812
- enabled true
813
- inject_headers true
814
- end
815
-
816
- # HTTParty
817
- httparty do
818
- enabled true
819
- inject_headers true
820
- end
821
-
822
- # RestClient
823
- rest_client do
824
- enabled true
825
- inject_headers true
826
- end
827
- end
828
-
829
- # === BACKGROUND JOBS ===
830
- background_jobs do
831
- # Sidekiq
832
- sidekiq do
833
- enabled true
834
- propagate_trace_context true
835
- store_in_job_metadata true
836
- end
837
-
838
- # ActiveJob
839
- active_job do
840
- enabled true
841
- propagate_trace_context true
842
- end
843
- end
844
-
845
- # === MESSAGE QUEUES ===
846
- message_queues do
847
- # Kafka
848
- kafka do
849
- enabled true
850
- inject_headers true
851
- extract_headers true
852
- header_name 'traceparent'
853
- end
854
-
855
- # RabbitMQ
856
- rabbitmq do
857
- enabled true
858
- inject_headers true
859
- extract_headers true
860
- end
861
-
862
- # AWS SQS
863
- sqs do
864
- enabled true
865
- use_message_attributes true
866
- end
867
- end
868
-
869
- # === SERVICE MESH ===
870
- service_mesh do
871
- auto_detect true
872
-
873
- # Istio
874
- istio do
875
- enabled true
876
- use_headers true
877
- end
878
-
879
- # Linkerd
880
- linkerd do
881
- enabled true
882
- use_headers true
883
- end
884
- end
885
-
886
- # === METRICS ===
887
- metrics do
888
- # Service-to-service latency
889
- measure_service_latency true
890
-
891
- # Service hops
892
- track_service_hops true
893
-
894
- # Trace duration
895
- measure_trace_duration true
896
- end
897
- end
763
+ config.rails_instrumentation_enabled = true
764
+ config.sidekiq_enabled = true
765
+ config.active_job_enabled = true
766
+
767
+ # Optional outgoing Net::HTTP trace propagation (see Railtie + lib/e11y/tracing/)
768
+ config.enable_http_tracing = true
898
769
  end
899
770
  ```
900
771
 
772
+ W3C `traceparent` on the **inbound** request is handled by `E11y::Middleware::Request`. Multi-protocol propagation (Faraday-only, Kafka, mesh) is described in [ADR-005](../architecture/ADR-005-tracing-context.md) and [DISTRIBUTED_TRACING.md](../DISTRIBUTED_TRACING.md)—implement or enable per what is actually merged in your `e11y` version.
773
+
901
774
  ---
902
775
 
903
776
  ## 📊 Monitoring Distributed Traces
@@ -936,15 +809,7 @@ histogram_quantile(0.95,
936
809
 
937
810
  ### ✅ DO
938
811
 
939
- **1. Use W3C Trace Context (standard)**
940
- ```ruby
941
- # ✅ GOOD: Industry standard
942
- config.distributed_tracing do
943
- propagation do
944
- w3c_trace_context enabled: true
945
- end
946
- end
947
- ```
812
+ **1. Use W3C Trace Context (standard)** — inbound requests are parsed in `E11y::Middleware::Request` when clients send `traceparent`; propagate the same header on outgoing HTTP where supported (`enable_http_tracing` for Net::HTTP, or your client middleware).
948
813
 
949
814
  **2. Mark service boundaries**
950
815
  ```ruby
@@ -962,11 +827,10 @@ end
962
827
 
963
828
  **3. Propagate context in async jobs**
964
829
  ```ruby
965
- # GOOD: Preserve trace_id in jobs
966
- config.background_jobs do
967
- sidekiq do
968
- propagate_trace_context true
969
- end
830
+ # Enable the shipped Sidekiq / Active Job integration (trace + metadata on jobs)
831
+ E11y.configure do |config|
832
+ config.sidekiq_enabled = true
833
+ config.active_job_enabled = true
970
834
  end
971
835
  ```
972
836
 
@@ -975,20 +839,8 @@ end
975
839
  ### ❌ DON'T
976
840
 
977
841
  **1. Don't use different context formats**
978
- ```ruby
979
- # BAD: Mixed formats (incompatible!)
980
- # Service A: W3C Trace Context
981
- # Service B: B3 format
982
- # Service C: Custom format
983
- # → Can't correlate!
984
-
985
- # ✅ GOOD: Single format everywhere
986
- config.distributed_tracing do
987
- propagation do
988
- w3c_trace_context enabled: true # All services!
989
- end
990
- end
991
- ```
842
+
843
+ Mixing B3, vendor headers, and W3C in one system breaks correlation. Standardize on **W3C `traceparent`** wherever you control the client and server.
992
844
 
993
845
  **2. Don't forget message queue propagation**
994
846
  ```ruby
@@ -1001,7 +853,7 @@ KafkaProducer.publish(
1001
853
  topic: 'orders',
1002
854
  value: order.to_json,
1003
855
  headers: {
1004
- 'traceparent' => E11y::TraceContext.current.to_traceparent
856
+ "traceparent" => E11y::Tracing::Propagator.build_traceparent
1005
857
  }
1006
858
  )
1007
859
  ```