foam-ruby 0.1.0.alpha13 → 0.1.0.alpha14

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: d499bfb9b269432b8a581f296cc917118d8da08c18ec8bcd0804d099b93a4e46
4
- data.tar.gz: 30ed5cf79368e4b044562f9eb8e5385e72af60bf6f91a53826f47aebe01816d4
3
+ metadata.gz: d3d94dd6da1d8be5d17fffeae51f7f05e8d324f2c8969490c761d683cb64fd38
4
+ data.tar.gz: 790fadb6fbe21745a5b8042acb589e463a1f8efe6f390125c6d8fb086203a7b4
5
5
  SHA512:
6
- metadata.gz: 01ad0c424faf4ab05e52ecff9ddb5f5695ed0ed18006f6b53a58af7950f2aedc5f66f92c9af2bfa632a7ea7512a5d4864a8210dc627cabe02277921f6d20d2ee
7
- data.tar.gz: 53732245e699e9198dbaf25c43426e0a9811dc3901b45a93dcdadbeb15b12195c95cb2f35d4d81676481f55844c2858ccb0eef8ae9331037801f65bf418f879e
6
+ metadata.gz: 1bba8f1b602ca0ca765f41df63f62e8cdbd3b74a078e3f3b2679bd9fe74769f925d23d3b6245605a9e5f91186e8d699d0c143f6203a6a23839eb8efd9e546e62
7
+ data.tar.gz: e390774bc1780c7f7e6b1586bf02c0a72fad3ff945a4c9b99c93c9337dd795de20d7562c568dadfd4e1cf5b03d5031a69070470c77e18b55ff2942697289f487
@@ -8,7 +8,7 @@ module Foam
8
8
  attr_accessor :token, :service_name, :endpoint
9
9
 
10
10
  def initialize
11
- @token = ENV["FOAM_API_TOKEN"]
11
+ @token = ENV["OTEL_FOAM_COLLECTOR_BEARER_TOKEN"]
12
12
  @service_name = ENV["OTEL_SERVICE_NAME"]
13
13
  @endpoint = ENV.fetch("FOAM_OTEL_ENDPOINT", FOAM_OTEL_ENDPOINT)
14
14
  end
@@ -13,53 +13,33 @@ module Foam
13
13
  opentelemetry-instrumentation-rack
14
14
  opentelemetry-instrumentation-rails
15
15
  opentelemetry-instrumentation-action_pack
16
+ opentelemetry-instrumentation-action_view
17
+ opentelemetry-instrumentation-action_mailer
16
18
  opentelemetry-instrumentation-active_record
17
19
  opentelemetry-instrumentation-active_support
20
+ opentelemetry-instrumentation-active_job
21
+ opentelemetry-instrumentation-active_storage
22
+ opentelemetry-instrumentation-concurrent_ruby
18
23
  ].freeze
19
24
 
20
25
  module_function
21
26
 
22
- # -- public API (called from Foam::Ruby + Middleware) --
23
-
24
27
  def configure!(config)
25
- require_instrumentations!
26
28
  configure_traces(config)
27
29
  configure_logs(config)
30
+ register_at_exit_flush!
28
31
  end
29
32
 
30
- def ensure_processor_attached!
31
- return unless @foam_span_processor
32
-
33
- current = OpenTelemetry.tracer_provider
34
- return if current.equal?(@attached_provider)
35
- return unless current.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
36
-
37
- current.add_span_processor(@foam_span_processor)
38
- @attached_provider = current
39
- end
40
-
41
- def ensure_log_processor_attached!
42
- return unless @foam_log_processor
43
-
44
- current = OpenTelemetry.logger_provider
45
- return if current.equal?(@attached_logger_provider)
46
- return unless current.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
47
-
48
- current.add_log_record_processor(@foam_log_processor)
49
- @attached_logger_provider = current
50
- end
51
-
52
- # -- internal --
53
-
54
33
  def require_instrumentations!
55
- INSTRUMENTATIONS.each do |name|
56
- require name
34
+ INSTRUMENTATIONS.each do |gem_name|
35
+ require gem_name
57
36
  rescue LoadError
58
37
  nil
59
38
  end
60
39
  end
61
40
 
62
41
  def configure_traces(config)
42
+ require_instrumentations!
63
43
  @foam_span_processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
64
44
  OpenTelemetry::Exporter::OTLP::Exporter.new(
65
45
  endpoint: config.traces_endpoint,
@@ -67,9 +47,9 @@ module Foam
67
47
  )
68
48
  )
69
49
 
