foam-ruby 0.1.0.alpha8 → 0.1.0.alpha9

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: a4435b32248c007790701a7de2054f702398a2f1881bcaa571f20f209825d5e8
4
- data.tar.gz: 82a9836aa895f5b1b70ace7b441dd288997ff7e2772a5c1e5f7742a2fa22dcc6
3
+ metadata.gz: 87d1563f7f755555866b2b250981864ab47631e4bd751bbc9b9c74cc039bcf3f
4
+ data.tar.gz: 12f4674411cdc386042fca764ec96b7e38c4c19a7632a913b8b940bc0cfa8df5
5
5
  SHA512:
6
- metadata.gz: 8e3792c185a39b7470ddf0b0037580fcf45ed9f906d4834ea28bd837422df5fbb365109f9525fae66e7cb68121844ad119f38228d83bcfb0946965fbf6b005d2
7
- data.tar.gz: 4fab2024d4ef4e8fe3601e3836e8af28544feaefd41d80e929721f651ac7ba84c034810dc923d90bf9a540ac335dd6c25db7d4567ea30b3c039f61abd9115a84
6
+ metadata.gz: ae75e5573553e9e9dc3df56dfd474a80ea1aebdabf47868524ceed505d7cdfbdc7d8b20721dcf85c8d97a4711d802d7fe3a2678b2ca47651f39d37585426db21
7
+ data.tar.gz: c6f2ac7466bd9d53c2d434d43f0f8378a396ed859a1dae5af523d18ce7564a3242c87eea117bd07179b2f181b415204ba57997288b8b393d75223b1fd6b72baa
@@ -24,13 +24,14 @@ module Foam
24
24
  }.freeze
25
25
 
26
26
  def initialize
27
- @otel_logger = OpenTelemetry.logger_provider.logger(name: "foam-ruby")
27
+ @logger_name = "foam-ruby"
28
28
  end
29
29
 
30
30
  def emit(severity, message)
31
31
  return if message.nil? || (message.respond_to?(:empty?) && message.empty?)
32
32
 
