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 +4 -4
- data/lib/foam/ruby/configuration.rb +1 -1
- data/lib/foam/ruby/otel_setup.rb +55 -39
- data/lib/foam/ruby/version.rb +1 -1
- data/lib/foam/ruby.rb +32 -21
- metadata +78 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d3d94dd6da1d8be5d17fffeae51f7f05e8d324f2c8969490c761d683cb64fd38
|
|
4
|
+
data.tar.gz: 790fadb6fbe21745a5b8042acb589e463a1f8efe6f390125c6d8fb086203a7b4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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["
|
|
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
|
data/lib/foam/ruby/otel_setup.rb
CHANGED
|
@@ -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 |
|
|
56
|
-
require
|
|
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
|
-
|
|
71
|
-
if
|
|
72
|
-
|
|
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
|
-
|
|
94
|
-
if
|
|
95
|
-
|
|
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
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
data/lib/foam/ruby/version.rb
CHANGED
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
|
|
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
|
-
|
|
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
|
-
#
|
|
40
|
-
# process. Called by Middleware on first request per worker
|
|
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
|
|
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
|
|
98
|
-
::Rails.application
|
|
104
|
+
def insert_middleware!
|
|
105
|
+
return unless defined?(::Rails) && ::Rails.respond_to?(:application) && ::Rails.application
|
|
99
106
|
|
|
100
|
-
::Rails.application.
|
|
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?(::
|
|
110
|
-
|
|
111
|
-
::
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
138
|
+
version: '0.9'
|
|
125
139
|
- !ruby/object:Gem::Dependency
|
|
126
|
-
name: opentelemetry-instrumentation-
|
|
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-
|
|
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.
|
|
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.
|
|
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
|