70
- provider = OpenTelemetry.tracer_provider
71
- if provider.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
72
- provider.add_span_processor(@foam_span_processor)
50
+ existing = OpenTelemetry.tracer_provider
51
+ if existing.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
52
+ existing.add_span_processor(@foam_span_processor)
73
53
  install_instrumentations!
74
54
  else
75
55
  OpenTelemetry::SDK.configure do |c|
@@ -82,6 +62,37 @@ module Foam
82
62
  @attached_provider = OpenTelemetry.tracer_provider
83
63
  end
84
64
 
65
+ def install_instrumentations!
66
+ registry = OpenTelemetry::Instrumentation.registry
67
+ return unless registry
68
+
69
+ registry.each do |instrumentation|
70
+ instrumentation.install unless instrumentation.installed?
71
+ end
72
+ end
73
+
74
+ def register_at_exit_flush!
75
+ at_exit do
76
+ @foam_span_processor&.force_flush(timeout: 5)
77
+ @foam_log_processor&.force_flush(timeout: 5)
78
+ @foam_span_processor&.shutdown(timeout: 5)
79
+ @foam_log_processor&.shutdown(timeout: 5)
80
+ rescue Exception # rubocop:disable Lint/RescueException
81
+ nil
82
+ end
83
+ end
84
+
85
+ def ensure_processor_attached!
86
+ return unless @foam_span_processor
87
+
88
+ current = OpenTelemetry.tracer_provider
89
+ return if current.equal?(@attached_provider)
90
+ return unless current.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
91
+
92
+ current.add_span_processor(@foam_span_processor)
93
+ @attached_provider = current
94
+ end
95
+
85
96
  def configure_logs(config)
86
97
  @foam_log_processor = OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(
87
98
  OpenTelemetry::Exporter::OTLP::Logs::LogsExporter.new(
@@ -90,9 +101,9 @@ module Foam
90
101
  )
91
102
  )
92
103
 
93
- provider = OpenTelemetry.logger_provider
94
- if provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
95
- provider.add_log_record_processor(@foam_log_processor)
104
+ existing = OpenTelemetry.logger_provider
105
+ if existing.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
106
+ existing.add_log_record_processor(@foam_log_processor)
96
107
  else
