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
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9d7e79dcbcbd63a42a108fff3b2c29f4cea6f07e8e2632145d4cff39f85514ac
|
|
4
|
+
data.tar.gz: b53a0b131efaad3accb9ab20b75c5dcf973274422d384432a3b3562437750e4b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4576c625410acc475dbd5782fa546b29adcc6a815c319d86eae9a9b8e0a700c49a099197db7fdccf3c3ea43f594c24bdd90ccdc689cad82e9a8da11d18d50999
|
|
7
|
+
data.tar.gz: f569447a2c1b532cc39246d163fe245b61f63ec9ee618a2c9cf428936f3eead760549d6774de9b8a5afc09d12a0df7439ad53bf0f41993a7c518af566ebbdc1d
|
data/.rubocop.yml
CHANGED
|
@@ -3,14 +3,10 @@
|
|
|
3
3
|
# See https://rubystyle.guide/ for Ruby style guide
|
|
4
4
|
# See https://docs.rubocop.org/rubocop/ for all available cops
|
|
5
5
|
|
|
6
|
-
require:
|
|
7
|
-
- rubocop-rspec
|
|
8
|
-
- rubocop-rspec_rails
|
|
9
|
-
|
|
10
6
|
plugins:
|
|
11
|
-
- rubocop-capybara
|
|
12
|
-
- rubocop-factory_bot
|
|
13
7
|
- rubocop-performance
|
|
8
|
+
- rubocop-rspec
|
|
9
|
+
- rubocop-rspec_rails
|
|
14
10
|
|
|
15
11
|
AllCops:
|
|
16
12
|
TargetRubyVersion: 3.2
|
|
@@ -28,17 +24,82 @@ Metrics/BlockLength:
|
|
|
28
24
|
Exclude:
|
|
29
25
|
- 'spec/**/*'
|
|
30
26
|
- 'Rakefile'
|
|
27
|
+
- 'lib/tasks/**/*'
|
|
31
28
|
- '*.gemspec'
|
|
29
|
+
- 'lib/e11y/reliability/retry_handler.rb'
|
|
30
|
+
- 'lib/e11y/instruments/active_job.rb'
|
|
32
31
|
|
|
33
32
|
Metrics/MethodLength:
|
|
34
|
-
Max:
|
|
33
|
+
Max: 20
|
|
35
34
|
Exclude:
|
|
36
35
|
- 'spec/**/*'
|
|
36
|
+
- 'lib/e11y/adapters/yabeda.rb'
|
|
37
|
+
- 'lib/e11y/middleware/routing.rb'
|
|
38
|
+
- 'lib/e11y/event/base.rb'
|
|
39
|
+
- 'lib/e11y/middleware/rate_limiting.rb'
|
|
40
|
+
- 'lib/e11y/middleware/sampling.rb'
|
|
37
41
|
|
|
38
42
|
Metrics/ClassLength:
|
|
39
43
|
Max: 100
|
|
40
44
|
Exclude:
|
|
41
45
|
- 'spec/**/*'
|
|
46
|
+
- 'lib/e11y/buffers/ephemeral_buffer.rb'
|
|
47
|
+
- 'lib/e11y/registry.rb'
|
|
48
|
+
- 'lib/e11y/adapters/otel_logs.rb'
|
|
49
|
+
- 'lib/e11y/adapters/opentelemetry_collector.rb'
|
|
50
|
+
- 'lib/e11y/opentelemetry/span_creator.rb'
|
|
51
|
+
- 'lib/e11y/configuration.rb'
|
|
52
|
+
|
|
53
|
+
Metrics/CyclomaticComplexity:
|
|
54
|
+
Max: 15
|
|
55
|
+
Exclude:
|
|
56
|
+
- 'lib/e11y/adapters/yabeda.rb'
|
|
57
|
+
- 'lib/e11y/middleware/event_slo.rb'
|
|
58
|
+
- 'lib/e11y/middleware/routing.rb'
|
|
59
|
+
- 'spec/integration/pattern_metrics_integration_spec.rb'
|
|
60
|
+
- 'spec/integration/slo_tracking_integration_spec.rb'
|
|
61
|
+
- 'spec/support/integration_helpers.rb'
|
|
62
|
+
- 'spec/support/integration/pii_helpers.rb'
|
|
63
|
+
- 'spec/support/loki_helpers.rb'
|
|
64
|
+
- 'spec/support/matchers/pii_matchers.rb'
|
|
65
|
+
|
|
66
|
+
Metrics/AbcSize:
|
|
67
|
+
Max: 20
|
|
68
|
+
Exclude:
|
|
69
|
+
- 'lib/e11y/middleware/event_slo.rb'
|
|
70
|
+
- 'lib/e11y/middleware/routing.rb'
|
|
71
|
+
- 'lib/e11y/adapters/yabeda.rb'
|
|
72
|
+
- 'lib/e11y/event/base.rb'
|
|
73
|
+
- 'lib/e11y/middleware/versioning.rb'
|
|
74
|
+
- 'lib/e11y/reliability/retry_handler.rb'
|
|
75
|
+
- 'lib/e11y/adapters/base.rb'
|
|
76
|
+
- 'lib/e11y/adapters/opentelemetry_collector.rb'
|
|
77
|
+
- 'lib/e11y/adapters/otel_logs.rb'
|
|
78
|
+
- 'lib/e11y/current.rb'
|
|
79
|
+
- 'lib/e11y/instruments/active_job.rb'
|
|
80
|
+
- 'lib/e11y/instruments/sidekiq.rb'
|
|
81
|
+
- 'lib/e11y/linters/pii/pii_declaration_linter.rb'
|
|
82
|
+
- 'lib/e11y/linters/slo/config_consistency_linter.rb'
|
|
83
|
+
- 'lib/e11y/logger/bridge.rb'
|
|
84
|
+
- 'lib/e11y/middleware/pii_filter.rb'
|
|
85
|
+
- 'lib/e11y/middleware/rate_limiting.rb'
|
|
86
|
+
- 'lib/e11y/middleware/sampling.rb'
|
|
87
|
+
- 'lib/e11y/opentelemetry/span_creator.rb'
|
|
88
|
+
- 'spec/integration/slo_tracking_integration_spec.rb'
|
|
89
|
+
- 'spec/support/integration_helpers.rb'
|
|
90
|
+
- 'spec/support/integration/pii_helpers.rb'
|
|
91
|
+
- 'spec/support/loki_helpers.rb'
|
|
92
|
+
- 'spec/support/matchers/pii_matchers.rb'
|
|
93
|
+
|
|
94
|
+
Metrics/PerceivedComplexity:
|
|
95
|
+
Max: 15
|
|
96
|
+
Exclude:
|
|
97
|
+
- 'lib/e11y/middleware/event_slo.rb'
|
|
98
|
+
- 'spec/integration/slo_tracking_integration_spec.rb'
|
|
99
|
+
- 'spec/support/integration_helpers.rb'
|
|
100
|
+
- 'spec/support/integration/pii_helpers.rb'
|
|
101
|
+
- 'spec/support/loki_helpers.rb'
|
|
102
|
+
- 'spec/support/matchers/pii_matchers.rb'
|
|
42
103
|
|
|
43
104
|
# Style
|
|
44
105
|
Style/Documentation:
|
|
@@ -52,9 +113,15 @@ Style/StringLiterals:
|
|
|
52
113
|
Style/FrozenStringLiteralComment:
|
|
53
114
|
Enabled: true
|
|
54
115
|
|
|
116
|
+
# Layout
|
|
117
|
+
Layout/LineLength:
|
|
118
|
+
Max: 150
|
|
119
|
+
|
|
55
120
|
# RSpec
|
|
56
121
|
RSpec/ExampleLength:
|
|
57
|
-
Max:
|
|
122
|
+
Max: 40 # Allow longer examples for integration tests
|
|
123
|
+
Exclude:
|
|
124
|
+
- "spec/integration/**/*"
|
|
58
125
|
|
|
59
126
|
RSpec/MultipleExpectations:
|
|
60
127
|
Max: 10 # Allow more expectations for integration tests
|
|
@@ -64,16 +131,43 @@ RSpec/MultipleMemoizedHelpers:
|
|
|
64
131
|
|
|
65
132
|
RSpec/NestedGroups:
|
|
66
133
|
Max: 3
|
|
134
|
+
Exclude:
|
|
135
|
+
- "spec/e11y/current_spec.rb"
|
|
136
|
+
- "spec/e11y/middleware/pii_filtering_spec.rb"
|
|
67
137
|
|
|
68
138
|
# Gem-specific: Development dependencies can be in gemspec
|
|
69
139
|
Gemspec/DevelopmentDependencies:
|
|
70
140
|
Enabled: false
|
|
71
141
|
|
|
142
|
+
Style/OneClassPerFile:
|
|
143
|
+
Exclude:
|
|
144
|
+
- "spec/dummy/config/application.rb"
|
|
145
|
+
- "spec/support/pipeline_debug.rb"
|
|
146
|
+
|
|
72
147
|
# Allow integration tests without specific class
|
|
73
148
|
RSpec/DescribeClass:
|
|
74
149
|
Exclude:
|
|
75
150
|
- "spec/zeitwerk_spec.rb"
|
|
76
151
|
- "spec/integration/**/*"
|
|
152
|
+
- "spec/e11y/module_api_spec.rb"
|
|
153
|
+
- "spec/e11y/configuration/error_handling_config_spec.rb"
|
|
154
|
+
|
|
155
|
+
# File path conventions (generators use spec/generators/e11y/ structure)
|
|
156
|
+
RSpec/SpecFilePathFormat:
|
|
157
|
+
Exclude:
|
|
158
|
+
- "spec/e11y/event/dsl_additions_spec.rb"
|
|
159
|
+
- "spec/e11y/module_api_spec.rb"
|
|
160
|
+
- "spec/generators/e11y/*_spec.rb"
|
|
161
|
+
- "spec/e11y/opentelemetry/semantic_conventions_spec.rb"
|
|
162
|
+
- "spec/e11y/opentelemetry/span_creator_spec.rb"
|
|
163
|
+
|
|
164
|
+
RSpec/DescribeMethod:
|
|
165
|
+
Exclude:
|
|
166
|
+
- "spec/e11y/module_api_spec.rb"
|
|
167
|
+
|
|
168
|
+
RSpec/MultipleDescribes:
|
|
169
|
+
Exclude:
|
|
170
|
+
- "spec/e11y/adapters/null_adapter_spec.rb"
|
|
77
171
|
|
|
78
172
|
# Allow simple doubles for now (will improve in Phase 1)
|
|
79
173
|
RSpec/VerifiedDoubles:
|
|
@@ -85,5 +179,31 @@ RSpec/VerifiedDoubles:
|
|
|
85
179
|
RSpec/MessageSpies:
|
|
86
180
|
Enabled: false
|
|
87
181
|
|
|
88
|
-
|
|
89
|
-
|
|
182
|
+
# RSpec/Output: New cop in rubocop-rspec 3.x flagging puts in specs.
|
|
183
|
+
# We use puts for diagnostic output in integration tests and support files.
|
|
184
|
+
RSpec/Output:
|
|
185
|
+
Enabled: false
|
|
186
|
+
|
|
187
|
+
RSpec/RepeatedExample:
|
|
188
|
+
Exclude:
|
|
189
|
+
- "spec/e11y/instruments/rails_instrumentation_spec.rb"
|
|
190
|
+
- "spec/e11y/versioning/version_extractor_spec.rb"
|
|
191
|
+
|
|
192
|
+
RSpec/StubbedMock:
|
|
193
|
+
Exclude:
|
|
194
|
+
- "spec/e11y/module_api_spec.rb"
|
|
195
|
+
- "spec/e11y/slo/config_loader_spec.rb"
|
|
196
|
+
|
|
197
|
+
Metrics/ParameterLists:
|
|
198
|
+
Exclude:
|
|
199
|
+
- "lib/e11y/adapters/opentelemetry_collector.rb"
|
|
200
|
+
- "lib/e11y/adapters/otel_logs.rb"
|
|
201
|
+
|
|
202
|
+
Style/SafeNavigationChainLength:
|
|
203
|
+
Exclude:
|
|
204
|
+
- "lib/e11y/linters/pii/pii_declaration_linter.rb"
|
|
205
|
+
|
|
206
|
+
Performance/CollectionLiteralInLoop:
|
|
207
|
+
Exclude:
|
|
208
|
+
- "lib/e11y/middleware/pii_filter.rb"
|
|
209
|
+
|
data/CHANGELOG.md
CHANGED
|
@@ -19,6 +19,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
19
19
|
|
|
20
20
|
### Security
|
|
21
21
|
|
|
22
|
+
## [1.0.0] - 2026-03-20
|
|
23
|
+
|
|
24
|
+
### BREAKING: Configuration — Flat config API
|
|
25
|
+
|
|
26
|
+
**Nested config objects removed.** All configuration options are now flat accessors on `config`.
|
|
27
|
+
|
|
28
|
+
**Key migrations:**
|
|
29
|
+
- `config.rails_instrumentation.enabled` → `config.rails_instrumentation_enabled`
|
|
30
|
+
- `config.logger_bridge.track_severities` → `config.logger_bridge_track_severities`
|
|
31
|
+
- `config.rate_limiting { }` removed → use `config.rate_limiting_enabled`, `config.add_rate_limit_per_event(...)`
|
|
32
|
+
- `config.slo { }` removed → use `config.slo_tracking_enabled`, `config.add_slo_controller(...)`
|
|
33
|
+
|
|
34
|
+
**Full mapping:** See `docs/plans/2026-03-13-configuration-design.md`
|
|
35
|
+
|
|
36
|
+
### BREAKING: Middleware order changed (ADR-015 compliance)
|
|
37
|
+
|
|
38
|
+
**Per ADR-015 and ADR-006:**
|
|
39
|
+
- **Versioning** moved to last (before Routing) — Validation, PII, RateLimiting, Sampling now use original class names
|
|
40
|
+
- **AuditSigning** before PIIFilter — audit events signed with original data (GDPR Art. 30 non-repudiation)
|
|
41
|
+
- **RateLimiting** before Sampling — matches ADR #4, #5
|
|
42
|
+
|
|
43
|
+
**New order:** TraceContext → Validation → AuditSigning → PIIFilter → RateLimiting → Sampling → Versioning → Routing → EventSlo
|
|
44
|
+
|
|
45
|
+
**Migration:** If you custom-configured pipeline order, ensure Versioning is last before Routing. Audit events now receive unfiltered payload at signing.
|
|
46
|
+
|
|
47
|
+
### BREAKING: Registry.all_events → Registry.event_classes
|
|
48
|
+
|
|
49
|
+
**Renamed for clarity:** Method returns event classes, not event instances or names.
|
|
50
|
+
|
|
51
|
+
**Migration:** `E11y::Registry.all_events` → `E11y::Registry.event_classes`
|
|
52
|
+
|
|
53
|
+
### BREAKING: RequestScopedBuffer → EphemeralBuffer
|
|
54
|
+
|
|
55
|
+
**Renamed for accuracy:** The buffer works for both HTTP requests and background jobs. "Ephemeral" reflects its temporary lifecycle.
|
|
56
|
+
|
|
57
|
+
**Migration:**
|
|
58
|
+
- `E11y::Buffers::RequestScopedBuffer` → `E11y::Buffers::EphemeralBuffer`
|
|
59
|
+
- `config.request_buffer` → `config.ephemeral_buffer`
|
|
60
|
+
- `Thread.current[:e11y_request_buffer]` → `Thread.current[:e11y_ephemeral_buffer]`
|
|
61
|
+
- Yabeda metric `e11y_request_buffer_total` → `e11y_ephemeral_buffer_total`
|
|
62
|
+
|
|
63
|
+
**Search and replace:** `RequestScopedBuffer` → `EphemeralBuffer`, `request_buffer` → `ephemeral_buffer`
|
|
64
|
+
|
|
65
|
+
### Added
|
|
66
|
+
|
|
67
|
+
### Changed
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
|
|
71
|
+
### Deprecated
|
|
72
|
+
|
|
73
|
+
### Removed
|
|
74
|
+
|
|
75
|
+
### Security
|
|
76
|
+
|
|
22
77
|
## [0.2.0] - 2026-01-26
|
|
23
78
|
|
|
24
79
|
### Added
|
|
@@ -135,7 +190,7 @@ Initial release of E11y - Event-driven observability for Rails applications.
|
|
|
135
190
|
- Audit log (encrypted storage)
|
|
136
191
|
|
|
137
192
|
- **Advanced Features**
|
|
138
|
-
-
|
|
193
|
+
- Event-level metrics (metrics DSL)
|
|
139
194
|
- PII filtering with configurable rules
|
|
140
195
|
- Stratified sampling
|
|
141
196
|
- Rate limiting
|
data/CLAUDE.md
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
E11y ("easy telemetry") is a Ruby gem providing observability for Rails apps. Its key differentiator is **request-scoped debug buffering**: debug logs accumulate in memory during a request and flush to storage only if the request fails, cutting noise by ~90%.
|
|
8
|
+
|
|
9
|
+
- **Ruby**: 3.2+, **Rails**: 7.0–8.0 (8.1 excluded due to a sqlite3 bug)
|
|
10
|
+
- **Gem version**: 0.2.0, current branch: `feat/integration-testing`
|
|
11
|
+
|
|
12
|
+
## Commands
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
# Run all tests
|
|
16
|
+
rake spec:all
|
|
17
|
+
|
|
18
|
+
# Run unit tests only (fast, no Rails required)
|
|
19
|
+
rake spec:unit
|
|
20
|
+
|
|
21
|
+
# Run integration tests (requires --with integration bundle group)
|
|
22
|
+
rake spec:integration
|
|
23
|
+
|
|
24
|
+
# Integration tests for Loki/OTel adapters require services — start with docker compose:
|
|
25
|
+
docker compose up -d loki otel-collector
|
|
26
|
+
INTEGRATION=true bundle exec rspec spec/integration/critical_adapters_integration_spec.rb
|
|
27
|
+
|
|
28
|
+
# Run a single spec file
|
|
29
|
+
bundle exec rspec spec/e11y/adapters/loki_adapter_spec.rb
|
|
30
|
+
|
|
31
|
+
# Run a single example by line number
|
|
32
|
+
bundle exec rspec spec/e11y/adapters/loki_adapter_spec.rb:42
|
|
33
|
+
|
|
34
|
+
# Lint
|
|
35
|
+
bundle exec rubocop
|
|
36
|
+
|
|
37
|
+
# Lint with autocorrect
|
|
38
|
+
bundle exec rubocop -a
|
|
39
|
+
|
|
40
|
+
# Install integration dependencies (needed before rake spec:integration)
|
|
41
|
+
bundle install --with integration
|
|
42
|
+
|
|
43
|
+
# Open a console with the gem loaded
|
|
44
|
+
rake console
|
|
45
|
+
|
|
46
|
+
# Run benchmarks
|
|
47
|
+
rake spec:benchmark
|
|
48
|
+
|
|
49
|
+
# Run Cucumber acceptance tests
|
|
50
|
+
rake cucumber
|
|
51
|
+
# Or: bundle exec cucumber features/
|
|
52
|
+
|
|
53
|
+
# Cucumber with Loki (adapter_configurations.feature): start Loki + OTel first
|
|
54
|
+
docker compose up -d loki otel-collector
|
|
55
|
+
rake cucumber
|
|
56
|
+
|
|
57
|
+
# Run TUI (interactive log viewer)
|
|
58
|
+
bundle exec e11y
|
|
59
|
+
|
|
60
|
+
# Start MCP server (for Cursor / Claude Code)
|
|
61
|
+
bundle exec e11y mcp
|
|
62
|
+
|
|
63
|
+
# Stream events to stdout
|
|
64
|
+
bundle exec e11y tail
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Architecture
|
|
68
|
+
|
|
69
|
+
### Event Processing Pipeline
|
|
70
|
+
|
|
71
|
+
Every event flows through a middleware pipeline before reaching an adapter:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
Event.track(data)
|
|
75
|
+
→ Validation (dry-schema)
|
|
76
|
+
→ Sampling (adaptive: error-spike, load, value-based)
|
|
77
|
+
→ PII Filtering (mask/hash sensitive fields)
|
|
78
|
+
→ Trace Context (attach OTel span/trace IDs)
|
|
79
|
+
→ Routing (direct to adapters by severity/type)
|
|
80
|
+
→ Rate Limiting
|
|
81
|
+
→ Audit Signing
|
|
82
|
+
→ Adapter(s): Loki | Sentry | OpenTelemetry | Yabeda | File | Stdout | InMemory
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Pipeline is built in `lib/e11y/pipeline/builder.rb`. Middleware order matters — see ADR-015.
|
|
86
|
+
|
|
87
|
+
### Key Modules
|
|
88
|
+
|
|
89
|
+
| Path | Role |
|
|
90
|
+
|------|------|
|
|
91
|
+
| `lib/e11y.rb` | Public API, `E11y.configure`, `E11y.configuration`, `E11y.logger` |
|
|
92
|
+
| `lib/e11y/event/base.rb` | Base event class; all user events inherit from this |
|
|
93
|
+
| `lib/e11y/adapters/` | Backend adapters (Loki, Sentry, OTel, Yabeda, File, Stdout, InMemory) |
|
|
94
|
+
| `lib/e11y/middleware/` | 11 pipeline stages (validation, sampling, PII, routing, etc.) |
|
|
95
|
+
| `lib/e11y/buffers/` | Request-scoped buffer + adaptive buffer implementations |
|
|
96
|
+
| `lib/e11y/pipeline/builder.rb` | Assembles middleware chain from configuration |
|
|
97
|
+
| `lib/e11y/railtie.rb` | Rails integration entry point |
|
|
98
|
+
| `lib/e11y/pii/` | PII detection patterns and masking/hashing strategies |
|
|
99
|
+
| `lib/e11y/sampling/` | Error-spike, load-based, value-based sampling strategies |
|
|
100
|
+
| `lib/e11y/reliability/` | Circuit breaker, DLQ (dead letter queue), retry logic |
|
|
101
|
+
| `lib/e11y/slo/` | Event-driven SLO tracking |
|
|
102
|
+
| `lib/e11y/metrics/` | Prometheus metrics registry with cardinality protection |
|
|
103
|
+
| `gems/e11y-devtools/` | Developer tools gem (TUI, Browser Overlay, MCP) — dev-only |
|
|
104
|
+
| `gems/e11y-devtools/lib/e11y/devtools/tui/` | ratatui_ruby TUI — interaction-centric log viewer |
|
|
105
|
+
| `gems/e11y-devtools/lib/e11y/devtools/overlay/` | Rails Engine — floating badge + slide-in panel |
|
|
106
|
+
| `gems/e11y-devtools/lib/e11y/devtools/mcp/` | MCP Server — AI integration for Cursor/Claude Code |
|
|
107
|
+
| `lib/e11y/adapters/dev_log.rb` | DevLog adapter — JSONL write+read, shared by all viewers |
|
|
108
|
+
|
|
109
|
+
### Event Definition Pattern
|
|
110
|
+
|
|
111
|
+
Events are defined as classes inheriting from `E11y::Event::Base`:
|
|
112
|
+
|
|
113
|
+
```ruby
|
|
114
|
+
class Events::OrderCreated < E11y::Event::Base
|
|
115
|
+
schema do
|
|
116
|
+
required(:order_id).filled(:string)
|
|
117
|
+
required(:amount).filled(:float)
|
|
118
|
+
optional(:user_id).maybe(:string)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
metrics do
|
|
122
|
+
counter :orders_created_total, "Orders created"
|
|
123
|
+
histogram :order_amount, "Order amount in USD", buckets: [10, 50, 100, 500]
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Usage
|
|
128
|
+
Events::OrderCreated.track(order_id: order.id, amount: order.total)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Adapter Routing
|
|
132
|
+
|
|
133
|
+
Adapters are registered in configuration and events route to them by severity:
|
|
134
|
+
- `error`/`fatal` → errors tracker (e.g., Sentry)
|
|
135
|
+
- other severities → logs (e.g., Loki)
|
|
136
|
+
- metrics always → Yabeda/Prometheus
|
|
137
|
+
|
|
138
|
+
### Request-Scoped Buffering
|
|
139
|
+
|
|
140
|
+
The buffer middleware captures debug-level events in a `Concurrent::Array` per request (stored in `Thread.current`). On request success: buffer discarded. On request failure: buffer flushed to configured adapters. Controlled by `config.ephemeral_buffer_enabled`.
|
|
141
|
+
|
|
142
|
+
## Test Structure
|
|
143
|
+
|
|
144
|
+
- `spec/e11y/` — Unit tests (86 files, ~1672 examples, fast)
|
|
145
|
+
- `spec/integration/` — Integration tests against a real Rails app (~36 examples)
|
|
146
|
+
- `spec/dummy/` — Minimal Rails app used by integration tests
|
|
147
|
+
- `spec/dummy/app/events/events/` — Event class definitions for test fixtures
|
|
148
|
+
- `spec/support/matchers/` — Custom RSpec matchers including PII matchers
|
|
149
|
+
- `spec/fixtures/pii_samples.yml` — PII test data
|
|
150
|
+
|
|
151
|
+
Integration tests use `DatabaseCleaner` and require `--with integration` bundle group.
|
|
152
|
+
|
|
153
|
+
## Code Conventions
|
|
154
|
+
|
|
155
|
+
- Frozen string literals everywhere (`# frozen_string_literal: true`)
|
|
156
|
+
- Double-quoted strings (enforced by RuboCop)
|
|
157
|
+
- Events use class-level `.track` (not instantiation) — zero-allocation design; data stored in plain Hashes
|
|
158
|
+
- Adapters inherit from `E11y::Adapters::Base` and implement `#deliver(event_data)`
|
|
159
|
+
- Middleware inherits from `E11y::Middleware::Base` and implements `#call(event, pipeline)`
|
|
160
|
+
|
|
161
|
+
## Architecture Decision Records
|
|
162
|
+
|
|
163
|
+
The `docs/architecture/ADR-*.md` files document design decisions. Key ones:
|
|
164
|
+
- **ADR-004**: Adapter architecture
|
|
165
|
+
- **ADR-011**: Testing strategy
|
|
166
|
+
- **ADR-013**: Reliability and error handling
|
|
167
|
+
- **ADR-015**: Middleware ordering (critical — changing order breaks the pipeline)
|
|
168
|
+
- **ADR-017**: Multi-Rails compatibility approach
|