Skip to content

Commit 27b97f4

Browse files
committed
wip
1 parent bc2cce1 commit 27b97f4

File tree

3 files changed

+73
-18
lines changed

3 files changed

+73
-18
lines changed

instrumentation/base/lib/opentelemetry/instrumentation/base.rb

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ def initialize(name, version, install_blk, present_blk,
208208
@installed = false
209209
@options = options
210210
@tracer = OpenTelemetry::Trace::Tracer.new # default no-op tracer
211-
@meter = OpenTelemetry::Metrics::Meter.new # default no-op meter
211+
212+
@meter = OpenTelemetry::Metrics::Meter.new if defined?(OpenTelemetry::Meter) # default no-op meter
212213
end
213214
# rubocop:enable Metrics/ParameterLists
214215

@@ -221,15 +222,15 @@ def install(config = {})
221222
return true if installed?
222223

223224
@config = config_options(config)
225+
226+
set_metrics_enabled
227+
224228
return false unless installable?(config)
225229

226230
instance_exec(@config, &@install_blk)
227231
@tracer = OpenTelemetry.tracer_provider.tracer(name, version)
228-
232+
@meter = OpenTelemetry.meter_provider.meter(name, version: version) if metrics_enabled?
229233
@installed = true
230-
231-
return unless config[:metrics]
232-
@meter = OpenTelemetry.meter_provider.meter(name, version: version)
233234
end
234235

235236
# Whether or not this instrumentation is installable in the current process. Will
@@ -269,8 +270,25 @@ def enabled?(config = nil)
269270
true
270271
end
271272

273+
# This is based on a variety of factors, and should be invalidated when @config changes.
274+
# It should be explicitly set via `set_metrics_enabled` for now.
275+
def metrics_enabled?
276+
!!@metrics_enabled
277+
end
278+
279+
# @api private
280+
def with_meter
281+
yield @meter if metrics_enabled?
282+
end
283+
272284
private
273285

286+
def set_metrics_enabled
287+
return unless defined?(OpenTelemetry::Metrics)
288+
289+
@metrics_enabled = !!@config[:metrics] || metrics_enabled_by_env_var?
290+
end
291+
274292
# The config_options method is responsible for validating that the user supplied
275293
# config hash is valid.
276294
# Unknown configuration keys are not included in the final config hash.
@@ -334,6 +352,16 @@ def enabled_by_env_var?
334352
ENV[var_name] != 'false'
335353
end
336354

355+
def metrics_enabled_by_env_var?
356+
var_name = name.dup
357+
var_name.upcase!
358+
var_name.gsub!('::', '_')
359+
var_name.gsub!('OPENTELEMETRY_', 'OTEL_RUBY_')
360+
var_name << 'METRICS_ENABLED'
361+
362+
ENV[var_name] != 'false'
363+
end
364+
337365
# Checks to see if the user has passed any environment variables that set options
338366
# for instrumentation. By convention, the environment variable will be the name
339367
# of the instrumentation, uppercased, with '::' replaced by underscores,

instrumentation/sidekiq/lib/opentelemetry/instrumentation/sidekiq/instrumentation.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,21 @@ class Instrumentation < OpenTelemetry::Instrumentation::Base
109109
option :peer_service, default: nil, validate: :string
110110
option :metrics, default: false, validate: :boolean
111111

112+
# FIXME: upstream
113+
def get_counter(name, description: nil)
114+
return unless metrics_enabled?
115+
116+
binding.pry
117+
# FIXME: structural keys
118+
# FIXME: mutex counter creation (& reads?)
119+
INSTRUMENTS[[name, description]] ||= meter.create_counter(name, description: description)
120+
end
121+
112122
private
113123

124+
# FIXME: upstream
125+
INSTRUMENTS = {}
126+
114127
def gem_version
115128
Gem::Version.new(::Sidekiq::VERSION)
116129
end

instrumentation/sidekiq/lib/opentelemetry/instrumentation/sidekiq/middlewares/client/tracer_middleware.rb

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,36 +35,50 @@ def call(_worker_class, job, _queue, _redis_pool)
3535
yield
3636
end.tap do
3737
# FIXME: is it possible to detect failures here? Does sidekiq bubble them up the middlewares?
38-
if instrumentation_config[:metrics]
39-
begin
40-
counter_attributes = {
41-
'messaging.operation.name' => 'enqueue', # FIXME: metrics semconv
42-
'messaging.system' => 'sidekiq', # FIXME: metrics semconv
43-
'messaging.destination.name' => job['queue'] # FIXME: metrics semconv
38+
with_meter do |meter|
39+
counter_attributes = metrics_attributes(job).merge(
40+
{
41+
'messaging.operation.name' => 'enqueue' # FIXME: metrics semconv
4442
# server.address => # FIXME: required if available
4543
# messaging.destination.partition.id => FIXME: recommended
4644
# server.port => # FIXME: recommended
4745
}
46+
)
4847

49-
counter = meter.create_counter('messaging.client.sent.messages')
50-
counter.add(1, attributes: counter_attributes)
51-
end
48+
# FIXME: avoid create_counter repetition?
49+
binding.pry
50+
counter = instrumentation.get_counter('messaging.client.sent.messages')
51+
counter.add(1, attributes: counter_attributes)
5252
end
5353
end
5454
end
5555

5656
private
5757

58+
def instrumentation
59+
Sidekiq::Instrumentation.instance
60+
end
61+
5862
def instrumentation_config
59-
Sidekiq::Instrumentation.instance.config
63+
instrumentation.config
6064
end
6165

6266
def tracer
63-
Sidekiq::Instrumentation.instance.tracer
67+
instrumentation.tracer
6468
end
6569

66-
def meter
67-
Sidekiq::Instrumentation.instance.meter
70+
def with_meter(&block)
71+
instrumentation.with_meter(&block)
72+
end
73+
74+
def metrics_attributes(job)
75+
{
76+
'messaging.system' => 'sidekiq', # FIXME: metrics semconv
77+
'messaging.destination.name' => job['queue'] # FIXME: metrics semconv
78+
# server.address => # FIXME: required if available
79+
# messaging.destination.partition.id => FIXME: recommended
80+
# server.port => # FIXME: recommended
81+
}
6882
end
6983
end
7084
end

0 commit comments

Comments
 (0)