97
108
  resource = OpenTelemetry::SDK::Resources::Resource.create(
98
109
  "service.name" => config.service_name,
@@ -106,10 +117,15 @@ module Foam
106
117
  @attached_logger_provider = OpenTelemetry.logger_provider
107
118
  end
108
119
 
109
- def install_instrumentations!
110
- OpenTelemetry::Instrumentation.registry&.each do |instrumentation|
111
- instrumentation.install unless instrumentation.installed?
112
- end
120
+ def ensure_log_processor_attached!
121
+ return unless @foam_log_processor
122
+
123
+ current = OpenTelemetry.logger_provider
124
+ return if current.equal?(@attached_logger_provider)
125
+ return unless current.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
126
+
127
+ current.add_log_record_processor(@foam_log_processor)
128
+ @attached_logger_provider = current
113
129
  end
114
130
  end
115
131
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Foam
4
4
  module Ruby
5
- VERSION = "0.1.0.alpha13"
5
+ VERSION = "0.1.0.alpha14"
6
6
  end
7
7
  end
data/lib/foam/ruby.rb CHANGED
@@ -19,7 +19,7 @@ module Foam
19
19
  config.service_name = service_name if service_name
20
20
 
21
21
  unless config.valid?
22
- warn "[foam-ruby] Missing required config — set FOAM_API_TOKEN and OTEL_SERVICE_NAME, " \
22
+ warn "[foam-ruby] Missing required config — set OTEL_FOAM_COLLECTOR_BEARER_TOKEN and OTEL_SERVICE_NAME, " \
23
23
  "or pass token: and service_name: to Foam::Ruby.init"
24
24
  return
25
25
  end
@@ -29,15 +29,18 @@ module Foam
29
29
  require_relative "ruby/middleware"
30
30
 
31
31
  OtelSetup.configure!(config)
32
- setup_rails! if rails_app?
32
+ insert_middleware!
33
+ schedule_logger_attach!
34
+ bridge_sentry!
33
35
  @initialized = true
34
36
  rescue Exception => e # rubocop:disable Lint/RescueException
35
37
  warn "[foam-ruby] init failed: #{e.message}"
36
38
  @initialized = false
37
39
  end
38
40
 
39
- # Re-attaches Foam's processors and logger broadcast in the current
40
- # process. Called by Middleware on first request per worker PID.
41
+ # Ensures Foam's processors and logger broadcast are attached in the
42
+ # current process. Called by Middleware on the first request per worker
43
+ # PID — a single integer comparison on every subsequent request.
41
44
  # Public so non-Rails apps can call it from custom fork hooks.
42
45
  def ensure_worker_setup!
43
46
  return unless initialized?
@@ -90,37 +93,45 @@ module Foam
90
93
  false
91
94
  end
92
95
 
93
- def rails_app?
94
- defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
96
+ def schedule_logger_attach!
97
+ return unless defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
98
+
99
+ ::Rails.application.config.after_initialize { attach_otel_logger! }
100
+ rescue Exception # rubocop:disable Lint/RescueException
101
+ nil
95
102
  end
96
103
 
97
- def setup_rails!
98
- ::Rails.application.middleware.insert(0, Foam::Ruby::Middleware)
104
+ def insert_middleware!
105
+ return unless defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
99
106
 
100
- ::Rails.application.config.after_initialize do
101
- attach_otel_logger!
102
- bridge_sentry!
103
- end
107
+ ::Rails.application.middleware.insert(0, Foam::Ruby::Middleware)
104
108
  rescue Exception # rubocop:disable Lint/RescueException
105
109
  nil
106
110
  end
107
111
 
108
112
  def bridge_sentry!
109
- return unless defined?(::Sentry)
110
-
111
- ::Sentry.singleton_class.prepend(Module.new do
112
- def capture_exception(exception, **options, &block)
113
- Foam::Ruby.capture_exception(exception) if exception.is_a?(::Exception)
114
- super
115
- end
116
- end)
113
+ return unless defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
114
+
115
+ ::Rails.application.config.after_initialize do
116
+ next unless defined?(::Sentry)
117
+
118
+ ::Sentry.singleton_class.prepend(Module.new do
119
+ def capture_exception(exception, **options, &block)
120
+ Foam::Ruby.capture_exception(exception) if exception.is_a?(::Exception)
121
+ super
122
+ end
123
+ end)
124
+ end
117
125
  rescue Exception # rubocop:disable Lint/RescueException
118
126
  nil
119
127
  end
120
128
 
121
129
  def attach_otel_logger!
122
130
  return unless defined?(::Rails) && ::Rails.respond_to?(:logger) && ::Rails.logger
123
- return unless OpenTelemetry.logger_provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
131
+
132
+ unless OpenTelemetry.logger_provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
133
+ return
134
+ end
124
135
 
125
136
  logger = ::Rails.logger
126
137
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foam-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha13
4
+ version: 0.1.0.alpha14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foam
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.1'
97
+ - !ruby/object:Gem::Dependency
98
+ name: opentelemetry-instrumentation-rack
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.24'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.24'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: opentelemetry-instrumentation-rails
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -109,21 +123,21 @@ dependencies:
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0.31'
111
125
  - !ruby/object:Gem::Dependency
112
- name: opentelemetry-instrumentation-rack
126
+ name: opentelemetry-instrumentation-action_pack
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: '0.24'
131
+ version: '0.9'
118
132
  type: :runtime
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: '0.24'
138
+ version: '0.9'
125
139
  - !ruby/object:Gem::Dependency
126
- name: opentelemetry-instrumentation-active_record
140
+ name: opentelemetry-instrumentation-action_view
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
143
  - - "~>"
@@ -137,19 +151,33 @@ dependencies:
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0.7'
139
153
  - !ruby/object:Gem::Dependency
140
- name: opentelemetry-instrumentation-action_pack
154
+ name: opentelemetry-instrumentation-action_mailer
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
157
  - - "~>"
144
158
  - !ruby/object:Gem::Version
145
- version: '0.9'
159
+ version: '0.3'
146
160
  type: :runtime
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
164
  - - "~>"
151
165
  - !ruby/object:Gem::Version
152
- version: '0.9'
166
+ version: '0.3'
167
+ - !ruby/object:Gem::Dependency
168
+ name: opentelemetry-instrumentation-active_record
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.7'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.7'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: opentelemetry-instrumentation-active_support
155
183
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +192,48 @@ dependencies:
164
192
  - - "~>"
165
193
  - !ruby/object:Gem::Version
166
194
  version: '0.6'
195
+ - !ruby/object:Gem::Dependency
196
+ name: opentelemetry-instrumentation-active_job
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.7'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '0.7'
209
+ - !ruby/object:Gem::Dependency
210
+ name: opentelemetry-instrumentation-active_storage
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '0.3'
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '0.3'
223
+ - !ruby/object:Gem::Dependency
224
+ name: opentelemetry-instrumentation-concurrent_ruby
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '0.21'
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '0.21'
167
237
  - !ruby/object:Gem::Dependency
168
238
  name: rake
169
239
  requirement: !ruby/object:Gem::Requirement