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.
- checksums.yaml +4 -4
- data/.rubocop.yml +130 -10
- data/CHANGELOG.md +80 -1
- data/CLAUDE.md +168 -0
- data/CONTRIBUTING.md +640 -0
- data/README.md +165 -701
- data/RELEASE.md +41 -12
- data/Rakefile +249 -57
- 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 +79 -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} +36 -65
- data/docs/{ADR-002-metrics-yabeda.md → architecture/ADR-002-metrics-yabeda.md} +62 -236
- data/docs/architecture/ADR-003-slo-observability.md +1402 -0
- 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} +182 -743
- 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} +44 -86
- data/docs/{ADR-012-event-evolution.md → architecture/ADR-012-event-evolution.md} +11 -11
- 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} +43 -59
- data/docs/{ADR-016-self-monitoring-slo.md → architecture/ADR-016-self-monitoring-slo.md} +58 -355
- 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/plans/2026-03-20-browser-overlay-svelte.md +281 -0
- 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 +33 -684
- 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 +30 -178
- data/docs/use_cases/UC-010-background-job-tracking.md +24 -91
- 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 +158 -0
- data/gems/e11y-devtools/config/routes.rb +15 -0
- data/gems/e11y-devtools/e11y-devtools.gemspec +25 -0
- data/gems/e11y-devtools/exe/e11y +34 -0
- data/gems/e11y-devtools/frontend/.gitignore +24 -0
- data/gems/e11y-devtools/frontend/README.md +51 -0
- data/gems/e11y-devtools/frontend/index.html +14 -0
- data/gems/e11y-devtools/frontend/package-lock.json +3707 -0
- data/gems/e11y-devtools/frontend/package.json +28 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/events/recent.json +4205 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/interactions.json +194 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/0a2e04027cfa22d014bc22e8b27cd913/events.json +86 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/0e1543af6a630fb3af6b52283154b3e0/events.json +169 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/1838b691faa49564f97db8592ff3978d/events.json +78 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/29f198f6588dacffb687777eb5f8f118/events.json +197 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/34bc3c9c0097de28a7a6f99b90a8e7bc/events.json +194 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/3ba6c20d068ab9cee00e51b180e66444/events.json +184 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/435bfd8f17b9009146a79812d7c3726d/events.json +144 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/4c7676e3fe668e99edb2b94d7d5678a9/events.json +222 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/6daf0d47974bedfc55d5de7004a3ea9f/events.json +194 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/8a81ada42834d15f287bb40010043605/events.json +194 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/8c0a98900edaae105469df8daedccf02/events.json +198 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/8e4f645180f8a7d1dce426b07380466b/events.json +222 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/93db346fa5d44a032605a13b627f4b80/events.json +128 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/98ff6146faf7bd9be8bd03a8275817ba/events.json +223 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/9997ddd0247bc7e25f2ca7a5c415c93d/events.json +197 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/99e35f8ef3baedd798cc4fd085980ad9/events.json +194 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/b4f3095c1909924cbc98889a86c83d6d/events.json +131 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/b54b7fc32b7575a7110de809d11ccda0/events.json +128 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/c0b48033fa06746bcc5886745e053cff/events.json +169 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/c44649ac76701b4558927cd2305ab535/events.json +169 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/d601ae3320057580a39dbdac2edfdf4a/events.json +248 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/e67e724bab422d2b52eeb49635e512e1/events.json +194 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/e6c72765a28f158a8485b35fa63f73da/events.json +194 -0
- data/gems/e11y-devtools/frontend/public/mocks/v1/traces/f541b87405c9a54819b18ebe529f6419/events.json +194 -0
- data/gems/e11y-devtools/frontend/scripts/generate_mocks.rb +397 -0
- data/gems/e11y-devtools/frontend/src/App.svelte +827 -0
- data/gems/e11y-devtools/frontend/src/components/Fab.svelte +19 -0
- data/gems/e11y-devtools/frontend/src/components/FilterBar.svelte +38 -0
- data/gems/e11y-devtools/frontend/src/components/FullscreenPanel.svelte +82 -0
- data/gems/e11y-devtools/frontend/src/components/InteractionsTimeline.svelte +264 -0
- data/gems/e11y-devtools/frontend/src/components/RecentHistogram.svelte +354 -0
- data/gems/e11y-devtools/frontend/src/lib/api.ts +37 -0
- data/gems/e11y-devtools/frontend/src/lib/eventIdentity.ts +12 -0
- data/gems/e11y-devtools/frontend/src/lib/format.ts +37 -0
- data/gems/e11y-devtools/frontend/src/lib/listFilter.ts +43 -0
- data/gems/e11y-devtools/frontend/src/lib/recentVolume.ts +80 -0
- data/gems/e11y-devtools/frontend/src/lib/router.ts +12 -0
- data/gems/e11y-devtools/frontend/src/lib/transitions.ts +34 -0
- data/gems/e11y-devtools/frontend/src/lib/viewportOrigin.ts +25 -0
- data/gems/e11y-devtools/frontend/src/main.ts +8 -0
- data/gems/e11y-devtools/frontend/src/overlay-entry.ts +24 -0
- data/gems/e11y-devtools/frontend/src/overlay.css +1080 -0
- data/gems/e11y-devtools/frontend/svelte.config.js +2 -0
- data/gems/e11y-devtools/frontend/test_puppeteer.js +41 -0
- data/gems/e11y-devtools/frontend/test_scale.js +3 -0
- data/gems/e11y-devtools/frontend/tsconfig.app.json +21 -0
- data/gems/e11y-devtools/frontend/tsconfig.json +7 -0
- data/gems/e11y-devtools/frontend/tsconfig.node.json +26 -0
- data/gems/e11y-devtools/frontend/vite.config.ts +36 -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 +20 -0
- data/gems/e11y-devtools/lib/e11y/devtools/overlay/controller.rb +94 -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 +67 -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 +91 -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 +44 -12
- data/lib/e11y/instruments/rails_instrumentation.rb +49 -24
- data/lib/e11y/instruments/sidekiq.rb +135 -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 +4 -4
- data/lib/e11y/presets/audit_event.rb +13 -2
- data/lib/e11y/railtie.rb +52 -14
- 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 +144 -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 +123 -266
- 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 +186 -39
- data/docs/ADR-003-slo-observability.md +0 -3337
- 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
|
@@ -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
|
|
76
|
+
config.adapters[:otel] = E11y::Adapters::OpenTelemetryCollector.new(
|
|
77
77
|
endpoint: ENV['OTEL_EXPORTER_OTLP_ENDPOINT'] || 'http://localhost:4318',
|
|
78
|
-
|
|
79
|
-
headers: {
|
|
80
|
-
|
|
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
|
-
# └─→
|
|
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.
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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.
|
|
425
|
-
|
|
426
|
-
|
|
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
|
|
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
|
|
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
|
|
528
|
+
config.adapters[:otel] = E11y::Adapters::OpenTelemetryCollector.new(
|
|
562
529
|
endpoint: 'http://otel-collector:4318',
|
|
563
|
-
|
|
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
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
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
|
-
# -
|
|
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
|
-
├─→
|
|
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
|
-
|
|
1053
|
-
|
|
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::
|
|
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
|
-
|
|
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
|
-
**
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
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
|
-
#
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
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
|
-
|
|
979
|
-
|
|
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
|
-
|
|
856
|
+
"traceparent" => E11y::Tracing::Propagator.build_traceparent
|
|
1005
857
|
}
|
|
1006
858
|
)
|
|
1007
859
|
```
|