foam-ruby 0.1.0.alpha11 → 0.1.0.alpha13

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: d11bbb00722285e3f5067846a74672e3db19c6f01a747dbb42cd5f6d39301249
4
- data.tar.gz: 215a14be456423046f861db934ef9a4ff81858a43092a20c8723d96d2ab33208
3
+ metadata.gz: d499bfb9b269432b8a581f296cc917118d8da08c18ec8bcd0804d099b93a4e46
4
+ data.tar.gz: 30ed5cf79368e4b044562f9eb8e5385e72af60bf6f91a53826f47aebe01816d4
5
5
  SHA512:
6
- metadata.gz: 8dccca7b49de454e8ef27e53b0fa3666b1edc3e0de7724758b8adcbd7394ff197ddca5afedb3108e758d1699b11e9f92d256db158361eec2371fc03e4bc0a87a
7
- data.tar.gz: a0ba57ba2fe9e56fdcfc46a32af1076bfe33c36840effaa5e6b51c13ccef63a077eefea4ec407ae99a15803bd75503b6d3bd10b97cc4beffb031d9ee8d27f41b
6
+ metadata.gz: 01ad0c424faf4ab05e52ecff9ddb5f5695ed0ed18006f6b53a58af7950f2aedc5f66f92c9af2bfa632a7ea7512a5d4864a8210dc627cabe02277921f6d20d2ee
7
+ data.tar.gz: 53732245e699e9198dbaf25c43426e0a9811dc3901b45a93dcdadbeb15b12195c95cb2f35d4d81676481f55844c2858ccb0eef8ae9331037801f65bf418f879e
@@ -9,13 +9,56 @@ require "opentelemetry-logs-sdk"
9
9
  module Foam
10
10
  module Ruby
11
11
  module OtelSetup
12
+ INSTRUMENTATIONS = %w[
13
+ opentelemetry-instrumentation-rack
14
+ opentelemetry-instrumentation-rails
15
+ opentelemetry-instrumentation-action_pack
16
+ opentelemetry-instrumentation-active_record
17
+ opentelemetry-instrumentation-active_support
18
+ ].freeze
19
+
12
20
  module_function
13
21
 
22
+ # -- public API (called from Foam::Ruby + Middleware) --
23
+
14
24
  def configure!(config)
25
+ require_instrumentations!
15
26
  configure_traces(config)
16
27
  configure_logs(config)
17
28
  end
18
29
 
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
+ def require_instrumentations!
55
+ INSTRUMENTATIONS.each do |name|
56
+ require name
57
+ rescue LoadError
58
+ nil
59
+ end
60
+ end
61
+
19
62
  def configure_traces(config)
20
63
  @foam_span_processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
21
64
  OpenTelemetry::Exporter::OTLP::Exporter.new(
@@ -24,9 +67,9 @@ module Foam
24
67
  )
25
68
  )
26
69
 
27
- existing = OpenTelemetry.tracer_provider
28
- if existing.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
29
- existing.add_span_processor(@foam_span_processor)
70
+ provider = OpenTelemetry.tracer_provider
71
+ if provider.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
72
+ provider.add_span_processor(@foam_span_processor)
30
73
  install_instrumentations!
31
74
  else
32
75
  OpenTelemetry::SDK.configure do |c|
@@ -39,26 +82,6 @@ module Foam
39
82
  @attached_provider = OpenTelemetry.tracer_provider
40
83
  end
41
84
 
42
- def install_instrumentations!
43
- registry = OpenTelemetry::Instrumentation.registry
44
- return unless registry
45
-
46
- registry.each do |instrumentation|
47
- instrumentation.install unless instrumentation.installed?
48
- end
49
- end
50
-
51
- def ensure_processor_attached!
52
- return unless @foam_span_processor
53
-
54
- current = OpenTelemetry.tracer_provider
55
- return if current.equal?(@attached_provider)
56
- return unless current.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
57
-
58
- current.add_span_processor(@foam_span_processor)
59
- @attached_provider = current
60
- end
61
-
62
85
  def configure_logs(config)
