Skip to content

Commit 1964fde

Browse files
mwearfbogsany
andauthored
feat!: replace getter and setter callables and remove rack specific propagators (#589)
* feat: introduce Getter class with keys; remove default getter callable * refactor: remove propagation.http/text; use getter instead * feat: add TextMapSetter; replace setter callable * refactor: remove rack extractors * refactor: use TextMapSetter in Propagator and CompositePropagator * docs: cleanup pass through documentation * Update api/test/opentelemetry/context/propagation/rack_env_getter_test.rb Co-authored-by: Francis Bogsanyi <[email protected]> * refactor: use kwargs for Propagator#inject / extract Co-authored-by: Francis Bogsanyi <[email protected]>
1 parent 03a6156 commit 1964fde

File tree

59 files changed

+490
-565
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+490
-565
lines changed

api/lib/opentelemetry.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
module OpenTelemetry
2323
extend self
2424

25-
attr_writer :tracer_provider, :meter_provider, :baggage, :logger, :error_handler
25+
attr_writer :tracer_provider, :meter_provider, :propagation, :baggage,
26+
:logger, :error_handler
2627

2728
# @return [Object, Logger] configured Logger or a default STDOUT Logger.
2829
def logger
@@ -68,8 +69,11 @@ def baggage
6869
@baggage ||= Baggage::Manager.new
6970
end
7071

71-
# @return [Context::Propagation::Propagation] an instance of the propagation API
72+
# @return [Context::Propagation::Propagator] a propagator instance
7273
def propagation
73-
@propagation ||= Context::Propagation::Propagation.new
74+
@propagation ||= Context::Propagation::Propagator.new(
75+
Context::Propagation::NoopInjector.new,
76+
Context::Propagation::NoopExtractor.new
77+
)
7478
end
7579
end

api/lib/opentelemetry/baggage/propagation.rb

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,11 @@ module Baggage
1515
module Propagation
1616
extend self
1717

18+
BAGGAGE_KEY = 'baggage'
1819
TEXT_MAP_EXTRACTOR = TextMapExtractor.new
1920
TEXT_MAP_INJECTOR = TextMapInjector.new
20-
RACK_EXTRACTOR = TextMapExtractor.new(
21-
baggage_key: 'HTTP_BAGGAGE'
22-
)
23-
RACK_INJECTOR = TextMapInjector.new(
24-
baggage_key: 'HTTP_BAGGAGE'
25-
)
2621

27-
private_constant :TEXT_MAP_INJECTOR, :TEXT_MAP_EXTRACTOR, :RACK_INJECTOR,
28-
:RACK_EXTRACTOR
22+
private_constant :BAGGAGE_KEY, :TEXT_MAP_INJECTOR, :TEXT_MAP_EXTRACTOR
2923

3024
# Returns an extractor that extracts context using the W3C Baggage
3125
# format
@@ -38,20 +32,6 @@ def text_map_injector
3832
def text_map_extractor
3933
TEXT_MAP_EXTRACTOR
4034
end
41-
42-
# Returns an extractor that extracts context using the W3C Baggage
43-
# format with Rack normalized keys (upcased and prefixed with
44-
# HTTP_)
45-
def rack_injector
46-
RACK_INJECTOR
47-
end
48-
49-
# Returns an injector that injects context using the W3C Baggage
50-
# format with Rack normalized keys (upcased and prefixed with
51-
# HTTP_)
52-
def rack_extractor
53-
RACK_EXTRACTOR
54-
end
5535
end
5636
end
5737
end

api/lib/opentelemetry/baggage/propagation/text_map_extractor.rb

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,30 @@ module Baggage
1111
module Propagation
1212
# Extracts baggage from carriers in the W3C Baggage format
1313
class TextMapExtractor
14-
include Context::Propagation::DefaultGetter
15-
1614
# Returns a new TextMapExtractor that extracts context using the specified
17-
# header key
15+
# getter
1816
#
19-
# @param [String] baggage_key The baggage header
20-
# key used in the carrier
17+
# @param [optional Getter] default_getter The default getter used to read
18+
# headers from a carrier during extract. Defaults to a
19+
# {OpenTelemetry::Context::Propagation::TextMapGetter} instance.
2120
# @return [TextMapExtractor]
22-
def initialize(baggage_key: 'baggage')
23-
@baggage_key = baggage_key
21+
def initialize(default_getter = Context::Propagation.text_map_getter)
22+
@default_getter = default_getter
2423
end
2524

2625
# Extract remote baggage from the supplied carrier.
2726
# If extraction fails, the original context will be returned
2827
#
2928
# @param [Carrier] carrier The carrier to get the header from
3029
# @param [Context] context The context to be updated with extracted baggage
31-
# @param [optional Callable] getter An optional callable that takes a carrier and a key and
32-
# returns the value associated with the key. If omitted the default getter will be used
33-
# which expects the carrier to respond to [] and []=.
34-
# @yield [Carrier, String] if an optional getter is provided, extract will yield the carrier
35-
# and the header key to the getter.
30+
# @param [optional Getter] getter If the optional getter is provided, it
31+
# will be used to read the header from the carrier, otherwise the default
32+
# getter will be used.
3633
# @return [Context] context updated with extracted baggage, or the original context
3734
# if extraction fails
38-
def extract(carrier, context, &getter)
39-
getter ||= default_getter
40-
header = getter.call(carrier, @baggage_key)
35+
def extract(carrier, context, getter = nil)
36+
getter ||= @default_getter
37+
header = getter.get(carrier, BAGGAGE_KEY)
4138

4239
entries = header.gsub(/\s/, '').split(',')
4340

api/lib/opentelemetry/baggage/propagation/text_map_injector.rb

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,30 @@ module Baggage
1111
module Propagation
1212
# Injects baggage using the W3C Baggage format
1313
class TextMapInjector
14-
include Context::Propagation::DefaultSetter
15-
1614
# Returns a new TextMapInjector that injects context using the specified
17-
# header key
15+
# setter
1816
#
19-
# @param [String] baggage_key The baggage header
20-
# key used in the carrier
17+
# @param [optional Setter] default_setter The default setter used to
18+
# write context into a carrier during inject. Defaults to a
19+
# {OpenTelemetry::Context::Propagation::TextMapSetter} instance.
2120
# @return [TextMapInjector]
22-
def initialize(baggage_key: 'baggage')
23-
@baggage_key = baggage_key
21+
def initialize(default_setter = Context::Propagation.text_map_setter)
22+
@default_setter = default_setter
2423
end
2524

2625
# Inject in-process baggage into the supplied carrier.
2726
#
2827
# @param [Carrier] carrier The carrier to inject baggage into
2928
# @param [Context] context The context to read baggage from
30-
# @param [optional Callable] getter An optional callable that takes a carrier and a key and
31-
# returns the value associated with the key. If omitted the default getter will be used
32-
# which expects the carrier to respond to [] and []=.
33-
# @yield [Carrier, String] if an optional getter is provided, inject will yield the carrier
34-
# and the header key to the getter.
29+
# @param [optional Setter] setter If the optional setter is provided, it
30+
# will be used to write context into the carrier, otherwise the default
31+
# setter will be used.
3532
# @return [Object] carrier with injected baggage
36-
def inject(carrier, context, &setter)
33+
def inject(carrier, context, setter = nil)
3734
return carrier unless (baggage = context[ContextKeys.baggage_key]) && !baggage.empty?
3835

39-
setter ||= default_setter
40-
setter.call(carrier, @baggage_key, encode(baggage))
36+
setter ||= @default_setter
37+
setter.set(carrier, BAGGAGE_KEY, encode(baggage))
4138

4239
carrier
4340
end

api/lib/opentelemetry/context/propagation.rb

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,43 @@
55
# SPDX-License-Identifier: Apache-2.0
66

77
require 'opentelemetry/context/propagation/composite_propagator'
8-
require 'opentelemetry/context/propagation/default_getter'
9-
require 'opentelemetry/context/propagation/default_setter'
108
require 'opentelemetry/context/propagation/noop_extractor'
119
require 'opentelemetry/context/propagation/noop_injector'
12-
require 'opentelemetry/context/propagation/propagation'
1310
require 'opentelemetry/context/propagation/propagator'
11+
require 'opentelemetry/context/propagation/text_map_getter'
12+
require 'opentelemetry/context/propagation/text_map_setter'
13+
require 'opentelemetry/context/propagation/rack_env_getter'
1414

1515
module OpenTelemetry
1616
class Context
1717
# The propagation module contains APIs and utilities to interact with context
1818
# and propagate across process boundaries.
1919
module Propagation
20+
extend self
21+
22+
TEXT_MAP_GETTER = TextMapGetter.new
23+
TEXT_MAP_SETTER = TextMapSetter.new
24+
RACK_ENV_GETTER = RackEnvGetter.new
25+
26+
private_constant :TEXT_MAP_GETTER, :TEXT_MAP_SETTER, :RACK_ENV_GETTER
27+
28+
# Returns a {TextMapGetter} instance suitable for reading values from a
29+
# hash-like carrier
30+
def text_map_getter
31+
TEXT_MAP_GETTER
32+
end
33+
34+
# Returns a {TextMapSetter} instance suitable for writing values into a
35+
# hash-like carrier
36+
def text_map_setter
37+
TEXT_MAP_SETTER
38+
end
39+
40+
# Returns a {RackEnvGetter} instance suitable for reading values from a
41+
# Rack environment.
42+
def rack_env_getter
43+
RACK_ENV_GETTER
44+
end
2045
end
2146
end
2247
end

api/lib/opentelemetry/context/propagation/composite_propagator.rb

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,14 @@ def initialize(injectors, extractors)
3030
# context into
3131
# @param [optional Context] context Context to be injected into carrier.
3232
# Defaults to +Context.current+
33-
# @param [optional Callable] setter An optional callable that takes a
34-
# carrier, a key and a value and assigns the key-value pair in the
35-
# carrier. If omitted the default setter will be used which expects
36-
# the carrier to respond to [] and []=.
33+
# @param [optional Setter] setter If the optional setter is provided, it
34+
# will be used to write context into the carrier, otherwise the default
35+
# setter will be used.
3736
#
3837
# @return [Object] carrier
39-
def inject(carrier, context = Context.current, &setter)
38+
def inject(carrier, context: Context.current, setter: Context::Propagation.text_map_setter)
4039
@injectors.inject(carrier) do |memo, injector|
41-
injector.inject(memo, context, &setter)
40+
injector.inject(memo, context, setter)
4241
rescue => e # rubocop:disable Style/RescueStandardError
4342
OpenTelemetry.logger.warn "Error in CompositePropagator#inject #{e.message}"
4443
carrier
@@ -53,15 +52,15 @@ def inject(carrier, context = Context.current, &setter)
5352
# @param [Object] carrier The carrier to extract context from
5453
# @param [optional Context] context Context to be updated with the state
5554
# extracted from the carrier. Defaults to +Context.current+
56-
# @param [optional Callable] getter An optional callable that takes a carrier and a key and
57-
# returns the value associated with the key. If omitted the default getter will be used
58-
# which expects the carrier to respond to [] and []=.
55+
# @param [optional Getter] getter If the optional getter is provided, it
56+
# will be used to read the header from the carrier, otherwise the default
57+
# getter will be used.
5958
#
6059
# @return [Context] a new context updated with state extracted from the
6160
# carrier
62-
def extract(carrier, context = Context.current, &getter)
61+
def extract(carrier, context: Context.current, getter: Context::Propagation.text_map_getter)
6362
@extractors.inject(context) do |ctx, extractor|
64-
extractor.extract(carrier, ctx, &getter)
63+
extractor.extract(carrier, ctx, getter)
6564
rescue => e # rubocop:disable Style/RescueStandardError
6665
OpenTelemetry.logger.warn "Error in CompositePropagator#extract #{e.message}"
6766
ctx

api/lib/opentelemetry/context/propagation/default_getter.rb

Lines changed: 0 additions & 26 deletions
This file was deleted.

api/lib/opentelemetry/context/propagation/default_setter.rb

Lines changed: 0 additions & 26 deletions
This file was deleted.

api/lib/opentelemetry/context/propagation/noop_extractor.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class NoopExtractor
1717
# @param [optional Callable] getter An optional callable that takes a carrier and a key and
1818
# and returns the value associated with the key
1919
# @return [Context]
20-
def extract(carrier, context, &getter)
20+
def extract(carrier, context, getter = nil)
2121
context
2222
end
2323
end

api/lib/opentelemetry/context/propagation/propagation.rb

Lines changed: 0 additions & 27 deletions
This file was deleted.

0 commit comments

Comments
 (0)