opentelemetry-propagator-b3 0.13.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3570b2000ae0b517565514277cc6c86a4bf67b0fde6c618c2f163b5c48df449c
4
- data.tar.gz: 96503278713f32ded98d089540e6c02265a78d22bff1b36f73382e620f9fb3e7
3
+ metadata.gz: f45eb322f2e12362885f84237c00e8b789ee8f8f690fb2881fcb41b3ebe7f4bf
4
+ data.tar.gz: 17b80c35c2c1e9a4245f1cc1ff8f2694d4a3c21571653335af4ec2987aec519c
5
5
  SHA512:
6
- metadata.gz: d5111bfbfe710e20f3ee33e72bca5808efda2f7617d1dccf27be232b4b62de39c58cd06f682a483a840a1f57ff62b4dd4bfbf021e25ac3a48fef868df7f10f05
7
- data.tar.gz: 2b7f0fab8add5b183372f39ec001388b7a6ac8ecd816ece7e14c6b4a5354a7578877607ec6fbff1ea5c0118eeccce5c9b588bd88387b262120dd2ec16ad696b2
6
+ metadata.gz: 9f2cf1a10dad43d79c576860a0af40c49bcbaacf68e1ef09f518bf2c828c651bb9c9333c57c461fea1a8bccb3edaa1f897baab022c95dec4b9024b6f371fcb9b
7
+ data.tar.gz: d25666c4e62a9372773edd582d68c656278e9f75f63130208ccc6e7f5af182adc657d50eaf0a18dfd25d605f7a6ad45c15a8bc4bea6e6b0c9f828c8ac6fd70bb
data/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # Release History: opentelemetry-propagator-b3
2
2
 
