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.
- checksums.yaml +4 -4
- data/.rubocop.yml +130 -10
- data/CHANGELOG.md +56 -1
- data/CLAUDE.md +168 -0
- data/CONTRIBUTING.md +640 -0
- data/README.md +134 -702
- data/RELEASE.md +18 -3
- data/Rakefile +108 -29
- data/config/README.md +1 -1
- data/config/loki-local-config.yaml +12 -0
- data/config/otel-collector-config.yaml +44 -0
- data/cucumber.yml +1 -0
- data/docker-compose.yml +18 -2
- data/docs/ADAPTERS.md +76 -0
- data/docs/ADAPTIVE_SAMPLING.md +59 -0
- data/docs/COMPARISON.md +104 -0
- data/docs/CONFIGURATION.md +52 -0
- data/docs/DISTRIBUTED_TRACING.md +44 -0
- data/docs/LIMITATIONS.md +13 -0
- data/docs/METRICS_DSL.md +84 -0
- data/docs/PERFORMANCE.md +60 -0
- data/docs/PII_FILTERING.md +40 -0
- data/docs/PRESETS.md +65 -0
- data/docs/QUICK-START.md +546 -587
- data/docs/RAILS_INTEGRATION.md +29 -0
- data/docs/SCHEMA_VALIDATION.md +63 -0
- data/docs/SLO-PROMQL-ALERTS.md +161 -0
- data/docs/TESTING.md +69 -0
- data/docs/{ADR-001-architecture.md → architecture/ADR-001-architecture.md} +35 -64
- data/docs/{ADR-002-metrics-yabeda.md → architecture/ADR-002-metrics-yabeda.md} +62 -236
- data/docs/{ADR-003-slo-observability.md → architecture/ADR-003-slo-observability.md} +27 -466
- data/docs/{ADR-004-adapter-architecture.md → architecture/ADR-004-adapter-architecture.md} +163 -146
- data/docs/{ADR-005-tracing-context.md → architecture/ADR-005-tracing-context.md} +10 -9
- data/docs/{ADR-006-security-compliance.md → architecture/ADR-006-security-compliance.md} +184 -191
- data/docs/{ADR-007-opentelemetry-integration.md → architecture/ADR-007-opentelemetry-integration.md} +3 -21
- data/docs/{ADR-008-rails-integration.md → architecture/ADR-008-rails-integration.md} +209 -339
- data/docs/{ADR-009-cost-optimization.md → architecture/ADR-009-cost-optimization.md} +45 -54
- data/docs/architecture/ADR-010-developer-experience.md +522 -0
- data/docs/{ADR-011-testing-strategy.md → architecture/ADR-011-testing-strategy.md} +41 -83
- data/docs/{ADR-013-reliability-error-handling.md → architecture/ADR-013-reliability-error-handling.md} +37 -12
- data/docs/{ADR-014-event-driven-slo.md → architecture/ADR-014-event-driven-slo.md} +12 -24
- data/docs/{ADR-015-middleware-order.md → architecture/ADR-015-middleware-order.md} +23 -41
- data/docs/{ADR-016-self-monitoring-slo.md → architecture/ADR-016-self-monitoring-slo.md} +52 -349
- data/docs/{ADR-017-multi-rails-compatibility.md → architecture/ADR-017-multi-rails-compatibility.md} +4 -11
- data/docs/architecture/ADR-018-memory-optimization.md +366 -0
- data/docs/{ADR-INDEX.md → architecture/ADR-INDEX.md} +11 -6
- data/docs/{00-ICP-AND-TIMELINE.md → prd/00-ICP-AND-TIMELINE.md} +6 -6
- data/docs/{01-SCALE-REQUIREMENTS.md → prd/01-SCALE-REQUIREMENTS.md} +6 -6
- data/docs/prd/01-overview-vision.md +19 -14
- data/docs/use_cases/README.md +22 -23
- data/docs/use_cases/UC-001-request-scoped-debug-buffering.md +50 -44
- data/docs/use_cases/UC-002-business-event-tracking.md +26 -95
- data/docs/use_cases/UC-003-event-metrics.md +66 -0
- data/docs/use_cases/UC-004-zero-config-slo-tracking.md +42 -101
- data/docs/use_cases/UC-005-sentry-integration.md +13 -15
- data/docs/use_cases/UC-006-trace-context-management.md +30 -28
- data/docs/use_cases/UC-007-pii-filtering.md +35 -87
- data/docs/use_cases/UC-008-opentelemetry-integration.md +51 -89
- data/docs/use_cases/UC-009-multi-service-tracing.md +4 -4
- data/docs/use_cases/UC-010-background-job-tracking.md +5 -5
- data/docs/use_cases/UC-011-rate-limiting.md +95 -168
- data/docs/use_cases/UC-012-audit-trail.md +21 -46
- data/docs/use_cases/UC-013-high-cardinality-protection.md +29 -167
- data/docs/use_cases/UC-014-adaptive-sampling.md +2 -2
- data/docs/use_cases/UC-015-cost-optimization.md +46 -99
- data/docs/use_cases/UC-016-rails-logger-migration.md +39 -213
- data/docs/use_cases/UC-017-local-development.md +203 -777
- data/docs/use_cases/UC-018-testing-events.md +3 -3
- data/docs/use_cases/UC-019-retention-based-routing.md +53 -106
- data/docs/use_cases/UC-020-event-versioning.md +8 -9
- data/docs/use_cases/UC-021-error-handling-retry-dlq.md +18 -22
- data/docs/use_cases/UC-022-event-registry.md +15 -21
- data/docs/use_cases/backlog.md +119 -87
- data/e11y.gemspec +2 -2
- data/gems/e11y-devtools/README.md +136 -0
- data/gems/e11y-devtools/config/routes.rb +8 -0
- data/gems/e11y-devtools/e11y-devtools.gemspec +25 -0
- data/gems/e11y-devtools/exe/e11y +34 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/server.rb +96 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tool_base.rb +25 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/clear.rb +31 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/errors.rb +35 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/event_detail.rb +33 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/events_by_trace.rb +33 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/interactions.rb +40 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/recent_events.rb +34 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/search.rb +34 -0
- data/gems/e11y-devtools/lib/e11y/devtools/mcp/tools/stats.rb +30 -0
- data/gems/e11y-devtools/lib/e11y/devtools/overlay/assets/overlay.js +115 -0
- data/gems/e11y-devtools/lib/e11y/devtools/overlay/controller.rb +54 -0
- data/gems/e11y-devtools/lib/e11y/devtools/overlay/engine.rb +26 -0
- data/gems/e11y-devtools/lib/e11y/devtools/overlay/middleware.rb +80 -0
- data/gems/e11y-devtools/lib/e11y/devtools/overlay/rails_controller.rb +42 -0
- data/gems/e11y-devtools/lib/e11y/devtools/tui/app.rb +262 -0
- data/gems/e11y-devtools/lib/e11y/devtools/tui/grouping.rb +66 -0
- data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/event_detail.rb +62 -0
- data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/event_list.rb +70 -0
- data/gems/e11y-devtools/lib/e11y/devtools/tui/widgets/interaction_list.rb +47 -0
- data/gems/e11y-devtools/lib/e11y/devtools/version.rb +8 -0
- data/gems/e11y-devtools/lib/e11y/devtools.rb +13 -0
- data/gems/e11y-devtools/spec/e11y/devtools/mcp/tools_spec.rb +107 -0
- data/gems/e11y-devtools/spec/e11y/devtools/overlay/controller_spec.rb +58 -0
- data/gems/e11y-devtools/spec/e11y/devtools/overlay/middleware_spec.rb +46 -0
- data/gems/e11y-devtools/spec/e11y/devtools/tui/app_spec.rb +85 -0
- data/gems/e11y-devtools/spec/e11y/devtools/tui/grouping_spec.rb +64 -0
- data/gems/e11y-devtools/spec/spec_helper.rb +5 -0
- data/gems/e11y-devtools/spec/tui/widgets/event_list_spec.rb +44 -0
- data/gems/e11y-devtools/spec/tui/widgets/interaction_list_spec.rb +62 -0
- data/lib/e11y/adapters/audit_encrypted.rb +53 -11
- data/lib/e11y/adapters/base.rb +33 -34
- data/lib/e11y/adapters/dev_log/file_store.rb +143 -0
- data/lib/e11y/adapters/dev_log/query.rb +219 -0
- data/lib/e11y/adapters/dev_log.rb +118 -0
- data/lib/e11y/adapters/file.rb +3 -6
- data/lib/e11y/adapters/in_memory.rb +52 -5
- data/lib/e11y/adapters/in_memory_test.rb +29 -0
- data/lib/e11y/adapters/loki.rb +58 -23
- data/lib/e11y/adapters/null.rb +82 -0
- data/lib/e11y/adapters/opentelemetry_collector.rb +183 -0
- data/lib/e11y/adapters/otel_logs.rb +136 -23
- data/lib/e11y/adapters/sentry.rb +4 -7
- data/lib/e11y/adapters/stdout.rb +73 -7
- data/lib/e11y/adapters/yabeda.rb +153 -29
- data/lib/e11y/buffers/adaptive_buffer.rb +3 -17
- data/lib/e11y/buffers/{request_scoped_buffer.rb → ephemeral_buffer.rb} +72 -58
- data/lib/e11y/buffers/ring_buffer.rb +3 -16
- data/lib/e11y/configuration.rb +272 -0
- data/lib/e11y/console.rb +10 -17
- data/lib/e11y/current.rb +53 -1
- data/lib/e11y/debug/pipeline_inspector.rb +96 -0
- data/lib/e11y/documentation/generator.rb +48 -0
- data/lib/e11y/event/base.rb +176 -82
- data/lib/e11y/event/value_sampling_config.rb +1 -5
- data/lib/e11y/events/rails/database/query.rb +1 -4
- data/lib/e11y/events/rails/job/failed.rb +2 -0
- data/lib/e11y/instruments/active_job.rb +46 -12
- data/lib/e11y/instruments/rails_instrumentation.rb +49 -24
- data/lib/e11y/instruments/sidekiq.rb +137 -31
- data/lib/e11y/linters/base.rb +11 -0
- data/lib/e11y/linters/pii/pii_declaration_linter.rb +120 -0
- data/lib/e11y/linters/slo/config_consistency_linter.rb +76 -0
- data/lib/e11y/linters/slo/explicit_declaration_linter.rb +36 -0
- data/lib/e11y/linters/slo/slo_status_from_linter.rb +41 -0
- data/lib/e11y/logger/bridge.rb +26 -7
- data/lib/e11y/metrics/cardinality_protection.rb +10 -15
- data/lib/e11y/metrics/cardinality_tracker.rb +16 -6
- data/lib/e11y/metrics/registry.rb +3 -5
- data/lib/e11y/metrics/test_backend.rb +62 -0
- data/lib/e11y/metrics.rb +56 -10
- data/lib/e11y/middleware/adapter_resolver.rb +40 -0
- data/lib/e11y/middleware/audit_signing.rb +43 -6
- data/lib/e11y/middleware/baggage_protection.rb +75 -0
- data/lib/e11y/middleware/dev_log_source.rb +24 -0
- data/lib/e11y/middleware/event_slo.rb +23 -9
- data/lib/e11y/middleware/otel_span.rb +23 -0
- data/lib/e11y/middleware/pii_filter.rb +104 -75
- data/lib/e11y/middleware/rate_limiting.rb +54 -27
- data/lib/e11y/middleware/request.rb +70 -23
- data/lib/e11y/middleware/routing.rb +78 -21
- data/lib/e11y/middleware/sampling.rb +66 -17
- data/lib/e11y/middleware/self_monitoring_emit.rb +39 -0
- data/lib/e11y/middleware/trace_context.rb +45 -10
- data/lib/e11y/middleware/track_latency.rb +34 -0
- data/lib/e11y/middleware/validation.rb +7 -16
- data/lib/e11y/middleware/versioning.rb +26 -22
- data/lib/e11y/opentelemetry/semantic_conventions.rb +109 -0
- data/lib/e11y/opentelemetry/span_creator.rb +142 -0
- data/lib/e11y/pii/patterns.rb +12 -1
- data/lib/e11y/pipeline/builder.rb +1 -1
- data/lib/e11y/presets/audit_event.rb +13 -2
- data/lib/e11y/railtie.rb +52 -15
- data/lib/e11y/registry.rb +306 -0
- data/lib/e11y/reliability/circuit_breaker.rb +19 -21
- data/lib/e11y/reliability/dlq/base.rb +71 -0
- data/lib/e11y/reliability/dlq/file_adapter.rb +301 -0
- data/lib/e11y/reliability/dlq/file_storage.rb +63 -34
- data/lib/e11y/reliability/dlq/filter.rb +37 -54
- data/lib/e11y/reliability/retry_handler.rb +26 -29
- data/lib/e11y/reliability/retry_rate_limiter.rb +3 -11
- data/lib/e11y/sampling/error_spike_detector.rb +0 -2
- data/lib/e11y/sampling/load_monitor.rb +5 -9
- data/lib/e11y/sampling/stratified_tracker.rb +18 -0
- data/lib/e11y/self_monitoring/buffer_monitor.rb +2 -0
- data/lib/e11y/self_monitoring/performance_monitor.rb +19 -61
- data/lib/e11y/self_monitoring/reliability_monitor.rb +4 -74
- data/lib/e11y/slo/config_loader.rb +40 -0
- data/lib/e11y/slo/config_validator.rb +58 -0
- data/lib/e11y/slo/dashboard_generator.rb +122 -0
- data/lib/e11y/slo/event_driven.rb +8 -0
- data/lib/e11y/slo/tracker.rb +31 -4
- data/lib/e11y/testing/have_tracked_event_matcher.rb +190 -0
- data/lib/e11y/testing/rspec_matchers.rb +21 -0
- data/lib/e11y/testing/snapshot_matcher.rb +86 -0
- data/lib/e11y/trace_context/sampler.rb +35 -0
- data/lib/e11y/tracing/faraday_middleware.rb +31 -0
- data/lib/e11y/tracing/net_http_patch.rb +33 -0
- data/lib/e11y/tracing/propagator.rb +116 -0
- data/lib/e11y/tracing.rb +47 -0
- data/lib/e11y/version.rb +1 -1
- data/lib/e11y/versioning/version_extractor.rb +32 -0
- data/lib/e11y.rb +141 -265
- data/lib/generators/e11y/event/event_generator.rb +22 -0
- data/lib/generators/e11y/event/templates/event.rb.tt +16 -0
- data/lib/generators/e11y/grafana_dashboard/grafana_dashboard_generator.rb +30 -0
- data/lib/generators/e11y/grafana_dashboard/templates/e11y_dashboard.json +81 -0
- data/lib/generators/e11y/install/install_generator.rb +34 -0
- data/lib/generators/e11y/install/templates/e11y.rb +239 -0
- data/lib/generators/e11y/prometheus_alerts/prometheus_alerts_generator.rb +29 -0
- data/lib/generators/e11y/prometheus_alerts/templates/e11y_alerts.yml +28 -0
- data/lib/tasks/e11y_docs.rake +30 -0
- data/lib/tasks/e11y_events.rake +71 -0
- data/lib/tasks/e11y_lint.rake +91 -0
- data/lib/tasks/e11y_slo.rake +29 -0
- metadata +129 -39
- data/docs/ADR-010-developer-experience.md +0 -2166
- data/docs/API-REFERENCE-L28.md +0 -914
- data/docs/COMPREHENSIVE-CONFIGURATION.md +0 -2366
- data/docs/CONTRIBUTING.md +0 -312
- data/docs/IMPLEMENTATION_NOTES.md +0 -2804
- data/docs/IMPLEMENTATION_PLAN.md +0 -1971
- data/docs/IMPLEMENTATION_PLAN_ARCHITECTURE.md +0 -586
- data/docs/PLAN.md +0 -148
- data/docs/README.md +0 -296
- data/docs/design/00-memory-optimization.md +0 -593
- data/docs/guides/MIGRATION-L27-L28.md +0 -692
- data/docs/guides/PERFORMANCE-BENCHMARKS.md +0 -434
- data/docs/guides/README.md +0 -44
- data/docs/use_cases/UC-003-pattern-based-metrics.md +0 -1627
- data/lib/e11y/adapters/registry.rb +0 -141
- /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
|
-
**
|
|
37
|
+
**Logger Bridge — logs go to both Rails.logger and E11y:**
|
|
38
38
|
```ruby
|
|
39
|
-
# ✅ AFTER:
|
|
39
|
+
# ✅ AFTER: Enable logger bridge
|
|
40
40
|
E11y.configure do |config|
|
|
41
|
-
config.
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
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
|
-
|
|
79
|
-
config.
|
|
80
|
-
|
|
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:
|
|
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.
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
#
|
|
248
|
-
|
|
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.
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
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
|
|
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
|
-
#
|
|
593
|
-
|
|
594
|
-
config.
|
|
595
|
-
|
|
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
|
|
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
|
|
524
|
+
**4. Use Logger Bridge for remaining Rails.logger**
|
|
692
525
|
```ruby
|
|
693
|
-
# ✅ GOOD:
|
|
694
|
-
config.
|
|
695
|
-
|
|
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
|
-
#
|
|
720
|
-
|
|
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
|
-
| **
|
|
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
|
|