opentelemetry-propagator-b3 0.16.0 → 0.17.0
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/CHANGELOG.md +8 -0
- data/lib/opentelemetry/propagator/b3.rb +1 -18
- data/lib/opentelemetry/propagator/b3/multi.rb +8 -21
- data/lib/opentelemetry/propagator/b3/multi/text_map_propagator.rb +64 -0
- data/lib/opentelemetry/propagator/b3/single.rb +8 -17
- data/lib/opentelemetry/propagator/b3/single/text_map_propagator.rb +64 -0
- data/lib/opentelemetry/propagator/b3/text_map_extractor.rb +116 -0
- data/lib/opentelemetry/propagator/b3/version.rb +1 -1
- metadata +10 -11
- data/lib/opentelemetry/propagator/b3/multi/text_map_extractor.rb +0 -98
- data/lib/opentelemetry/propagator/b3/multi/text_map_injector.rb +0 -55
- data/lib/opentelemetry/propagator/b3/single/text_map_extractor.rb +0 -79
- data/lib/opentelemetry/propagator/b3/single/text_map_injector.rb +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8bb36f87a6d784d8889edf5d733410b48567f33d4a4c41d40f750e5a36ac989
|
4
|
+
data.tar.gz: ebd953a02b5045be4a44bb18c5d6094cf3198523b8b905b86023bb6732c0e695
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ddfc1c88bd19aa81b049d9ef832de04bc321dd0219a44b01937a656f6d6b14061b0a7b452067b9844dea537c9d73ba5e26ad5301870262cb82af05cafcbbeec
|
7
|
+
data.tar.gz: 31e80b987d02727a2daba0fd489605daed15881890726eec64422d77842700e7dc8ba00d49d0318bddc95427a0855366a72bdcfc2bea1fbb41615e13d1da2a04
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Release History: opentelemetry-propagator-b3
|
2
2
|
|
3
|
+
### v0.17.0 / 2021-04-22
|
4
|
+
|
5
|
+
* BREAKING CHANGE: Replace TextMapInjector/TextMapExtractor pairs with a TextMapPropagator.
|
6
|
+
|
7
|
+
[Check the propagator documentation](https://open-telemetry.github.io/opentelemetry-ruby/) for the new usage.
|
8
|
+
|
9
|
+
* FIXED: Refactor propagators to add #fields
|
10
|
+
|
3
11
|
### v0.16.0 / 2021-03-17
|
4
12
|
|
5
13
|
* DOCS: Replace Gitter with GitHub Discussions
|
@@ -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/
|
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,30 +17,18 @@ module OpenTelemetry
|
|
18
17
|
module Propagator
|
19
18
|
# Namespace for OpenTelemetry B3 propagation
|
20
19
|
module B3
|
21
|
-
# Namespace for OpenTelemetry
|
20
|
+
# Namespace for OpenTelemetry B3 multi header encoding
|
22
21
|
module Multi
|
23
22
|
extend self
|
24
23
|
|
25
|
-
|
26
|
-
B3_SPAN_ID_KEY = 'X-B3-SpanId'
|
27
|
-
B3_SAMPLED_KEY = 'X-B3-Sampled'
|
28
|
-
B3_FLAGS_KEY = 'X-B3-Flags'
|
29
|
-
TEXT_MAP_EXTRACTOR = TextMapExtractor.new
|
30
|
-
TEXT_MAP_INJECTOR = TextMapInjector.new
|
24
|
+
TEXT_MAP_PROPAGATOR = TextMapPropagator.new
|
31
25
|
|
32
|
-
private_constant :
|
33
|
-
:B3_FLAGS_KEY, :TEXT_MAP_INJECTOR, :TEXT_MAP_EXTRACTOR
|
26
|
+
private_constant :TEXT_MAP_PROPAGATOR
|
34
27
|
|
35
|
-
# Returns
|
36
|
-
# format
|
37
|
-
def
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
# Returns an injector that injects context in the B3 multi header
|
42
|
-
# format
|
43
|
-
def text_map_extractor
|
44
|
-
TEXT_MAP_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
|
45
32
|
end
|
46
33
|
end
|
47
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/
|
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,26 +17,18 @@ module OpenTelemetry
|
|
18
17
|
module Propagator
|
19
18
|
# Namespace for OpenTelemetry B3 propagation
|
20
19
|
module B3
|
21
|
-
# Namespace for OpenTelemetry
|
20
|
+
# Namespace for OpenTelemetry B3 single header encoding
|
22
21
|
module Single
|
23
22
|
extend self
|
24
23
|
|
25
|
-
|
26
|
-
TEXT_MAP_EXTRACTOR = TextMapExtractor.new
|
27
|
-
TEXT_MAP_INJECTOR = TextMapInjector.new
|
24
|
+
TEXT_MAP_PROPAGATOR = TextMapPropagator.new
|
28
25
|
|
29
|
-
private_constant :
|
26
|
+
private_constant :TEXT_MAP_PROPAGATOR
|
30
27
|
|
31
|
-
# Returns
|
32
|
-
# format
|
33
|
-
def
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
# Returns an injector that injects context in the B3 single header
|
38
|
-
# format
|
39
|
-
def text_map_extractor
|
40
|
-
TEXT_MAP_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
|
41
32
|
end
|
42
33
|
end
|
43
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
|
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.
|
4
|
+
version: 0.17.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-
|
11
|
+
date: 2021-04-23 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.
|
19
|
+
version: 0.17.0
|
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.
|
26
|
+
version: 0.17.0
|
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/
|
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/
|
143
|
-
- lib/opentelemetry/propagator/b3/
|
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.
|
148
|
+
changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-propagator-b3/v0.17.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.
|
151
|
+
documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-propagator-b3/v0.17.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.
|
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,98 +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
|
-
B3_TRACE_ID_REGEX = /\A(?:[0-9a-f]{16}){1,2}\z/.freeze
|
23
|
-
B3_SPAN_ID_REGEX = /\A[0-9a-f]{16}\z/.freeze
|
24
|
-
SAMPLED_VALUES = %w[1 true].freeze
|
25
|
-
DEBUG_FLAG = '1'
|
26
|
-
private_constant :B3_TRACE_ID_REGEX, :B3_SPAN_ID_REGEX, :SAMPLED_VALUES, :DEBUG_FLAG
|
27
|
-
|
28
|
-
# Returns a new TextMapExtractor that extracts b3 context using the
|
29
|
-
# specified getter
|
30
|
-
#
|
31
|
-
# @param [optional Getter] default_getter The default getter used to read
|
32
|
-
# headers from a carrier during extract. Defaults to a
|
33
|
-
# {OpenTelemetry::Context:Propagation::TextMapGetter} instance.
|
34
|
-
# @return [TextMapExtractor]
|
35
|
-
def initialize(default_getter = Context::Propagation.text_map_getter)
|
36
|
-
@default_getter = default_getter
|
37
|
-
end
|
38
|
-
|
39
|
-
# Extract b3 context from the supplied carrier and set the active span
|
40
|
-
# in the given context. The original context will be returned if b3
|
41
|
-
# cannot be extracted from the carrier.
|
42
|
-
#
|
43
|
-
# @param [Carrier] carrier The carrier to get the header from.
|
44
|
-
# @param [Context] context The context to be updated with extracted context
|
45
|
-
# @param [optional Getter] getter If the optional getter is provided, it
|
46
|
-
# will be used to read the header from the carrier, otherwise the default
|
47
|
-
# getter will be used.
|
48
|
-
# @return [Context] Updated context with active span derived from the header, or the original
|
49
|
-
# context if parsing fails.
|
50
|
-
def extract(carrier, context, getter = nil)
|
51
|
-
getter ||= @default_getter
|
52
|
-
|
53
|
-
trace_id_hex = getter.get(carrier, B3_TRACE_ID_KEY)
|
54
|
-
return context unless valid_trace_id?(trace_id_hex)
|
55
|
-
|
56
|
-
span_id_hex = getter.get(carrier, B3_SPAN_ID_KEY)
|
57
|
-
return context unless valid_span_id?(span_id_hex)
|
58
|
-
|
59
|
-
sampled = getter.get(carrier, B3_SAMPLED_KEY)
|
60
|
-
flags = getter.get(carrier, B3_FLAGS_KEY)
|
61
|
-
|
62
|
-
context = B3.context_with_debug(context) if flags == DEBUG_FLAG
|
63
|
-
|
64
|
-
span_context = Trace::SpanContext.new(
|
65
|
-
trace_id: B3.to_trace_id(trace_id_hex),
|
66
|
-
span_id: B3.to_span_id(span_id_hex),
|
67
|
-
trace_flags: to_trace_flags(sampled, flags),
|
68
|
-
remote: true
|
69
|
-
)
|
70
|
-
|
71
|
-
span = Trace::Span.new(span_context: span_context)
|
72
|
-
Trace.context_with_span(span, parent_context: context)
|
73
|
-
rescue OpenTelemetry::Error
|
74
|
-
context
|
75
|
-
end
|
76
|
-
|
77
|
-
private
|
78
|
-
|
79
|
-
def to_trace_flags(sampled, b3_flags)
|
80
|
-
if b3_flags == DEBUG_FLAG || SAMPLED_VALUES.include?(sampled)
|
81
|
-
Trace::TraceFlags::SAMPLED
|
82
|
-
else
|
83
|
-
Trace::TraceFlags::DEFAULT
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def valid_trace_id?(trace_id)
|
88
|
-
B3_TRACE_ID_REGEX.match?(trace_id)
|
89
|
-
end
|
90
|
-
|
91
|
-
def valid_span_id?(span_id)
|
92
|
-
B3_SPAN_ID_REGEX.match?(span_id)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
@@ -1,55 +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
|
-
# Returns a new TextMapInjector that injects b3 context using the
|
16
|
-
# specified setter
|
17
|
-
#
|
18
|
-
# @param [optional Setter] default_setter The default setter used to
|
19
|
-
# write context into a carrier during inject. Defaults to a
|
20
|
-
# {OpenTelemetry::Context:Propagation::TextMapSetter} instance.
|
21
|
-
# @return [TextMapInjector]
|
22
|
-
def initialize(default_setter = Context::Propagation.text_map_setter)
|
23
|
-
@default_setter = default_setter
|
24
|
-
end
|
25
|
-
|
26
|
-
# Set the span context on the supplied carrier.
|
27
|
-
#
|
28
|
-
# @param [Context] context The active Context.
|
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.
|
32
|
-
# @return [Object] the carrier with context injected
|
33
|
-
def inject(carrier, context, setter = nil)
|
34
|
-
span_context = Trace.current_span(context).context
|
35
|
-
return unless span_context.valid?
|
36
|
-
|
37
|
-
setter ||= @default_setter
|
38
|
-
setter.set(carrier, B3_TRACE_ID_KEY, span_context.hex_trace_id)
|
39
|
-
setter.set(carrier, B3_SPAN_ID_KEY, span_context.hex_span_id)
|
40
|
-
|
41
|
-
if B3.debug?(context)
|
42
|
-
setter.set(carrier, B3_FLAGS_KEY, '1')
|
43
|
-
elsif span_context.trace_flags.sampled?
|
44
|
-
setter.set(carrier, B3_SAMPLED_KEY, '1')
|
45
|
-
else
|
46
|
-
setter.set(carrier, B3_SAMPLED_KEY, '0')
|
47
|
-
end
|
48
|
-
|
49
|
-
carrier
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,79 +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
|
-
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
|
23
|
-
SAMPLED_VALUES = %w[1 d].freeze
|
24
|
-
|
25
|
-
# Returns a new TextMapExtractor that extracts b3 context using the
|
26
|
-
# specified getter
|
27
|
-
#
|
28
|
-
# @param [optional Getter] default_getter The default getter used to read
|
29
|
-
# headers from a carrier during extract. Defaults to a
|
30
|
-
# {OpenTelemetry::Context:Propagation::TextMapGetter} instance.
|
31
|
-
# @return [TextMapExtractor]
|
32
|
-
def initialize(default_getter = Context::Propagation.text_map_getter)
|
33
|
-
@default_getter = default_getter
|
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 Getter] getter If the optional getter is provided, it
|
43
|
-
# will be used to read the header from the carrier, otherwise the default
|
44
|
-
# getter will be used.
|
45
|
-
# @return [Context] Updated context with active span derived from the header, or the original
|
46
|
-
# context if parsing fails.
|
47
|
-
def extract(carrier, context, getter = nil)
|
48
|
-
getter ||= @default_getter
|
49
|
-
header = getter.get(carrier, B3_CONTEXT_KEY)
|
50
|
-
return context unless (match = header.match(B3_CONTEXT_REGEX))
|
51
|
-
|
52
|
-
span_context = Trace::SpanContext.new(
|
53
|
-
trace_id: B3.to_trace_id(match['trace_id']),
|
54
|
-
span_id: B3.to_span_id(match['span_id']),
|
55
|
-
trace_flags: to_trace_flags(match['sampling_state']),
|
56
|
-
remote: true
|
57
|
-
)
|
58
|
-
|
59
|
-
span = Trace::Span.new(span_context: span_context)
|
60
|
-
context = B3.context_with_debug(context) if match['sampling_state'] == 'd'
|
61
|
-
Trace.context_with_span(span, parent_context: context)
|
62
|
-
rescue OpenTelemetry::Error
|
63
|
-
context
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def to_trace_flags(sampling_state)
|
69
|
-
if SAMPLED_VALUES.include?(sampling_state)
|
70
|
-
Trace::TraceFlags::SAMPLED
|
71
|
-
else
|
72
|
-
Trace::TraceFlags::DEFAULT
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
@@ -1,55 +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
|
-
# Returns a new TextMapInjector that injects b3 context using the
|
16
|
-
# specified setter
|
17
|
-
#
|
18
|
-
# @param [optional Setter] default_setter The default setter used to
|
19
|
-
# write context into a carrier during inject. Defaults to a
|
20
|
-
# {OpenTelemetry::Context:Propagation::TextMapSetter} instance.
|
21
|
-
# @return [TextMapInjector]
|
22
|
-
def initialize(default_setter = Context::Propagation.text_map_setter)
|
23
|
-
@default_setter = default_setter
|
24
|
-
end
|
25
|
-
|
26
|
-
# Set the span context on the supplied carrier.
|
27
|
-
#
|
28
|
-
# @param [Context] context The active Context.
|
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.
|
32
|
-
# @return [Object] the carrier with context injected
|
33
|
-
def inject(carrier, context, setter = nil)
|
34
|
-
span_context = Trace.current_span(context).context
|
35
|
-
return unless span_context.valid?
|
36
|
-
|
37
|
-
sampling_state = if B3.debug?(context)
|
38
|
-
'd'
|
39
|
-
elsif span_context.trace_flags.sampled?
|
40
|
-
'1'
|
41
|
-
else
|
42
|
-
'0'
|
43
|
-
end
|
44
|
-
|
45
|
-
b3_value = "#{span_context.hex_trace_id}-#{span_context.hex_span_id}-#{sampling_state}"
|
46
|
-
|
47
|
-
setter ||= @default_setter
|
48
|
-
setter.set(carrier, B3_CONTEXT_KEY, b3_value)
|
49
|
-
carrier
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|