63
86
  @foam_log_processor = OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(
64
87
  OpenTelemetry::Exporter::OTLP::Logs::LogsExporter.new(
@@ -67,9 +90,9 @@ module Foam
67
90
  )
68
91
  )
69
92
 
70
- existing = OpenTelemetry.logger_provider
71
- if existing.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
72
- existing.add_log_record_processor(@foam_log_processor)
93
+ provider = OpenTelemetry.logger_provider
94
+ if provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
95
+ provider.add_log_record_processor(@foam_log_processor)
73
96
  else
74
97
  resource = OpenTelemetry::SDK::Resources::Resource.create(
75
98
  "service.name" => config.service_name,
@@ -83,15 +106,10 @@ module Foam
83
106
  @attached_logger_provider = OpenTelemetry.logger_provider
84
107
  end
85
108
 
86
- def ensure_log_processor_attached!
87
- return unless @foam_log_processor
88
-
89
- current = OpenTelemetry.logger_provider
90
- return if current.equal?(@attached_logger_provider)
91
- return unless current.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
92
-
93
- current.add_log_record_processor(@foam_log_processor)
94
- @attached_logger_provider = current
109
+ def install_instrumentations!
110
+ OpenTelemetry::Instrumentation.registry&.each do |instrumentation|
111
+ instrumentation.install unless instrumentation.installed?
112
+ end
95
113
  end
96
114
  end
97
115
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Foam
4
4
  module Ruby
5
- VERSION = "0.1.0.alpha11"
5
+ VERSION = "0.1.0.alpha13"
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 OTEL_FOAM_COLLECTOR_BEARER_TOKEN and OTEL_SERVICE_NAME, " \
22
+ warn "[foam-ruby] Missing required config — set FOAM_API_TOKEN and OTEL_SERVICE_NAME, " \
23
23
  "or pass token: and service_name: to Foam::Ruby.init"
24
24
  return
25
25
  end
@@ -29,18 +29,15 @@ module Foam
29
29
  require_relative "ruby/middleware"
30
30
 
31
31
  OtelSetup.configure!(config)
32
- insert_middleware!
33
- schedule_logger_attach!
34
- bridge_sentry!
32
+ setup_rails! if rails_app?
35
33
  @initialized = true
36
34
  rescue Exception => e # rubocop:disable Lint/RescueException
37
35
  warn "[foam-ruby] init failed: #{e.message}"
38
36
  @initialized = false
39
37
  end
40
38
 
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.
39
+ # Re-attaches Foam's processors and logger broadcast in the current
40
+ # process. Called by Middleware on first request per worker PID.
44
41
  # Public so non-Rails apps can call it from custom fork hooks.
45
42
  def ensure_worker_setup!
46
43
  return unless initialized?
@@ -93,45 +90,37 @@ module Foam
93
90
  false
94
91
  end
95
92
 
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
93
+ def rails_app?
94
+ defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
102
95
  end
103
96
 
104
- def insert_middleware!
105
- return unless defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
106
-
97
+ def setup_rails!
107
98
  ::Rails.application.middleware.insert(0, Foam::Ruby::Middleware)
99
+
100
+ ::Rails.application.config.after_initialize do
101
+ attach_otel_logger!
102
+ bridge_sentry!
103
+ end
108
104
  rescue Exception # rubocop:disable Lint/RescueException
109
105
  nil
110
106
  end
111
107
 
112
108
  def bridge_sentry!
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
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)
125
117
  rescue Exception # rubocop:disable Lint/RescueException
126
118
  nil
127
119
  end
128
120
 
129
121
  def attach_otel_logger!
130
122
  return unless defined?(::Rails) && ::Rails.respond_to?(:logger) && ::Rails.logger
131
-
132
- unless OpenTelemetry.logger_provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
133
- return
134
- end
123
+ return unless OpenTelemetry.logger_provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
135
124
 
136
125
  logger = ::Rails.logger
137
126
 
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.alpha11
4
+ version: 0.1.0.alpha13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Foam