e11y 0.2.0 → 1.0.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 (230) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +130 -10
  3. data/CHANGELOG.md +56 -1
  4. data/CLAUDE.md +168 -0
  5. data/CONTRIBUTING.md +640 -0
  6. data/README.md +134 -702
  7. data/RELEASE.md +18 -3
  8. data/Rakefile +108 -29
  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 +29 -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} +35 -64
  30. data/docs/{ADR-002-metrics-yabeda.md → architecture/ADR-002-metrics-yabeda.md} +62 -236
  31. data/docs/{ADR-003-slo-observability.md → architecture/ADR-003-slo-observability.md} +27 -466
  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} +209 -339
  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} +41 -83
  40. data/docs/{ADR-013-reliability-error-handling.md → architecture/ADR-013-reliability-error-handling.md} +37 -12
  41. data/docs/{ADR-014-event-driven-slo.md → architecture/ADR-014-event-driven-slo.md} +12 -24
  42. data/docs/{ADR-015-middleware-order.md → architecture/ADR-015-middleware-order.md} +23 -41
  43. data/docs/{ADR-016-self-monitoring-slo.md → architecture/ADR-016-self-monitoring-slo.md} +52 -349
  44. data/docs/{ADR-017-multi-rails-compatibility.md → architecture/ADR-017-multi-rails-compatibility.md} +4 -11
  45. data/docs/architecture/ADR-018-memory-optimization.md +366 -0
  46. data/docs/{ADR-INDEX.md → architecture/ADR-INDEX.md} +11 -6
  47. data/docs/{00-ICP-AND-TIMELINE.md → prd/00-ICP-AND-TIMELINE.md} +6 -6
  48. data/docs/{01-SCALE-REQUIREMENTS.md → prd/01-SCALE-REQUIREMENTS.md} +6 -6
  49. data/docs/prd/01-overview-vision.md +19 -14
  50. data/docs/use_cases/README.md +22 -23
  51. data/docs/use_cases/UC-001-request-scoped-debug-buffering.md +50 -44
  52. data/docs/use_cases/UC-002-business-event-tracking.md +26 -95
  53. data/docs/use_cases/UC-003-event-metrics.md +66 -0
  54. data/docs/use_cases/UC-004-zero-config-slo-tracking.md +42 -101
  55. data/docs/use_cases/UC-005-sentry-integration.md +13 -15
  56. data/docs/use_cases/UC-006-trace-context-management.md +30 -28
  57. data/docs/use_cases/UC-007-pii-filtering.md +35 -87
  58. data/docs/use_cases/UC-008-opentelemetry-integration.md +51 -89
  59. data/docs/use_cases/UC-009-multi-service-tracing.md +4 -4
  60. data/docs/use_cases/UC-010-background-job-tracking.md +5 -5
  61. data/docs/use_cases/UC-011-rate-limiting.md +95 -168
  62. data/docs/use_cases/UC-012-audit-trail.md +21 -46
  63. data/docs/use_cases/UC-013-high-cardinality-protection.md +29 -167
  64. data/docs/use_cases/UC-014-adaptive-sampling.md +2 -2
  65. data/docs/use_cases/UC-015-cost-optimization.md +46 -99
  66. data/docs/use_cases/UC-016-rails-logger-migration.md +39 -213
  67. data/docs/use_cases/UC-017-local-development.md +203 -777
  68. data/docs/use_cases/UC-018-testing-events.md +3 -3
  69. data/docs/use_cases/UC-019-retention-based-routing.md +53 -106
  70. data/docs/use_cases/UC-020-event-versioning.md +8 -9
  71. data/docs/use_cases/UC-021-error-handling-retry-dlq.md +18 -22
  72. data/docs/use_cases/UC-022-event-registry.md +15 -21
  73. data/docs/use_cases/backlog.md +119 -87
  74. data/e11y.gemspec +2 -2
  75. data/gems/e11y-devtools/README.md +136 -0
  76. data/gems/e11y-devtools/config/routes.rb +8 -0
  77. data/gems/e11y-devtools/e11y-devtools.gemspec +25 -0
  78. data/gems/e11y-devtools/exe/e11y +34 -0
  79. data/gems/e11y-devtools/lib/e11y/devtools/mcp/server.rb +96 -0
  80. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tool_base.rb +25 -0
  81. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/clear.rb +31 -0
  82. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/errors.rb +35 -0
  83. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/event_detail.rb +33 -0
  84. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/events_by_trace.rb +33 -0
  85. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/interactions.rb +40 -0
  86. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/recent_events.rb +34 -0
  87. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/search.rb +34 -0
  88. data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/stats.rb +30 -0
  89. data/gems/e11y-devtools/lib/e11y/devtools/overlay/assets/overlay.js +115 -0
  90. data/gems/e11y-devtools/lib/e11y/devtools/overlay/controller.rb +54 -0
  91. data/gems/e11y-devtools/lib/e11y/devtools/overlay/engine.rb +26 -0
  92. data/gems/e11y-devtools/lib/e11y/devtools/overlay/middleware.rb +80 -0
  93. data/gems/e11y-devtools/lib/e11y/devtools/overlay/rails_controller.rb +42 -0
  94. data/gems/e11y-devtools/lib/e11y/devtools/tui/app.rb +262 -0
  95. data/gems/e11y-devtools/lib/e11y/devtools/tui/grouping.rb +66 -0
  96. data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/event_detail.rb +62 -0
  97. data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/event_list.rb +70 -0
  98. data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/interaction_list.rb +47 -0
  99. data/gems/e11y-devtools/lib/e11y/devtools/version.rb +8 -0
  100. data/gems/e11y-devtools/lib/e11y/devtools.rb +13 -0
  101. data/gems/e11y-devtools/spec/e11y/devtools/mcp/tools_spec.rb +107 -0
  102. data/gems/e11y-devtools/spec/e11y/devtools/overlay/controller_spec.rb +58 -0
  103. data/gems/e11y-devtools/spec/e11y/devtools/overlay/middleware_spec.rb +46 -0
  104. data/gems/e11y-devtools/spec/e11y/devtools/tui/app_spec.rb +85 -0
  105. data/gems/e11y-devtools/spec/e11y/devtools/tui/grouping_spec.rb +64 -0
  106. data/gems/e11y-devtools/spec/spec_helper.rb +5 -0
  107. data/gems/e11y-devtools/spec/tui/widgets/event_list_spec.rb +44 -0
  108. data/gems/e11y-devtools/spec/tui/widgets/interaction_list_spec.rb +62 -0
  109. data/lib/e11y/adapters/audit_encrypted.rb +53 -11
  110. data/lib/e11y/adapters/base.rb +33 -34
  111. data/lib/e11y/adapters/dev_log/file_store.rb +143 -0
  112. data/lib/e11y/adapters/dev_log/query.rb +219 -0
  113. data/lib/e11y/adapters/dev_log.rb +118 -0
  114. data/lib/e11y/adapters/file.rb +3 -6
  115. data/lib/e11y/adapters/in_memory.rb +52 -5
  116. data/lib/e11y/adapters/in_memory_test.rb +29 -0
  117. data/lib/e11y/adapters/loki.rb +58 -23
  118. data/lib/e11y/adapters/null.rb +82 -0
  119. data/lib/e11y/adapters/opentelemetry_collector.rb +183 -0
  120. data/lib/e11y/adapters/otel_logs.rb +136 -23
  121. data/lib/e11y/adapters/sentry.rb +4 -7
  122. data/lib/e11y/adapters/stdout.rb +73 -7
  123. data/lib/e11y/adapters/yabeda.rb +153 -29
  124. data/lib/e11y/buffers/adaptive_buffer.rb +3 -17
  125. data/lib/e11y/buffers/{request_scoped_buffer.rb → ephemeral_buffer.rb} +72 -58
  126. data/lib/e11y/buffers/ring_buffer.rb +3 -16
  127. data/lib/e11y/configuration.rb +272 -0
  128. data/lib/e11y/console.rb +10 -17
  129. data/lib/e11y/current.rb +53 -1
  130. data/lib/e11y/debug/pipeline_inspector.rb +96 -0
  131. data/lib/e11y/documentation/generator.rb +48 -0
  132. data/lib/e11y/event/base.rb +176 -82
  133. data/lib/e11y/event/value_sampling_config.rb +1 -5
  134. data/lib/e11y/events/rails/database/query.rb +1 -4
  135. data/lib/e11y/events/rails/job/failed.rb +2 -0
  136. data/lib/e11y/instruments/active_job.rb +46 -12
  137. data/lib/e11y/instruments/rails_instrumentation.rb +49 -24
  138. data/lib/e11y/instruments/sidekiq.rb +137 -31
  139. data/lib/e11y/linters/base.rb +11 -0
  140. data/lib/e11y/linters/pii/pii_declaration_linter.rb +120 -0
  141. data/lib/e11y/linters/slo/config_consistency_linter.rb +76 -0
  142. data/lib/e11y/linters/slo/explicit_declaration_linter.rb +36 -0
  143. data/lib/e11y/linters/slo/slo_status_from_linter.rb +41 -0
  144. data/lib/e11y/logger/bridge.rb +26 -7
  145. data/lib/e11y/metrics/cardinality_protection.rb +10 -15
  146. data/lib/e11y/metrics/cardinality_tracker.rb +16 -6
  147. data/lib/e11y/metrics/registry.rb +3 -5
  148. data/lib/e11y/metrics/test_backend.rb +62 -0
  149. data/lib/e11y/metrics.rb +56 -10
  150. data/lib/e11y/middleware/adapter_resolver.rb +40 -0
  151. data/lib/e11y/middleware/audit_signing.rb +43 -6
  152. data/lib/e11y/middleware/baggage_protection.rb +75 -0
  153. data/lib/e11y/middleware/dev_log_source.rb +24 -0
  154. data/lib/e11y/middleware/event_slo.rb +23 -9
  155. data/lib/e11y/middleware/otel_span.rb +23 -0
  156. data/lib/e11y/middleware/pii_filter.rb +104 -75
  157. data/lib/e11y/middleware/rate_limiting.rb +54 -27
  158. data/lib/e11y/middleware/request.rb +70 -23
  159. data/lib/e11y/middleware/routing.rb +78 -21
  160. data/lib/e11y/middleware/sampling.rb +66 -17
  161. data/lib/e11y/middleware/self_monitoring_emit.rb +39 -0
  162. data/lib/e11y/middleware/trace_context.rb +45 -10
  163. data/lib/e11y/middleware/track_latency.rb +34 -0
  164. data/lib/e11y/middleware/validation.rb +7 -16
  165. data/lib/e11y/middleware/versioning.rb +26 -22
  166. data/lib/e11y/opentelemetry/semantic_conventions.rb +109 -0
  167. data/lib/e11y/opentelemetry/span_creator.rb +142 -0
  168. data/lib/e11y/pii/patterns.rb +12 -1
  169. data/lib/e11y/pipeline/builder.rb +1 -1
  170. data/lib/e11y/presets/audit_event.rb +13 -2
  171. data/lib/e11y/railtie.rb +52 -15
  172. data/lib/e11y/registry.rb +306 -0
  173. data/lib/e11y/reliability/circuit_breaker.rb +19 -21
  174. data/lib/e11y/reliability/dlq/base.rb +71 -0
  175. data/lib/e11y/reliability/dlq/file_adapter.rb +301 -0
  176. data/lib/e11y/reliability/dlq/file_storage.rb +63 -34
  177. data/lib/e11y/reliability/dlq/filter.rb +37 -54
  178. data/lib/e11y/reliability/retry_handler.rb +26 -29
  179. data/lib/e11y/reliability/retry_rate_limiter.rb +3 -11
  180. data/lib/e11y/sampling/error_spike_detector.rb +0 -2
  181. data/lib/e11y/sampling/load_monitor.rb +5 -9
  182. data/lib/e11y/sampling/stratified_tracker.rb +18 -0
  183. data/lib/e11y/self_monitoring/buffer_monitor.rb +2 -0
  184. data/lib/e11y/self_monitoring/performance_monitor.rb +19 -61
  185. data/lib/e11y/self_monitoring/reliability_monitor.rb +4 -74
  186. data/lib/e11y/slo/config_loader.rb +40 -0
  187. data/lib/e11y/slo/config_validator.rb +58 -0
  188. data/lib/e11y/slo/dashboard_generator.rb +122 -0
  189. data/lib/e11y/slo/event_driven.rb +8 -0
  190. data/lib/e11y/slo/tracker.rb +31 -4
  191. data/lib/e11y/testing/have_tracked_event_matcher.rb +190 -0
  192. data/lib/e11y/testing/rspec_matchers.rb +21 -0
  193. data/lib/e11y/testing/snapshot_matcher.rb +86 -0
  194. data/lib/e11y/trace_context/sampler.rb +35 -0
  195. data/lib/e11y/tracing/faraday_middleware.rb +31 -0
  196. data/lib/e11y/tracing/net_http_patch.rb +33 -0
  197. data/lib/e11y/tracing/propagator.rb +116 -0
  198. data/lib/e11y/tracing.rb +47 -0
  199. data/lib/e11y/version.rb +1 -1
  200. data/lib/e11y/versioning/version_extractor.rb +32 -0
  201. data/lib/e11y.rb +141 -265
  202. data/lib/generators/e11y/event/event_generator.rb +22 -0
  203. data/lib/generators/e11y/event/templates/event.rb.tt +16 -0
  204. data/lib/generators/e11y/grafana_dashboard/grafana_dashboard_generator.rb +30 -0
  205. data/lib/generators/e11y/grafana_dashboard/templates/e11y_dashboard.json +81 -0
  206. data/lib/generators/e11y/install/install_generator.rb +34 -0
  207. data/lib/generators/e11y/install/templates/e11y.rb +239 -0
  208. data/lib/generators/e11y/prometheus_alerts/prometheus_alerts_generator.rb +29 -0
  209. data/lib/generators/e11y/prometheus_alerts/templates/e11y_alerts.yml +28 -0
  210. data/lib/tasks/e11y_docs.rake +30 -0
  211. data/lib/tasks/e11y_events.rake +71 -0
  212. data/lib/tasks/e11y_lint.rake +91 -0
  213. data/lib/tasks/e11y_slo.rake +29 -0
  214. metadata +129 -39
  215. data/docs/ADR-010-developer-experience.md +0 -2166
  216. data/docs/API-REFERENCE-L28.md +0 -914
  217. data/docs/COMPREHENSIVE-CONFIGURATION.md +0 -2366
  218. data/docs/CONTRIBUTING.md +0 -312
  219. data/docs/IMPLEMENTATION_NOTES.md +0 -2804
  220. data/docs/IMPLEMENTATION_PLAN.md +0 -1971
  221. data/docs/IMPLEMENTATION_PLAN_ARCHITECTURE.md +0 -586
  222. data/docs/PLAN.md +0 -148
  223. data/docs/README.md +0 -296
  224. data/docs/design/00-memory-optimization.md +0 -593
  225. data/docs/guides/MIGRATION-L27-L28.md +0 -692
  226. data/docs/guides/PERFORMANCE-BENCHMARKS.md +0 -434
  227. data/docs/guides/README.md +0 -44
  228. data/docs/use_cases/UC-003-pattern-based-metrics.md +0 -1627
  229. data/lib/e11y/adapters/registry.rb +0 -141
  230. /data/docs/{ADR-012-event-evolution.md → architecture/ADR-012-event-evolution.md} +0 -0
