foam-ruby 0.1.0.alpha12 → 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 +4 -4
- data/lib/foam/ruby/otel_setup.rb +39 -38
- data/lib/foam/ruby/version.rb +1 -1
- data/lib/foam/ruby.rb +21 -32
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d499bfb9b269432b8a581f296cc917118d8da08c18ec8bcd0804d099b93a4e46
|
|
4
|
+
data.tar.gz: 30ed5cf79368e4b044562f9eb8e5385e72af60bf6f91a53826f47aebe01816d4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 01ad0c424faf4ab05e52ecff9ddb5f5695ed0ed18006f6b53a58af7950f2aedc5f66f92c9af2bfa632a7ea7512a5d4864a8210dc627cabe02277921f6d20d2ee
|
|
7
|
+
data.tar.gz: 53732245e699e9198dbaf25c43426e0a9811dc3901b45a93dcdadbeb15b12195c95cb2f35d4d81676481f55844c2858ccb0eef8ae9331037801f65bf418f879e
|
data/lib/foam/ruby/otel_setup.rb
CHANGED
|
@@ -19,21 +19,47 @@ module Foam
|
|
|
19
19
|
|
|
20
20
|
module_function
|
|
21
21
|
|
|
22
|
+
# -- public API (called from Foam::Ruby + Middleware) --
|
|
23
|
+
|
|
22
24
|
def configure!(config)
|
|
25
|
+
require_instrumentations!
|
|
23
26
|
configure_traces(config)
|
|
24
27
|
configure_logs(config)
|
|
25
28
|
end
|
|
26
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
|
+
|
|
27
54
|
def require_instrumentations!
|
|
28
|
-
INSTRUMENTATIONS.each do |
|
|
29
|
-
require
|
|
55
|
+
INSTRUMENTATIONS.each do |name|
|
|
56
|
+
require name
|
|
30
57
|
rescue LoadError
|
|
31
58
|
nil
|
|
32
59
|
end
|
|
33
60
|
end
|
|
34
61
|
|
|
35
62
|
def configure_traces(config)
|
|
36
|
-
require_instrumentations!
|
|
37
63
|
@foam_span_processor = OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
|
|
38
64
|
OpenTelemetry::Exporter::OTLP::Exporter.new(
|
|
39
65
|
endpoint: config.traces_endpoint,
|
|
@@ -41,9 +67,9 @@ module Foam
|
|
|
41
67
|
)
|
|
42
68
|
)
|
|
43
69
|
|
|
44
|
-
|
|
45
|
-
if
|
|
46
|
-
|
|
70
|
+
provider = OpenTelemetry.tracer_provider
|
|
71
|
+
if provider.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
|
|
72
|
+
provider.add_span_processor(@foam_span_processor)
|
|
47
73
|
install_instrumentations!
|
|
48
74
|
else
|
|
49
75
|
OpenTelemetry::SDK.configure do |c|
|
|
@@ -56,26 +82,6 @@ module Foam
|
|
|
56
82
|
@attached_provider = OpenTelemetry.tracer_provider
|
|
57
83
|
end
|
|
58
84
|
|
|
59
|
-
def install_instrumentations!
|
|
60
|
-
registry = OpenTelemetry::Instrumentation.registry
|
|
61
|
-
return unless registry
|
|
62
|
-
|
|
63
|
-
registry.each do |instrumentation|
|
|
64
|
-
instrumentation.install unless instrumentation.installed?
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def ensure_processor_attached!
|
|
69
|
-
return unless @foam_span_processor
|
|
70
|
-
|
|
71
|
-
current = OpenTelemetry.tracer_provider
|
|
72
|
-
return if current.equal?(@attached_provider)
|
|
73
|
-
return unless current.is_a?(OpenTelemetry::SDK::Trace::TracerProvider)
|
|
74
|
-
|
|
75
|
-
current.add_span_processor(@foam_span_processor)
|
|
76
|
-
@attached_provider = current
|
|
77
|
-
end
|
|
78
|
-
|
|
79
85
|
def configure_logs(config)
|
|
80
86
|
@foam_log_processor = OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(
|
|
81
87
|
OpenTelemetry::Exporter::OTLP::Logs::LogsExporter.new(
|
|
@@ -84,9 +90,9 @@ module Foam
|
|
|
84
90
|
)
|
|
85
91
|
)
|
|
86
92
|
|
|
87
|
-
|
|
88
|
-
if
|
|
89
|
-
|
|
93
|
+
provider = OpenTelemetry.logger_provider
|
|
94
|
+
if provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
|
|
95
|
+
provider.add_log_record_processor(@foam_log_processor)
|
|
90
96
|
else
|
|
91
97
|
resource = OpenTelemetry::SDK::Resources::Resource.create(
|
|
92
98
|
"service.name" => config.service_name,
|
|
@@ -100,15 +106,10 @@ module Foam
|
|
|
100
106
|
@attached_logger_provider = OpenTelemetry.logger_provider
|
|
101
107
|
end
|
|
102
108
|
|
|
103
|
-
def
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return if current.equal?(@attached_logger_provider)
|
|
108
|
-
return unless current.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
|
|
109
|
-
|
|
110
|
-
current.add_log_record_processor(@foam_log_processor)
|
|
111
|
-
@attached_logger_provider = current
|
|
109
|
+
def install_instrumentations!
|
|
110
|
+
OpenTelemetry::Instrumentation.registry&.each do |instrumentation|
|
|
111
|
+
instrumentation.install unless instrumentation.installed?
|
|
112
|
+
end
|
|
112
113
|
end
|
|
113
114
|
end
|
|
114
115
|
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 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
|
-
|
|
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
|
-
#
|
|
42
|
-
#
|
|
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
|
|
97
|
-
|
|
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
|
|
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?(::
|
|
114
|
-
|
|
115
|
-
::
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|