3
+ ### v0.18.0 / 2021-05-21
4
+
5
+ * ADDED: Updated API depedency for 1.0.0.rc1
6
+
7
+ ### v0.17.0 / 2021-04-22
8
+
9
+ * BREAKING CHANGE: Replace TextMapInjector/TextMapExtractor pairs with a TextMapPropagator.
10
+
11
+ [Check the propagator documentation](https://open-telemetry.github.io/opentelemetry-ruby/) for the new usage.
12
+
13
+ * FIXED: Refactor propagators to add #fields
14
+
15
+ ### v0.16.0 / 2021-03-17
16
+
17
+ * DOCS: Replace Gitter with GitHub Discussions
18
+
19
+ ### v0.15.0 / 2021-02-18
20
+
21
+ * (No significant changes)
22
+
23
+ ### v0.14.0 / 2021-02-03
24
+
25
+ * BREAKING CHANGE: Replace getter and setter callables and remove rack specific propagators
26
+
27
+ * ADDED: Replace getter and setter callables and remove rack specific propagators
28
+
3
29
  ### v0.13.0 / 2021-01-29
4
30
 
5
31
  * (No significant changes)
@@ -10,7 +36,7 @@
10
36
 
11
37
  ### v0.11.0 / 2020-12-11
12
38
 
13
- * FIXED: Copyright comments to not reference year
39
+ * FIXED: Copyright comments to not reference year
14
40
 
15
41
  ### v0.10.0 / 2020-12-03
16
42
 
data/README.md CHANGED
@@ -30,7 +30,7 @@ Or, if you use [bundler][bundler-home], include `opentelemetry-propagator-b3` in
30
30
 
31
31
  The `opentelemetry-propagator-b3` gem source is [on github][repo-github], along with related gems including `opentelemetry-api` and `opentelemetry-sdk`.
32
32
 
33
- The OpenTelemetry Ruby gems are maintained by the OpenTelemetry-Ruby special interest group (SIG). You can get involved by joining us on our [gitter channel][ruby-gitter] or attending our weekly meeting. See the [meeting calendar][community-meetings] for dates and times. For more information on this and other language SIGs, see the OpenTelemetry [community page][ruby-sig].
33
+ The OpenTelemetry Ruby gems are maintained by the OpenTelemetry-Ruby special interest group (SIG). You can get involved by joining us in [GitHub Discussions][discussions-url] or attending our weekly meeting. See the [meeting calendar][community-meetings] for dates and times. For more information on this and other language SIGs, see the OpenTelemetry [community page][ruby-sig].
34
34
 
35
35
  ## License
36
36
 
@@ -42,5 +42,5 @@ The `opentelemetry-propagator-b3` gem is distributed under the Apache 2.0 licens
42
42
  [license-github]: https://github.com/open-telemetry/opentelemetry-ruby/blob/main/LICENSE
43
43
  [ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
44
44
  [community-meetings]: https://github.com/open-telemetry/community#community-meetings
45
- [ruby-gitter]: https://gitter.im/open-telemetry/opentelemetry-ruby
45
+ [discussions-url]: https://github.com/open-telemetry/opentelemetry-ruby/discussions
46
46
  [b3-spec]: https://github.com/openzipkin/b3-propagation
@@ -31,28 +31,11 @@ module OpenTelemetry
31
31
  def debug?(context)
32
32
  context.value(DEBUG_CONTEXT_KEY)
33
33
  end
34
-
35
- # @api private
36
- # Convert an id from a hex encoded string to byte array, optionally left
37
- # padding to the correct length. Assumes the input id has already been
38
- # validated to be 16 or 32 characters in length.
39
- def to_trace_id(hex_id)
40
- if hex_id.length == 32
41
- Array(hex_id).pack('H*')
42
- else
43
- [0, hex_id].pack('qH*')
44
- end
45
- end
46
-
47
- # @api private
48
- # Convert an id from a hex encoded string to byte array.
49
- def to_span_id(hex_id)
50
- Array(hex_id).pack('H*')
51
- end
52
34
  end
53
35
  end
54
36
  end
55
37
 
56
38
  require_relative './b3/version'
39
+ require_relative './b3/text_map_extractor'
57
40
  require_relative './b3/multi'
58
41
  require_relative './b3/single'
@@ -4,8 +4,7 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
- require_relative './multi/text_map_extractor'
8
- require_relative './multi/text_map_injector'
7
+ require_relative './multi/text_map_propagator'
9
8
 
10
9
  # OpenTelemetry is an open source observability framework, providing a
11
10
  # general-purpose API, SDK, and related tools required for the instrumentation
@@ -18,48 +17,18 @@ module OpenTelemetry
18
17
  module Propagator
19
18
  # Namespace for OpenTelemetry B3 propagation
20
19
  module B3
21
- # Namespace for OpenTelemetry b3 multi header encoding
20
+ # Namespace for OpenTelemetry B3 multi header encoding
22
21
  module Multi
23
22
  extend self
24
23
 
25
- TEXT_MAP_EXTRACTOR = TextMapExtractor.new
26
- TEXT_MAP_INJECTOR = TextMapInjector.new
27
- RACK_KEYS = {
28
- b3_trace_id_key: 'HTTP_X_B3_TRACEID',
29
- b3_span_id_key: 'HTTP_X_B3_SPANID',
30
- b3_sampled_key: 'HTTP_X_B3_SAMPLED',
31
- b3_flags_key: 'HTTP_X_B3_FLAGS'
32
- }.freeze
33
- RACK_EXTRACTOR = TextMapExtractor.new(**RACK_KEYS)
34
- RACK_INJECTOR = TextMapInjector.new(**RACK_KEYS)
24
+ TEXT_MAP_PROPAGATOR = TextMapPropagator.new
35
25
 
36
- private_constant :TEXT_MAP_INJECTOR, :TEXT_MAP_EXTRACTOR, :RACK_INJECTOR,
37
- :RACK_EXTRACTOR, :RACK_KEYS
26
+ private_constant :TEXT_MAP_PROPAGATOR
38
27
 
39
- # Returns an extractor that extracts context in the B3 multi header
40
- # format
41
- def text_map_injector
42
- TEXT_MAP_INJECTOR
43
- end
44
-
45
- # Returns an injector that injects context in the B3 multi header
46
- # format
47
- def text_map_extractor
48
- TEXT_MAP_EXTRACTOR
49
- end
50
-
51
- # Returns an extractor that extracts context in the B3 multi header
52
- # format with Rack normalized keys (upcased and prefixed with
53
- # HTTP_)
54
- def rack_injector
55
- RACK_INJECTOR
56
- end
57
-
58
- # Returns an injector that injects context in the B3 multi header
59
- # format with Rack normalized keys (upcased and prefixed with
60
- # HTTP_)
61
- def rack_extractor
62
- RACK_EXTRACTOR
28
+ # Returns a text map propagator that propagates context using the
29
+ # B3 multi header format.
30
+ def text_map_propagator
31
+ TEXT_MAP_PROPAGATOR
63
32
  end
64
33
  end
65
34
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ # OpenTelemetry is an open source observability framework, providing a
8
+ # general-purpose API, SDK, and related tools required for the instrumentation
9
+ # of cloud-native software, frameworks, and libraries.
10
+ #
11
+ # The OpenTelemetry module provides global accessors for telemetry objects.
12
+ # See the documentation for the `opentelemetry-api` gem for details.
13
+ module OpenTelemetry
14
+ # Namespace for OpenTelemetry propagator extension libraries
15
+ module Propagator
16
+ # Namespace for OpenTelemetry B3 propagation
17
+ module B3
18
+ # Namespace for OpenTelemetry B3 multi header encoding
19
+ module Multi
20
+ # Propagates trace context using the B3 multi header format
21
+ class TextMapPropagator
22
+ include TextMapExtractor
23
+
24
+ FIELDS = [B3_TRACE_ID_KEY, B3_SPAN_ID_KEY, B3_SAMPLED_KEY, B3_FLAGS_KEY].freeze
25
+
26
+ private_constant :FIELDS
27
+
28
+ # Inject trace context into the supplied carrier.
29
+ #
30
+ # @param [Carrier] carrier The mutable carrier to inject trace context into
31
+ # @param [Context] context The context to read trace context from
32
+ # @param [optional Setter] setter If the optional setter is provided, it
33
+ # will be used to write context into the carrier, otherwise the default
34
+ # text map setter will be used.
35
+ def inject(carrier, context: Context.current, setter: Context::Propagation.text_map_setter)
36
+ span_context = Trace.current_span(context).context
37
+ return unless span_context.valid?
38
+
39
+ setter.set(carrier, B3_TRACE_ID_KEY, span_context.hex_trace_id)
40
+ setter.set(carrier, B3_SPAN_ID_KEY, span_context.hex_span_id)
41
+
42
+ if B3.debug?(context)
43
+ setter.set(carrier, B3_FLAGS_KEY, '1')
44
+ elsif span_context.trace_flags.sampled?
45
+ setter.set(carrier, B3_SAMPLED_KEY, '1')
46
+ else
47
+ setter.set(carrier, B3_SAMPLED_KEY, '0')
48
+ end
49
+
50
+ nil
51
+ end
52
+
53
+ # Returns the predefined propagation fields. If your carrier is reused, you
54
+ # should delete the fields returned by this method before calling +inject+.
55
+ #
56
+ # @return [Array<String>] a list of fields that will be used by this propagator.
57
+ def fields
58
+ FIELDS
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -4,8 +4,7 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
- require_relative './single/text_map_extractor'
8
- require_relative './single/text_map_injector'
7
+ require_relative './single/text_map_propagator'
9
8
 
10
9
  # OpenTelemetry is an open source observability framework, providing a
11
10
  # general-purpose API, SDK, and related tools required for the instrumentation
@@ -18,46 +17,18 @@ module OpenTelemetry
18
17
  module Propagator
19
18
  # Namespace for OpenTelemetry B3 propagation
20
19
  module B3
21
- # Namespace for OpenTelemetry b3 single header encoding
20
+ # Namespace for OpenTelemetry B3 single header encoding
22
21
  module Single
23
22
  extend self
24
23
 
25
- TEXT_MAP_EXTRACTOR = TextMapExtractor.new
26
- TEXT_MAP_INJECTOR = TextMapInjector.new
27
- RACK_EXTRACTOR = TextMapExtractor.new(
28
- b3_key: 'HTTP_B3'
29
- )
30
- RACK_INJECTOR = TextMapInjector.new(
31
- b3_key: 'HTTP_B3'
32
- )
24
+ TEXT_MAP_PROPAGATOR = TextMapPropagator.new
33
25
 
34
- private_constant :TEXT_MAP_INJECTOR, :TEXT_MAP_EXTRACTOR, :RACK_INJECTOR,
35
- :RACK_EXTRACTOR
26
+ private_constant :TEXT_MAP_PROPAGATOR
36
27
 
37
- # Returns an extractor that extracts context in the B3 single header
38
- # format
39
- def text_map_injector
40
- TEXT_MAP_INJECTOR
41
- end
42
-
43
- # Returns an injector that injects context in the B3 single header
44
- # format
45
- def text_map_extractor
46
- TEXT_MAP_EXTRACTOR
47
- end
48
-
49
- # Returns an extractor that extracts context in the B3 single header
50
- # format with Rack normalized keys (upcased and prefixed with
51
- # HTTP_)
52
- def rack_injector
53
- RACK_INJECTOR
54
- end
55
-
56
- # Returns an injector that injects context in the B3 single header
57
- # format with Rack normalized keys (upcased and prefixed with
58
- # HTTP_)
59
- def rack_extractor
60
- RACK_EXTRACTOR
28
+ # Returns a text map propagator that propagates context using the
29
+ # B3 single header format.
30
+ def text_map_propagator
31
+ TEXT_MAP_PROPAGATOR
61
32
  end
62
33
  end
63
34
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ # OpenTelemetry is an open source observability framework, providing a
8
+ # general-purpose API, SDK, and related tools required for the instrumentation
9
+ # of cloud-native software, frameworks, and libraries.
10
+ #
11
+ # The OpenTelemetry module provides global accessors for telemetry objects.
12
+ # See the documentation for the `opentelemetry-api` gem for details.
13
+ module OpenTelemetry
14
+ # Namespace for OpenTelemetry propagator extension libraries
15
+ module Propagator
16
+ # Namespace for OpenTelemetry B3 propagation
17
+ module B3
18
+ # Namespace for OpenTelemetry b3 single header encoding
19
+ module Single
20
+ # Propagates trace context using the b3 single header format
21
+ class TextMapPropagator
22
+ include TextMapExtractor
23
+
24
+ FIELDS = [B3_CONTEXT_KEY].freeze
25
+
26
+ private_constant :FIELDS
27
+
28
+ # Inject trace context into the supplied carrier.
29
+ #
30
+ # @param [Carrier] carrier The mutable carrier to inject trace context into
31
+ # @param [Context] context The context to read trace context from
32
+ # @param [optional Setter] setter If the optional setter is provided, it
33
+ # will be used to write context into the carrier, otherwise the default
34
+ # text map setter will be used.
35
+ def inject(carrier, context: Context.current, setter: Context::Propagation.text_map_setter)
36
+ span_context = Trace.current_span(context).context
37
+ return unless span_context.valid?
38
+
39
+ sampling_state = if B3.debug?(context)
40
+ 'd'
41
+ elsif span_context.trace_flags.sampled?
42
+ '1'
43
+ else
44
+ '0'
45
+ end
46
+
47
+ b3_value = "#{span_context.hex_trace_id}-#{span_context.hex_span_id}-#{sampling_state}"
48
+
49
+ setter.set(carrier, B3_CONTEXT_KEY, b3_value)
50
+ nil
51
+ end
52
+
53
+ # Returns the predefined propagation fields. If your carrier is reused, you
54
+ # should delete the fields returned by this method before calling +inject+.
55
+ #
56
+ # @return [Array<String>] a list of fields that will be used by this propagator.
57
+ def fields
58
+ FIELDS
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright The OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ # OpenTelemetry is an open source observability framework, providing a
8
+ # general-purpose API, SDK, and related tools required for the instrumentation
9
+ # of cloud-native software, frameworks, and libraries.
10
+ #
11
+ # The OpenTelemetry module provides global accessors for telemetry objects.
12
+ # See the documentation for the `opentelemetry-api` gem for details.
13
+ module OpenTelemetry
14
+ # Namespace for OpenTelemetry propagator extension libraries
15
+ module Propagator
16
+ # Namespace for OpenTelemetry B3 propagation
17
+ module B3
18
+ # Extracts trace context using the b3 single or multi header formats, favouring b3 single header.
19
+ module TextMapExtractor
20
+ B3_CONTEXT_REGEX = /\A(?<trace_id>(?:[0-9a-f]{16}){1,2})-(?<span_id>[0-9a-f]{16})(?:-(?<sampling_state>[01d](?![0-9a-f])))?(?:-(?<parent_span_id>[0-9a-f]{16}))?\z/.freeze
21
+ B3_TRACE_ID_REGEX = /\A(?:[0-9a-f]{16}){1,2}\z/.freeze
22
+ B3_SPAN_ID_REGEX = /\A[0-9a-f]{16}\z/.freeze
23
+ SAMPLED_VALUES = %w[1 true].freeze
24
+
25
+ B3_CONTEXT_KEY = 'b3'
26
+ B3_TRACE_ID_KEY = 'X-B3-TraceId'
27
+ B3_SPAN_ID_KEY = 'X-B3-SpanId'
28
+ B3_SAMPLED_KEY = 'X-B3-Sampled'
29
+ B3_FLAGS_KEY = 'X-B3-Flags'
30
+
31
+ private_constant :B3_CONTEXT_REGEX, :B3_TRACE_ID_REGEX, :B3_SPAN_ID_REGEX, :SAMPLED_VALUES
32
+ private_constant :B3_CONTEXT_KEY, :B3_TRACE_ID_KEY, :B3_SPAN_ID_KEY, :B3_SAMPLED_KEY, :B3_FLAGS_KEY
33
+
34
+ # Extract trace context from the supplied carrier. The b3 single header takes
35
+ # precedence over the multi-header format.
36
+ # If extraction fails, the original context will be returned.
37
+ #
38
+ # @param [Carrier] carrier The carrier to get the header from
39
+ # @param [optional Context] context Context to be updated with the trace context
40
+ # extracted from the carrier. Defaults to +Context.current+.
41
+ # @param [optional Getter] getter If the optional getter is provided, it
42
+ # will be used to read the header from the carrier, otherwise the default
43
+ # text map getter will be used.
44
+ #
45
+ # @return [Context] context updated with extracted baggage, or the original context
46
+ # if extraction fails
47
+ def extract(carrier, context: Context.current, getter: Context::Propagation.text_map_getter)
48
+ extract_b3_single_header(carrier, context, getter) || extract_b3_multi_header(carrier, context, getter) || context
49
+ end
50
+
51
+ private
52
+
53
+ def extract_b3_single_header(carrier, context, getter)
54
+ match = getter.get(carrier, B3_CONTEXT_KEY)&.match(B3_CONTEXT_REGEX)
55
+ return unless match
56
+
57
+ debug = match['sampling_state'] == 'd'
58
+ sampled = debug || match['sampling_state'] == '1'
59
+ extracted_context(match['trace_id'], match['span_id'], sampled, debug, context)
60
+ end
61
+
62
+ def extract_b3_multi_header(carrier, context, getter)
63
+ trace_id_hex = getter.get(carrier, B3_TRACE_ID_KEY)
64
+ return unless B3_TRACE_ID_REGEX.match?(trace_id_hex)
65
+
66
+ span_id_hex = getter.get(carrier, B3_SPAN_ID_KEY)
67
+ return unless B3_SPAN_ID_REGEX.match?(span_id_hex)
68
+
69
+ sampled = getter.get(carrier, B3_SAMPLED_KEY)
70
+ flags = getter.get(carrier, B3_FLAGS_KEY)
71
+
72
+ debug = flags == '1'
73
+ sampled = debug || SAMPLED_VALUES.include?(sampled)
74
+ extracted_context(trace_id_hex, span_id_hex, sampled, debug, context)
75
+ end
76
+
77
+ def extracted_context(trace_id_hex, span_id_hex, sampled, debug, context)
78
+ span_context = Trace::SpanContext.new(
79
+ trace_id: to_trace_id(trace_id_hex),
80
+ span_id: to_span_id(span_id_hex),
81
+ trace_flags: to_trace_flags(sampled),
82
+ remote: true
83
+ )
84
+
85
+ span = Trace::Span.new(span_context: span_context)
86
+ context = B3.context_with_debug(context) if debug
87
+ Trace.context_with_span(span, parent_context: context)
88
+ end
89
+
90
+ def to_trace_flags(sampled)
91
+ if sampled
92
+ Trace::TraceFlags::SAMPLED
93
+ else
94
+ Trace::TraceFlags::DEFAULT
95
+ end
96
+ end
97
+
98
+ # Convert an id from a hex encoded string to byte array, optionally left
99
+ # padding to the correct length. Assumes the input id has already been
100
+ # validated to be 16 or 32 characters in length.
101
+ def to_trace_id(hex_id)
102
+ if hex_id.length == 32
103
+ Array(hex_id).pack('H*')
104
+ else
105
+ [0, hex_id].pack('qH*')
106
+ end
107
+ end
108
+
109
+ # Convert an id from a hex encoded string to byte array.
110
+ def to_span_id(hex_id)
111
+ Array(hex_id).pack('H*')
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -7,7 +7,7 @@
7
7
  module OpenTelemetry
8
8
  module Propagator
9
9
  module B3
10
- VERSION = '0.13.0'
10
+ VERSION = '0.18.0'
11
11
  end
12
12
  end
13
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-propagator-b3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-30 00:00:00.000000000 Z
11
+ date: 2021-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.13.0
19
+ version: 1.0.0.rc1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.13.0
26
+ version: 1.0.0.rc1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -136,20 +136,19 @@ files:
136
136
  - lib/opentelemetry-propagator-b3.rb
137
137
  - lib/opentelemetry/propagator/b3.rb
138
138
  - lib/opentelemetry/propagator/b3/multi.rb
139
- - lib/opentelemetry/propagator/b3/multi/text_map_extractor.rb
140
- - lib/opentelemetry/propagator/b3/multi/text_map_injector.rb
139
+ - lib/opentelemetry/propagator/b3/multi/text_map_propagator.rb
141
140
  - lib/opentelemetry/propagator/b3/single.rb
142
- - lib/opentelemetry/propagator/b3/single/text_map_extractor.rb
143
- - lib/opentelemetry/propagator/b3/single/text_map_injector.rb
141
+ - lib/opentelemetry/propagator/b3/single/text_map_propagator.rb
142
+ - lib/opentelemetry/propagator/b3/text_map_extractor.rb
144
143
  - lib/opentelemetry/propagator/b3/version.rb
145
144
  homepage: https://github.com/open-telemetry/opentelemetry-ruby
146
145
  licenses:
147
146
  - Apache-2.0
148
147
  metadata:
149
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-propagator-b3/v0.13.0/file.CHANGELOG.html
148
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-propagator-b3/v0.18.0/file.CHANGELOG.html
150
149
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/propagator/b3
151
150
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
152
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-propagator-b3/v0.13.0
151
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-propagator-b3/v0.18.0
153
152
  post_install_message:
154
153
  rdoc_options: []
155
154
  require_paths:
@@ -165,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
164
  - !ruby/object:Gem::Version
166
165
  version: '0'
167
166
  requirements: []
168
- rubygems_version: 3.1.4
167
+ rubygems_version: 3.1.6
169
168
  signing_key:
170
169
  specification_version: 4
171
170
  summary: B3 Context Propagation Extension for the OpenTelemetry framework
@@ -1,109 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright The OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- # OpenTelemetry is an open source observability framework, providing a
8
- # general-purpose API, SDK, and related tools required for the instrumentation
9
- # of cloud-native software, frameworks, and libraries.
10
- #
11
- # The OpenTelemetry module provides global accessors for telemetry objects.
12
- # See the documentation for the `opentelemetry-api` gem for details.
13
- module OpenTelemetry
14
- # Namespace for OpenTelemetry propagator extension libraries
15
- module Propagator
16
- # Namespace for OpenTelemetry B3 propagation
17
- module B3
18
- # Namespace for OpenTelemetry b3 multi header encoding
19
- module Multi
20
- # Extracts context from carriers in the b3 single header format
21
- class TextMapExtractor
22
- include Context::Propagation::DefaultGetter
23
-
24
- B3_TRACE_ID_REGEX = /\A(?:[0-9a-f]{16}){1,2}\z/.freeze
25
- B3_SPAN_ID_REGEX = /\A[0-9a-f]{16}\z/.freeze
26
- SAMPLED_VALUES = %w[1 true].freeze
27
- DEBUG_FLAG = '1'
28
- private_constant :B3_TRACE_ID_REGEX, :B3_SPAN_ID_REGEX, :SAMPLED_VALUES, :DEBUG_FLAG
29
-
30
- # Returns a new TextMapExtractor that extracts b3 context using the
31
- # specified header keys
32
- #
33
- # @param [String] b3_trace_id_key The b3 trace id key used in the carrier
34
- # @param [String] b3_span_id_key The b3 span id key used in the carrier
35
- # @param [String] b3_sampled_key The b3 sampled key used in the carrier
36
- # @param [String] b3_flags_key The b3 flags key used in the carrier
37
- # @return [TextMapExtractor]
38
- def initialize(b3_trace_id_key: 'X-B3-TraceId',
39
- b3_span_id_key: 'X-B3-SpanId',
40
- b3_sampled_key: 'X-B3-Sampled',
41
- b3_flags_key: 'X-B3-Flags')
42
- @b3_trace_id_key = b3_trace_id_key
43
- @b3_span_id_key = b3_span_id_key
44
- @b3_sampled_key = b3_sampled_key
45
- @b3_flags_key = b3_flags_key
46
- end
47
-
48
- # Extract b3 context from the supplied carrier and set the active span
49
- # in the given context. The original context will be returned if b3
50
- # cannot be extracted from the carrier.
51
- #
52
- # @param [Carrier] carrier The carrier to get the header from.
53
- # @param [Context] context The context to be updated with extracted context
54
- # @param [optional Callable] getter An optional callable that takes a carrier and a key and
55
- # returns the value associated with the key. If omitted the default getter will be used
56
- # which expects the carrier to respond to [] and []=.
57
- # @yield [Carrier, String] if an optional getter is provided, extract will yield the carrier
58
- # and the header key to the getter.
59
- # @return [Context] Updated context with active span derived from the header, or the original
60
- # context if parsing fails.
61
- def extract(carrier, context, &getter)
62
- getter ||= default_getter
63
-
64
- trace_id_hex = getter.call(carrier, @b3_trace_id_key)
65
- return context unless valid_trace_id?(trace_id_hex)
66
-
67
- span_id_hex = getter.call(carrier, @b3_span_id_key)
68
- return context unless valid_span_id?(span_id_hex)
69
-
70
- sampled = getter.call(carrier, @b3_sampled_key)
71
- flags = getter.call(carrier, @b3_flags_key)
72
-
73
- context = B3.context_with_debug(context) if flags == DEBUG_FLAG
74
-
75
- span_context = Trace::SpanContext.new(
76
- trace_id: B3.to_trace_id(trace_id_hex),
77
- span_id: B3.to_span_id(span_id_hex),
78
- trace_flags: to_trace_flags(sampled, flags),
79
- remote: true
80
- )
81
-
82
- span = Trace::Span.new(span_context: span_context)
83
- Trace.context_with_span(span, parent_context: context)
84
- rescue OpenTelemetry::Error
85
- context
86
- end
87
-
88
- private
89
-
90
- def to_trace_flags(sampled, b3_flags)
91
- if b3_flags == DEBUG_FLAG || SAMPLED_VALUES.include?(sampled)
92
- Trace::TraceFlags::SAMPLED
93
- else
94
- Trace::TraceFlags::DEFAULT
95
- end
96
- end
97
-
98
- def valid_trace_id?(trace_id)
99
- B3_TRACE_ID_REGEX.match?(trace_id)
100
- end
101
-
102
- def valid_span_id?(span_id)
103
- B3_SPAN_ID_REGEX.match?(span_id)
104
- end
105
- end
106
- end
107
- end
108
- end
109
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright The OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
- module OpenTelemetry
7
- # Namespace for OpenTelemetry propagator extension libraries
8
- module Propagator
9
- # Namespace for OpenTelemetry B3 propagation
10
- module B3
11
- # Namespace for OpenTelemetry b3 single header encoding
12
- module Multi
13
- # Injects context into carriers using the b3 single header format
14
- class TextMapInjector
15
- include Context::Propagation::DefaultSetter
16
-
17
- # Returns a new TextMapInjector that extracts b3 context using the
18
- # specified header keys
19
- #
20
- # @param [String] b3_trace_id_key The b3 trace id key used in the carrier
21
- # @param [String] b3_span_id_key The b3 span id key used in the carrier
22
- # @param [String] b3_sampled_key The b3 sampled key used in the carrier
23
- # @param [String] b3_flags_key The b3 flags key used in the carrier
24
- # @return [TextMapInjector]
25
- def initialize(b3_trace_id_key: 'X-B3-TraceId',
26
- b3_span_id_key: 'X-B3-SpanId',
27
- b3_sampled_key: 'X-B3-Sampled',
28
- b3_flags_key: 'X-B3-Flags')
29
- @b3_trace_id_key = b3_trace_id_key
30
- @b3_span_id_key = b3_span_id_key
31
- @b3_sampled_key = b3_sampled_key
32
- @b3_flags_key = b3_flags_key
33
- end
34
-
35
- # Set the span context on the supplied carrier.
36
- #
37
- # @param [Context] context The active Context.
38
- # @param [optional Callable] setter An optional callable that takes a carrier and a key and
39
- # a value and assigns the key-value pair in the carrier. If omitted the default setter
40
- # will be used which expects the carrier to respond to [] and []=.
41
- # @yield [Carrier, String, String] if an optional setter is provided, inject will yield
42
- # carrier, header key, header value to the setter.
43
- # @return [Object] the carrier with context injected
44
- def inject(carrier, context, &setter)
45
- span_context = Trace.current_span(context).context
46
- return unless span_context.valid?
47
-
48
- setter ||= default_setter
49
- setter.call(carrier, @b3_trace_id_key, span_context.hex_trace_id)
50
- setter.call(carrier, @b3_span_id_key, span_context.hex_span_id)
51
-
52
- if B3.debug?(context)
53
- setter.call(carrier, @b3_flags_key, '1')
54
- elsif span_context.trace_flags.sampled?
55
- setter.call(carrier, @b3_sampled_key, '1')
56
- else
57
- setter.call(carrier, @b3_sampled_key, '0')
58
- end
59
-
60
- carrier
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,81 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright The OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- # OpenTelemetry is an open source observability framework, providing a
8
- # general-purpose API, SDK, and related tools required for the instrumentation
9
- # of cloud-native software, frameworks, and libraries.
10
- #
11
- # The OpenTelemetry module provides global accessors for telemetry objects.
12
- # See the documentation for the `opentelemetry-api` gem for details.
13
- module OpenTelemetry
14
- # Namespace for OpenTelemetry propagator extension libraries
15
- module Propagator
16
- # Namespace for OpenTelemetry B3 propagation
17
- module B3
18
- # Namespace for OpenTelemetry b3 single header encoding
19
- module Single
20
- # Extracts context from carriers in the b3 single header format
21
- class TextMapExtractor
22
- include Context::Propagation::DefaultGetter
23
-
24
- B3_CONTEXT_REGEX = /\A(?<trace_id>(?:[0-9a-f]{16}){1,2})-(?<span_id>[0-9a-f]{16})(?:-(?<sampling_state>[01d](?![0-9a-f])))?(?:-(?<parent_span_id>[0-9a-f]{16}))?\z/.freeze
25
- SAMPLED_VALUES = %w[1 d].freeze
26
-
27
- # Returns a new TextMapExtractor that extracts b3 context using the
28
- # specified header keys
29
- #
30
- # @param [String] b3_key The b3 header key used in the carrier
31
- # @return [TextMapExtractor]
32
- def initialize(b3_key: 'b3')
33
- @b3_key = b3_key
34
- end
35
-
36
- # Extract b3 context from the supplied carrier and set the active span
37
- # in the given context. The original context will be returned if b3
38
- # cannot be extracted from the carrier.
39
- #
40
- # @param [Carrier] carrier The carrier to get the header from.
41
- # @param [Context] context The context to be updated with extracted context
42
- # @param [optional Callable] getter An optional callable that takes a carrier and a key and
43
- # returns the value associated with the key. If omitted the default getter will be used
44
- # which expects the carrier to respond to [] and []=.
45
- # @yield [Carrier, String] if an optional getter is provided, extract will yield the carrier
46
- # and the header key to the getter.
47
- # @return [Context] Updated context with active span derived from the header, or the original
48
- # context if parsing fails.
49
- def extract(carrier, context, &getter)
50
- getter ||= default_getter
51
- header = getter.call(carrier, @b3_key)
52
- return context unless (match = header.match(B3_CONTEXT_REGEX))
53
-
54
- span_context = Trace::SpanContext.new(
55
- trace_id: B3.to_trace_id(match['trace_id']),
56
- span_id: B3.to_span_id(match['span_id']),
57
- trace_flags: to_trace_flags(match['sampling_state']),
58
- remote: true
59
- )
60
-
61
- span = Trace::Span.new(span_context: span_context)
62
- context = B3.context_with_debug(context) if match['sampling_state'] == 'd'
63
- Trace.context_with_span(span, parent_context: context)
64
- rescue OpenTelemetry::Error
65
- context
66
- end
67
-
68
- private
69
-
70
- def to_trace_flags(sampling_state)
71
- if SAMPLED_VALUES.include?(sampling_state)
72
- Trace::TraceFlags::SAMPLED
73
- else
74
- Trace::TraceFlags::DEFAULT
75
- end
76
- end
77
- end
78
- end
79
- end
80
- end
81
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright The OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
- module OpenTelemetry
7
- # Namespace for OpenTelemetry propagator extension libraries
8
- module Propagator
9
- # Namespace for OpenTelemetry B3 propagation
10
- module B3
11
- # Namespace for OpenTelemetry b3 single header encoding
12
- module Single
13
- # Injects context into carriers using the b3 single header format
14
- class TextMapInjector
15
- include Context::Propagation::DefaultSetter
16
-
17
- # Returns a new TextMapInjector that extracts b3 context using the
18
- # specified header keys
19
- #
20
- # @param [String] b3_key The b3 header key used in the carrier
21
- # @return [TextMapInjector]
22
- def initialize(b3_key: 'b3')
23
- @b3_key = b3_key
24
- end
25
-
26
- # Set the span context on the supplied carrier.
27
- #
28
- # @param [Context] context The active Context.
29
- # @param [optional Callable] setter An optional callable that takes a carrier and a key and
30
- # a value and assigns the key-value pair in the carrier. If omitted the default setter
31
- # will be used which expects the carrier to respond to [] and []=.
32
- # @yield [Carrier, String, String] if an optional setter is provided, inject will yield
33
- # carrier, header key, header value to the setter.
34
- # @return [Object] the carrier with context injected
35
- def inject(carrier, context, &setter)
36
- span_context = Trace.current_span(context).context
37
- return unless span_context.valid?
38
-
39
- sampling_state = if B3.debug?(context)
40
- 'd'
41
- elsif span_context.trace_flags.sampled?
42
- '1'
43
- else
44
- '0'
45
- end
46
-
47
- b3_value = "#{span_context.hex_trace_id}-#{span_context.hex_span_id}-#{sampling_state}"
48
-
49
- setter ||= default_setter
50
- setter.call(carrier, @b3_key, b3_value)
51
- carrier
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end