@@ -34,20 +34,13 @@ Rails.logger.info "Processing order #{order_id}"
34
34
 
35
35
  ### E11y Solution
36
36
 
37
- **Gradual, safe migration strategy:**
37
+ **Logger Bridge logs go to both Rails.logger and E11y:**
38
38
  ```ruby
39
- # ✅ AFTER: Coexistence mode (Phase 1)
39
+ # ✅ AFTER: Enable logger bridge
40
40
  E11y.configure do |config|
41
- config.rails_logger do
42
- # Intercept Rails.logger calls
43
- intercept_rails_logger true
44
-
45
- # Mirror to both systems during migration
46
- mirror_to_rails_logger true
47
-
48
- # Convert to structured events
49
- auto_convert_to_events true
50
- end
41
+ config.logger_bridge_enabled = true
42
+ config.logger_bridge_track_severities = [:info, :warn, :error, :fatal]
43
+ config.logger_bridge_ignore_patterns = [/Started GET/, /Completed \d+ OK/]
51
44
  end
52
45
 
53
46
  # Existing code works unchanged!
@@ -57,17 +50,13 @@ Rails.logger.info "Order created"
57
50
  # New code uses E11y directly
58
51
  Events::OrderCreated.track(order_id: order.id)
59
52
  # → Only E11y (no duplication) ✅
60
-
61
- # Phase 2: Turn off mirroring
62
- config.mirror_to_rails_logger = false
63
- # → All logs now go to E11y only ✅
64
53
  ```
