foam-ruby 0.1.0.alpha6 → 0.1.0.alpha8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '039cdc9710beb8c5ebc5caf48a4d26ebc906af5843a2effcaa6e23516de0a5e0'
4
- data.tar.gz: 239ff4c8bfcaf6d56659bdb306cdabf93452c8db7713772bdfe4ef37080b326d
3
+ metadata.gz: a4435b32248c007790701a7de2054f702398a2f1881bcaa571f20f209825d5e8
4
+ data.tar.gz: 82a9836aa895f5b1b70ace7b441dd288997ff7e2772a5c1e5f7742a2fa22dcc6
5
5
  SHA512:
6
- metadata.gz: 73478d74ae9823f7c9c88f58da21f1eab4fe6338d67e25b847d83f024b86229217f6a41170f1799161670680b45cfa4e602ba2dea9c06fe53282159afab56bd7
7
- data.tar.gz: 654295ea96663ef4399f01ccb6d98bc6fa17f2eac3f6cc81523e8a9f6f6de7ca0bec0f23743b9c241d1c961ebc38d3ef0c268ee42868c64843474ffc9630496c
6
+ metadata.gz: 8e3792c185a39b7470ddf0b0037580fcf45ed9f906d4834ea28bd837422df5fbb365109f9525fae66e7cb68121844ad119f38228d83bcfb0946965fbf6b005d2
7
+ data.tar.gz: 4fab2024d4ef4e8fe3601e3836e8af28544feaefd41d80e929721f651ac7ba84c034810dc923d90bf9a540ac335dd6c25db7d4567ea30b3c039f61abd9115a84
data/README.md CHANGED
@@ -87,6 +87,18 @@ The gem only initializes in production (`RAILS_ENV=production` or `RACK_ENV=prod
87
87
  - **Rails 7.0 and below**: Falls back to `ActiveSupport::Logger.broadcast`
88
88
  - **Ruby**: >= 3.0
89
89
 
90
+ ## Acknowledgements
91
+
92
+ This package is built on top of the following open source projects:
93
+
94
+ | Project | License | Link |
95
+ |---------|---------|------|
96
+ | [OpenTelemetry Ruby SDK](https://github.com/open-telemetry/opentelemetry-ruby) (`opentelemetry-sdk`) | Apache-2.0 | https://github.com/open-telemetry/opentelemetry-ruby |
97
+ | [OpenTelemetry Ruby Logs SDK](https://github.com/open-telemetry/opentelemetry-ruby) (`opentelemetry-logs-sdk`) | Apache-2.0 | https://github.com/open-telemetry/opentelemetry-ruby |
98
+ | [OpenTelemetry OTLP Exporter](https://github.com/open-telemetry/opentelemetry-ruby) (`opentelemetry-exporter-otlp`) | Apache-2.0 | https://github.com/open-telemetry/opentelemetry-ruby |
99
+ | [OpenTelemetry OTLP Logs Exporter](https://github.com/open-telemetry/opentelemetry-ruby) (`opentelemetry-exporter-otlp-logs`) | Apache-2.0 | https://github.com/open-telemetry/opentelemetry-ruby |
100
+ | [OpenTelemetry Rails Instrumentation](https://github.com/open-telemetry/opentelemetry-ruby-contrib) (`opentelemetry-instrumentation-rails`) | Apache-2.0 | https://github.com/open-telemetry/opentelemetry-ruby-contrib |
101
+
90
102
  ## License
91
103
 
92
104
  MIT
@@ -30,13 +30,10 @@ module Foam
30
30
  def emit(severity, message)
31
31
  return if message.nil? || (message.respond_to?(:empty?) && message.empty?)
32
32
 
33
- span_context = OpenTelemetry::Trace.current_span.context
34
-
35
33
  @otel_logger.on_emit(
36
34
  body: message.to_s,
37
35
  severity_number: SEVERITY_MAP.fetch(severity, OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_INFO),
38
36
  severity_text: SEVERITY_TEXT.fetch(severity, "INFO"),
39
- span_context: span_context.valid? ? span_context : nil,
40
37
  timestamp: Time.now
41
38
  )
42
39
  rescue StandardError => e
@@ -17,36 +17,71 @@ module Foam
17
17
  end
18
18
 
19
19
  def configure_traces(config)
20
- OpenTelemetry::SDK.configure do |c|
21
- c.service_name = config.service_name
22
-
23
- c.add_span_processor(
24
- OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
25
- OpenTelemetry::Exporter::OTLP::Exporter.new(
26
- endpoint: config.traces_endpoint,
27
- headers: config.otel_headers
28
- )
29
- )
20
+ @foam_span_processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
21
+ OpenTelemetry::Exporter::OTLP::Exporter.new(
22
+ endpoint: config.traces_endpoint,
23
+ headers: config.otel_headers
30
24
  )
25
+ )
31
26
 
32
- c.use_all
27
+ existing = OpenTelemetry.tracer_provider
28
+ if existing.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
29
+ existing.add_span_processor(@foam_span_processor)
30
+ else
31
+ OpenTelemetry::SDK.configure do |c|
32
+ c.service_name = config.service_name
33
+ c.add_span_processor(@foam_span_processor)
34
+ c.use_all
35
+ end
33
36
  end
37
+
38
+ @attached_provider = OpenTelemetry.tracer_provider
39
+ end
40
+
41
+ def ensure_processor_attached!
42
+ return unless @foam_span_processor
43
+
44
+ current = OpenTelemetry.tracer_provider
45
+ return if current.equal?(@attached_provider)
46
+ return unless current.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
47
+
48
+ current.add_span_processor(@foam_span_processor)
49
+ @attached_provider = current
34
50
  end
35
51
 
36
52
  def configure_logs(config)
37
- resource = OpenTelemetry::SDK::Resources::Resource.create(
38
- "service.name" => config.service_name
53
+ @foam_log_processor = OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(
54
+ OpenTelemetry::Exporter::OTLP::Logs::LogsExporter.new(
55
+ endpoint: config.logs_endpoint,
56
+ headers: config.otel_headers
57
+ )
39
58
  )
40
59
 
41
- exporter = OpenTelemetry::Exporter::OTLP::Logs::LogsExporter.new(
42
- endpoint: config.logs_endpoint,
43
- headers: config.otel_headers
44
- )
60
+ existing = OpenTelemetry.logger_provider
61
+ if existing.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
62
+ existing.add_log_record_processor(@foam_log_processor)
63
+ else
64
+ resource = OpenTelemetry::SDK::Resources::Resource.create(
65
+ "service.name" => config.service_name,
66
+ "deployment.environment" => ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "production"
67
+ )
68
+ provider = OpenTelemetry::SDK::Logs::LoggerProvider.new(resource: resource)
69
+ provider.add_log_record_processor(@foam_log_processor)
70
+ OpenTelemetry.logger_provider = provider
71
+ end
72
+
73
+ @attached_logger_provider = OpenTelemetry.logger_provider
74
+ end
75
+
76
+ def ensure_log_processor_attached!
77
+ return unless @foam_log_processor
78
+
79
+ current = OpenTelemetry.logger_provider
80
+ return if current.equal?(@attached_logger_provider)
81
+ return unless current.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
45
82
 
46
- processor = OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(exporter)
47
- logger_provider = OpenTelemetry::SDK::Logs::LoggerProvider.new(resource: resource)
48
- logger_provider.add_log_record_processor(processor)
49
- OpenTelemetry.logger_provider = logger_provider
83
+ current.add_log_record_processor(@foam_log_processor)
84
+ @attached_logger_provider = current
50
85
  end
51
86
  end
52
87
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Foam
4
4
  module Ruby
5
- VERSION = "0.1.0.alpha6"
5
+ VERSION = "0.1.0.alpha8"
6
6
  end
7
7
  end
data/lib/foam/ruby.rb CHANGED
@@ -26,6 +26,7 @@ module Foam
26
26
  require_relative "ruby/log_subscriber"
27
27
 
28
28
  OtelSetup.configure!(config)
29
+ schedule_trace_reattach!
29
30
  schedule_logger_attach!
30
31
  bridge_sentry!
31
32
  @initialized = true
@@ -100,6 +101,17 @@ module Foam
100
101
  nil
101
102
  end
102
103
 
104
+ def schedule_trace_reattach!
105
+ return unless defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
106
+
107
+ ::Rails.application.config.after_initialize do
108
+ OtelSetup.ensure_processor_attached!
109
+ OtelSetup.ensure_log_processor_attached!
110
+ end
111
+ rescue Exception # rubocop:disable Lint/RescueException
112
+ nil
113
+ end
114
+
103
115
  def do_attach_otel_logger!
104
116
  return unless ::Rails.respond_to?(:logger) && ::Rails.logger
105
117
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foam-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha6
4
+ version: 0.1.0.alpha8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foam
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-14 00:00:00.000000000 Z
11
+ date: 2026-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api