33
- @otel_logger.on_emit(
33
+ otel_logger = OpenTelemetry.logger_provider.logger(name: @logger_name)
34
+ otel_logger.on_emit(
34
35
  body: message.to_s,
35
36
  severity_number: SEVERITY_MAP.fetch(severity, OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_INFO),
36
37
  severity_text: SEVERITY_TEXT.fetch(severity, "INFO"),
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Foam
4
+ module Ruby
5
+ class Middleware
6
+ def initialize(app)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ Foam::Ruby.ensure_worker_setup!
12
+ @app.call(env)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Foam
4
4
  module Ruby
5
- VERSION = "0.1.0.alpha8"
5
+ VERSION = "0.1.0.alpha9"
6
6
  end
7
7
  end
data/lib/foam/ruby.rb CHANGED
@@ -11,6 +11,7 @@ module Foam
11
11
  end
12
12
 
13
13
  def init(token: nil, service_name: nil)
14
+ return if initialized?
14
15
  return unless production?
15
16
 
16
17
  config = configuration
@@ -24,10 +25,10 @@ module Foam
24
25
 
25
26
  require_relative "ruby/otel_setup"
26
27
  require_relative "ruby/log_subscriber"
28
+ require_relative "ruby/middleware"
27
29
 
28
30
  OtelSetup.configure!(config)
29
- schedule_trace_reattach!
30
- schedule_logger_attach!
31
+ insert_middleware!
31
32
  bridge_sentry!
32
33
  @initialized = true
33
34
  rescue Exception => e # rubocop:disable Lint/RescueException
@@ -35,6 +36,24 @@ module Foam
35
36
  @initialized = false
36
37
  end
37
38
 
39
+ # Ensures Foam's processors and logger broadcast are attached in the
40
+ # current process. Called by Middleware on the first request per worker
41
+ # PID — a single integer comparison on every subsequent request.
42
+ # Public so non-Rails apps can call it from custom fork hooks.
43
+ def ensure_worker_setup!
44
+ return unless initialized?
45
+
46
+ pid = Process.pid
47
+ return if @worker_pid == pid
48
+ @worker_pid = pid
49
+
50
+ OtelSetup.ensure_processor_attached!
51
+ OtelSetup.ensure_log_processor_attached!
52
+ attach_otel_logger!
53
+ rescue Exception # rubocop:disable Lint/RescueException
54
+ nil
55
+ end
56
+
38
57
  def capture_exception(error, attributes: {})
39
58
  return unless initialized?
40
59
 
@@ -72,14 +91,10 @@ module Foam
72
91
  false
73
92
  end
74
93
 
75
- def schedule_logger_attach!
76
- return unless defined?(::Rails)
94
+ def insert_middleware!
95
+ return unless defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
77
96
 
78
- if ::Rails.respond_to?(:application) && ::Rails.application
79
- ::Rails.application.config.after_initialize { do_attach_otel_logger! }
80
- else
81
- do_attach_otel_logger!
82
- end
97
+ ::Rails.application.middleware.insert(0, Foam::Ruby::Middleware)
83
98
  rescue Exception # rubocop:disable Lint/RescueException
84
99
  nil
85
100
  end
@@ -101,31 +116,30 @@ module Foam
101
116
  nil
102
117
  end
103
118
 
104
- def schedule_trace_reattach!
105
- return unless defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
119
+ def attach_otel_logger!
120
+ return unless defined?(::Rails) && ::Rails.respond_to?(:logger) && ::Rails.logger
106
121
 
107
- ::Rails.application.config.after_initialize do
108
- OtelSetup.ensure_processor_attached!
109
- OtelSetup.ensure_log_processor_attached!
122
+ unless OpenTelemetry.logger_provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
123
+ return
110
124
  end
111
- rescue Exception # rubocop:disable Lint/RescueException
112
- nil
113
- end
114
125
 
115
- def do_attach_otel_logger!
116
- return unless ::Rails.respond_to?(:logger) && ::Rails.logger
126
+ logger = ::Rails.logger
117
127
 
118
- unless OpenTelemetry.logger_provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
119
- return
128
+ if logger.respond_to?(:broadcasts)
129
+ return if logger.broadcasts.any? { |l| l.is_a?(OtelLogger) }
130
+ else
131
+ return if logger.equal?(@attached_rails_logger)
120
132
  end
121
133
 
122
134
  otel_logger = OtelLogger.new
123
135
 
124
- if ::Rails.logger.respond_to?(:broadcast_to)
125
- ::Rails.logger.broadcast_to(otel_logger)
136
+ if logger.respond_to?(:broadcast_to)
137
+ logger.broadcast_to(otel_logger)
126
138
  elsif defined?(::ActiveSupport::Logger) && ::ActiveSupport::Logger.respond_to?(:broadcast)
127
- ::Rails.logger.extend(::ActiveSupport::Logger.broadcast(otel_logger))
139
+ logger.extend(::ActiveSupport::Logger.broadcast(otel_logger))
128
140
  end
141
+
142
+ @attached_rails_logger = logger
129
143
  rescue Exception # rubocop:disable Lint/RescueException
130
144
  nil
131
145
  end
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.alpha8
4
+ version: 0.1.0.alpha9
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-15 00:00:00.000000000 Z
11
+ date: 2026-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -218,6 +218,7 @@ files:
218
218
  - lib/foam/ruby.rb
219
219
  - lib/foam/ruby/configuration.rb
220
220
  - lib/foam/ruby/log_subscriber.rb
221
+ - lib/foam/ruby/middleware.rb
221
222
  - lib/foam/ruby/otel_setup.rb
222
223
  - lib/foam/ruby/version.rb
223
224
  homepage: https://github.com/nicktesh/packages