65
54
 
66
55
  ---
67
56
 
68
57
  ## 🎯 Migration Strategy
69
58
 
70
- > **Implementation:** See [ADR-008 Section 7: Rails Logger Bridge](../ADR-008-rails-integration.md#7-rails-logger-bridge) for Logger::Bridge architecture, dual logging, and 3-phase migration strategy (shadow → conversion → full).
59
+ > **Implementation:** See [ADR-008 Section 7: Rails Logger Bridge](../architecture/ADR-008-rails-integration.md#7-rails-logger-bridge) for Logger::Bridge architecture.
71
60
 
72
61
  ### Phase 1: Shadow Mode (Week 1-2)
73
62
 
@@ -75,30 +64,9 @@ config.mirror_to_rails_logger = false
75
64
  ```ruby
76
65
  # config/initializers/e11y.rb
77
66
  E11y.configure do |config|
78
- # Phase 1: Shadow mode
79
- config.rails_logger do
80
- # Intercept Rails.logger (but keep original too!)
81
- intercept_rails_logger true
82
- mirror_to_rails_logger true # ← Keep Rails.logger working!
83
-
84
- # Auto-convert to E11y events
85
- auto_convert_to_events true
86
-
87
- # Map severity levels
88
- severity_mapping do
89
- debug -> :debug
90
- info -> :info
91
- warn -> :warn
92
- error -> :error
93
- fatal -> :fatal
94
- end
95
- end
96
-
97
- # Send to both Stdout (Rails.logger) and Loki (E11y)
98
- config.adapters = [
99
- E11y::Adapters::StdoutAdapter.new, # Development
100
- E11y::Adapters::LokiAdapter.new(...) # E11y backend
101
- ]
67
+ config.logger_bridge_enabled = true
68
+ config.logger_bridge_track_severities = [:info, :warn, :error, :fatal]
69
+ config.logger_bridge_ignore_patterns = [/Started GET/, /Completed \d+ OK/, /CACHE/]
102
70
  end
103
71
 
104
72
  # Existing code continues to work!
@@ -168,95 +136,26 @@ end
168
136
 
169
137
  ---
170
138
 
171
- ### Phase 3: Full Migration (Week 7+)
172
-
173
- **Turn off Rails.logger mirroring, E11y only:**
174
- ```ruby
175
- # config/initializers/e11y.rb
176
- E11y.configure do |config|
177
- config.rails_logger do
178
- intercept_rails_logger true
179
- mirror_to_rails_logger false # ← Turn off mirroring!
180
-
181
- # Auto-convert remaining Rails.logger calls
182
- auto_convert_to_events true
183
- end
184
- end
185
-
186
- # Now:
187
- # - E11y events → E11y only ✅
188
- # - Rails.logger calls → Auto-converted to E11y ✅
189
- # - No more duplication ✅
190
-
191
- # Optional: Deprecation warnings for remaining Rails.logger
192
- config.rails_logger do
193
- warn_on_rails_logger_usage true
194
- # → Logs warning when Rails.logger is used
195
- # "DEPRECATION: Rails.logger at app/controllers/users_controller.rb:42"
196
- end
197
- ```
198
-
199
139
  ---
200
140
 
201
141
  ## 💻 Implementation Examples
202
142
 
203
- ### Example 1: Auto-Conversion (Quick Start)
143
+ ### Example 1: Logger Bridge (Quick Start)
204
144
 
205
145
  ```ruby
206
146
  # config/initializers/e11y.rb
207
147
  E11y.configure do |config|
208
- config.rails_logger do
209
- # Intercept ALL Rails.logger calls
210
- intercept_rails_logger true
211
-
212
- # Auto-convert to E11y events
213
- auto_convert_to_events true
214
-
215
- # Extract structured data from log messages
216
- extract_structured_data do
217
- # Pattern: "Order 123 created by user 456"
218
- pattern /Order (\d+) created by user (\d+)/ do |match|
219
- {
220
- event_name: 'order.created',
221
- order_id: match[1],
222
- user_id: match[2]
223
- }
224
- end
225
-
226
- # Pattern: "Payment failed: Card declined"
227
- pattern /Payment failed: (.+)/ do |match|
228
- {
229
- event_name: 'payment.failed',
230
- error: match[1],
231
- severity: :error
232
- }
233
- end
234
-
235
- # Default: Generic log event
236
- fallback do |message, severity|
237
- {
238
- event_name: 'rails.log',
239
- message: message,
240
- severity: severity
241
- }
242
- end
243
- end
244
- end
148
+ config.logger_bridge_enabled = true
149
+ config.logger_bridge_track_severities = [:info, :warn, :error, :fatal]
150
+ config.logger_bridge_ignore_patterns = [/Started GET/, /Completed \d+ OK/]
245
151
  end
246
152
 
247
- # Existing code (unchanged):
248
- Rails.logger.info "Order 123 created by user 456"
249
-
250
- # Auto-converted to:
251
- Events::OrderCreated.track(
252
- order_id: '123',
253
- user_id: '456'
254
- )
255
-
256
- # In Grafana:
257
- # {event_name="order.created",order_id="123",user_id="456"}
153
+ # Rails.logger calls → Events::Rails::Log::Info/Warn/Error/Fatal (structured)
154
+ # Context (trace_id, request_id) from E11y::Current is auto-attached
258
155
  ```
259
156
 
157
+ **Note:** The Bridge converts Rails.logger to Events::Rails::Log::* (generic log events). For structured extraction, use manual Events (Example 2).
158
+
260
159
  ---
261
160
 
262
161
  ### Example 2: Manual Migration (Controllers)
@@ -494,69 +393,16 @@ end
494
393
 
495
394
  ## 🔧 Configuration
496
395
 
497
- ### Migration Configuration
498
-
499
396
  ```ruby
500
397
  # config/initializers/e11y.rb
501
398
  E11y.configure do |config|
502
- config.rails_logger do
503
- # === PHASE 1: SHADOW MODE ===
504
- # Intercept Rails.logger but keep original behavior
505
- intercept_rails_logger true
506
- mirror_to_rails_logger true # ← Both systems!
507
-
508
- # === PHASE 2: GRADUAL CONVERSION ===
509
- # Auto-convert Rails.logger to E11y events
510
- auto_convert_to_events true
511
-
512
- # Pattern extraction (parse log messages)
513
- extract_patterns do
514
- # Order events
515
- pattern /Order (\d+) created/, event: 'order.created' do |match|
516
- { order_id: match[1] }
517
- end
518
-
519
- # User events
520
- pattern /User (\d+) logged in/, event: 'user.logged_in' do |match|
521
- { user_id: match[1] }
522
- end
523
-
524
- # Payment events
525
- pattern /Payment (\w+) for order (\d+)/, event: 'payment.status' do |match|
526
- { status: match[1], order_id: match[2] }
527
- end
528
-
529
- # Generic fallback
530
- fallback event: 'rails.log' do |message, severity|
531
- { message: message, original_severity: severity }
532
- end
533
- end
534
-
535
- # Severity mapping
536
- severity_mapping do
537
- debug -> :debug
538
- info -> :info
539
- warn -> :warn
540
- error -> :error
541
- fatal -> :fatal
542
- unknown -> :warn
543
- end
544
-
545
- # === PHASE 3: FULL MIGRATION ===
546
- # Turn off mirroring (E11y only!)
547
- # mirror_to_rails_logger false
548
-
549
- # Deprecation warnings
550
- warn_on_rails_logger_usage true
551
- deprecation_message "Please use E11y events instead of Rails.logger"
552
-
553
- # Exceptions (still use Rails.logger)
554
- ignore_callers [
555
- /vendor\/bundle/, # Gems
556
- /config\/initializers/, # Initializers
557
- /health_check/ # Health checks
558
- ]
559
- end
399
+ config.logger_bridge_enabled = true
400
+ config.logger_bridge_track_severities = [:info, :warn, :error, :fatal]
401
+ config.logger_bridge_ignore_patterns = [
402
+ /Started GET/,
403
+ /Completed \d+ OK/,
404
+ /CACHE/
405
+ ]
560
406
  end
561
407
  ```
562
408
 
@@ -571,7 +417,7 @@ end
571
417
  # e11y_rails_logger_intercepted_total{severity} - Rails.logger calls intercepted
572
418
  # e11y_rails_logger_converted_total{pattern} - Auto-converted to events
573
419
  # e11y_rails_logger_fallback_total - Calls using fallback (not matched)
574
- # e11y_direct_events_total{event_name} - Direct E11y.track calls
420
+ # e11y_direct_events_total{event_name} - Direct EventClass.track calls
575
421
 
576
422
  # Grafana Dashboard:
577
423
  # Panel 1: Migration Progress
@@ -589,23 +435,11 @@ end
589
435
  ## 🧪 Testing
590
436
 
591
437
  ```ruby
592
- # spec/support/e11y_migration_helper.rb
593
- RSpec.configure do |config|
594
- config.around(:each, :e11y_migration) do |example|
595
- # Test both modes
596
-
597
- # Test 1: Shadow mode (both systems)
598
- E11y.configure do |c|
599
- c.rails_logger.mirror_to_rails_logger = true
600
- end
601
- example.run
602
-
603
- # Test 2: E11y only mode
604
- E11y.configure do |c|
605
- c.rails_logger.mirror_to_rails_logger = false
606
- end
607
- example.run
608
- end
438
+ # Logger Bridge is enabled in test via config
439
+ E11y.configure do |config|
440
+ config.logger_bridge_enabled = true
441
+ config.logger_bridge_track_severities = [:info, :warn, :error, :fatal]
442
+ config.logger_bridge_ignore_patterns = []
609
443
  end
610
444
 
611
445
  # spec/controllers/orders_controller_spec.rb
@@ -663,9 +497,8 @@ end
663
497
  **1. Migrate in phases (safe!)**
664
498
  ```ruby
665
499
  # ✅ GOOD: Gradual migration
666
- # Week 1-2: Shadow mode (both systems)
667
- # Week 3-6: Convert high-value areas
668
- # Week 7+: Turn off mirroring
500
+ # Week 1-2: Shadow mode (Logger Bridge enabled, both Rails.logger + E11y)
501
+ # Week 3-6: Convert high-value areas to Events::*
669
502
  ```
670
503
 
671
504
  **2. Start with new features**
@@ -688,12 +521,11 @@ end
688
521
  # 5. Everything else
689
522
  ```
690
523
 
691
- **4. Use auto-conversion for long tail**
524
+ **4. Use Logger Bridge for remaining Rails.logger**
692
525
  ```ruby
693
- # ✅ GOOD: Auto-convert remaining Rails.logger
694
- config.rails_logger do
695
- auto_convert_to_events true # Handles stragglers
696
- end
526
+ # ✅ GOOD: Bridge converts Rails.logger to Events::Rails::Log::*
527
+ config.logger_bridge_enabled = true
528
+ config.logger_bridge_ignore_patterns = [/Started GET/, /Completed \d+ OK/]
697
529
  ```
698
530
 
699
531
  ---
@@ -716,13 +548,8 @@ end
716
548
 
717
549
  **2. Don't break existing functionality**
718
550
  ```ruby
719
- # BAD: Turn off Rails.logger immediately
720
- config.rails_logger.mirror_to_rails_logger = false
721
- # → Existing code breaks! 💥
722
-
723
- # ✅ GOOD: Keep mirroring during migration
724
- config.rails_logger.mirror_to_rails_logger = true
725
- # → Both systems work ✅
551
+ # Logger Bridge always delegates to Rails.logger — logs always appear in log/production.log
552
+ # No "turn off mirroring" — both systems receive logs
726
553
  ```
727
554
 
728
555
  **3. Don't lose log context**
@@ -758,8 +585,7 @@ Events::OrderCreated.track(
758
585
  |-------|----------|------|--------|
759
586
  | **Phase 1: Shadow Mode** | 1-2 weeks | Low (no changes) | Both systems run |
760
587
  | **Phase 2: Gradual Conversion** | 4-6 weeks | Low (incremental) | Convert high-value areas |
761
- | **Phase 3: Full Migration** | 1+ weeks | Medium (turn off mirror) | E11y only |
762
- | **TOTAL** | **6-9 weeks** | **Low overall** | Gradual, safe |
588
+ | **TOTAL** | **6-8 weeks** | **Low overall** | Gradual, safe |
763
589
 
764
590
  ### Benefits After Migration
765
591