opentelemetry-api 0.10.0 → 0.14.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 +27 -0
- data/LICENSE +1 -1
- data/README.md +2 -2
- data/lib/opentelemetry-api.rb +1 -1
- data/lib/opentelemetry.rb +22 -4
- data/lib/opentelemetry/baggage.rb +1 -1
- data/lib/opentelemetry/baggage/builder.rb +1 -1
- data/lib/opentelemetry/baggage/manager.rb +1 -1
- data/lib/opentelemetry/baggage/propagation.rb +3 -23
- data/lib/opentelemetry/baggage/propagation/context_keys.rb +1 -1
- data/lib/opentelemetry/baggage/propagation/text_map_extractor.rb +13 -16
- data/lib/opentelemetry/baggage/propagation/text_map_injector.rb +13 -16
- data/lib/opentelemetry/context.rb +1 -1
- data/lib/opentelemetry/context/key.rb +1 -1
- data/lib/opentelemetry/context/propagation.rb +29 -4
- data/lib/opentelemetry/context/propagation/composite_propagator.rb +11 -12
- data/lib/opentelemetry/context/propagation/noop_extractor.rb +2 -2
- data/lib/opentelemetry/context/propagation/noop_injector.rb +1 -1
- data/lib/opentelemetry/context/propagation/propagator.rb +11 -11
- data/lib/opentelemetry/context/propagation/rack_env_getter.rb +46 -0
- data/lib/opentelemetry/context/propagation/text_map_getter.rb +27 -0
- data/lib/opentelemetry/context/propagation/text_map_setter.rb +21 -0
- data/lib/opentelemetry/error.rb +1 -1
- data/lib/opentelemetry/instrumentation.rb +1 -1
- data/lib/opentelemetry/instrumentation/base.rb +1 -1
- data/lib/opentelemetry/instrumentation/registry.rb +2 -3
- data/lib/opentelemetry/metrics.rb +1 -1
- data/lib/opentelemetry/metrics/handles.rb +1 -1
- data/lib/opentelemetry/metrics/instruments.rb +1 -1
- data/lib/opentelemetry/metrics/meter.rb +1 -1
- data/lib/opentelemetry/metrics/meter_provider.rb +1 -1
- data/lib/opentelemetry/trace.rb +15 -4
- data/lib/opentelemetry/trace/link.rb +1 -1
- data/lib/opentelemetry/trace/propagation.rb +1 -1
- data/lib/opentelemetry/trace/propagation/trace_context.rb +5 -24
- data/lib/opentelemetry/trace/propagation/trace_context/text_map_extractor.rb +14 -21
- data/lib/opentelemetry/trace/propagation/trace_context/text_map_injector.rb +14 -19
- data/lib/opentelemetry/trace/propagation/trace_context/trace_parent.rb +1 -1
- data/lib/opentelemetry/trace/span.rb +6 -2
- data/lib/opentelemetry/trace/span_context.rb +3 -3
- data/lib/opentelemetry/trace/span_kind.rb +1 -1
- data/lib/opentelemetry/trace/status.rb +1 -1
- data/lib/opentelemetry/trace/trace_flags.rb +1 -1
- data/lib/opentelemetry/trace/tracer.rb +1 -1
- data/lib/opentelemetry/trace/tracer_provider.rb +1 -1
- data/lib/opentelemetry/trace/tracestate.rb +158 -0
- data/lib/opentelemetry/trace/util/http_to_status.rb +1 -1
- data/lib/opentelemetry/version.rb +2 -2
- metadata +9 -8
- data/lib/opentelemetry/context/propagation/default_getter.rb +0 -26
- data/lib/opentelemetry/context/propagation/default_setter.rb +0 -26
- data/lib/opentelemetry/context/propagation/propagation.rb +0 -27
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
4
|
#
|
5
5
|
# SPDX-License-Identifier: Apache-2.0
|
6
6
|
|
@@ -28,13 +28,13 @@ module OpenTelemetry
|
|
28
28
|
# context into
|
29
29
|
# @param [optional Context] context Context to be injected into carrier. Defaults
|
30
30
|
# to +Context.current+
|
31
|
-
# @param [optional
|
32
|
-
#
|
33
|
-
# will be used
|
31
|
+
# @param [optional Setter] setter If the optional setter is provided, it
|
32
|
+
# will be used to write context into the carrier, otherwise the default
|
33
|
+
# setter will be used.
|
34
34
|
#
|
35
35
|
# @return [Object] carrier
|
36
|
-
def inject(carrier, context
|
37
|
-
@injector.inject(carrier, context,
|
36
|
+
def inject(carrier, context: Context.current, setter: Context::Propagation.text_map_setter)
|
37
|
+
@injector.inject(carrier, context, setter)
|
38
38
|
rescue => e # rubocop:disable Style/RescueStandardError
|
39
39
|
OpenTelemetry.logger.warn "Error in Propagator#inject #{e.message}"
|
40
40
|
carrier
|
@@ -46,14 +46,14 @@ module OpenTelemetry
|
|
46
46
|
# @param [Object] carrier The carrier to extract context from
|
47
47
|
# @param [optional Context] context Context to be updated with the state
|
48
48
|
# extracted from the carrier. Defaults to +Context.current+
|
49
|
-
# @param [optional
|
50
|
-
#
|
51
|
-
#
|
49
|
+
# @param [optional Getter] getter If the optional getter is provided, it
|
50
|
+
# will be used to read the header from the carrier, otherwise the default
|
51
|
+
# getter will be used.
|
52
52
|
#
|
53
53
|
# @return [Context] a new context updated with state extracted from the
|
54
54
|
# carrier
|
55
|
-
def extract(carrier, context
|
56
|
-
@extractor.extract(carrier, context,
|
55
|
+
def extract(carrier, context: Context.current, getter: Context::Propagation.text_map_getter)
|
56
|
+
@extractor.extract(carrier, context, getter)
|
57
57
|
rescue => e # rubocop:disable Style/RescueStandardError
|
58
58
|
OpenTelemetry.logger.warn "Error in Propagator#extract #{e.message}"
|
59
59
|
context
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
class Context
|
9
|
+
module Propagation
|
10
|
+
# The RackEnvGetter class provides a common methods for reading
|
11
|
+
# keys from a rack environment. It abstracts away the rack-normalization
|
12
|
+
# process so that keys can be looked up without having to transform them
|
13
|
+
# first. With this class you can get +traceparent+ instead of
|
14
|
+
# +HTTP_TRACEPARENT+
|
15
|
+
class RackEnvGetter
|
16
|
+
# Converts key into a rack-normalized key and reads it from the carrier.
|
17
|
+
# Useful for extract operations.
|
18
|
+
def get(carrier, key)
|
19
|
+
carrier[to_rack_key(key)]
|
20
|
+
end
|
21
|
+
|
22
|
+
# Reads all keys from a carrier and converts them from the rack-normalized
|
23
|
+
# form to the original. The resulting keys will be lowercase and
|
24
|
+
# underscores will be replaced with dashes.
|
25
|
+
def keys(carrier)
|
26
|
+
carrier.keys.map(&method(:from_rack_key))
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def to_rack_key(key)
|
32
|
+
ret = 'HTTP_' + key
|
33
|
+
ret.tr!('-', '_')
|
34
|
+
ret.upcase!
|
35
|
+
end
|
36
|
+
|
37
|
+
def from_rack_key(key)
|
38
|
+
start = key.start_with?('HTTP_') ? 5 : 0
|
39
|
+
ret = key[start..-1]
|
40
|
+
ret.tr!('_', '-')
|
41
|
+
ret.downcase!
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
class Context
|
9
|
+
module Propagation
|
10
|
+
# The default getter module provides a common methods for reading
|
11
|
+
# key from a carrier that implements +[]+ and a +keys+ method
|
12
|
+
class TextMapGetter
|
13
|
+
# Reads a key from a carrier that implements +[]+. Useful for extract
|
14
|
+
# operations.
|
15
|
+
def get(carrier, key)
|
16
|
+
carrier[key]
|
17
|
+
end
|
18
|
+
|
19
|
+
# Reads all keys from a carrier. Useful for iterating over a carrier's
|
20
|
+
# keys.
|
21
|
+
def keys(carrier)
|
22
|
+
carrier.keys
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
class Context
|
9
|
+
module Propagation
|
10
|
+
# The default setter module provides a common method for writing
|
11
|
+
# a key into a carrier that implements +[]=+
|
12
|
+
class TextMapSetter
|
13
|
+
# Writes key into a carrier that implements +[]=+. Useful for inject
|
14
|
+
# operations.
|
15
|
+
def set(carrier, key, value)
|
16
|
+
carrier[key] = value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/opentelemetry/error.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
4
|
#
|
5
5
|
# SPDX-License-Identifier: Apache-2.0
|
6
6
|
|
@@ -79,8 +79,7 @@ module OpenTelemetry
|
|
79
79
|
OpenTelemetry.logger.warn "Instrumentation: #{instrumentation.name} failed to install"
|
80
80
|
end
|
81
81
|
rescue => e # rubocop:disable Style/RescueStandardError
|
82
|
-
OpenTelemetry.
|
83
|
-
"during install #{e}: #{e.backtrace}"
|
82
|
+
OpenTelemetry.handle_error(exception: e, message: "Instrumentation: #{instrumentation.name} unhandled exception during install: #{e.backtrace}")
|
84
83
|
end
|
85
84
|
end
|
86
85
|
end
|
data/lib/opentelemetry/trace.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
4
|
#
|
5
5
|
# SPDX-License-Identifier: Apache-2.0
|
6
6
|
|
@@ -13,7 +13,17 @@ module OpenTelemetry
|
|
13
13
|
|
14
14
|
CURRENT_SPAN_KEY = Context.create_key('current-span')
|
15
15
|
|
16
|
-
|
16
|
+
# Random number generator for generating IDs. This is an object that can
|
17
|
+
# respond to `#bytes` and uses the system PRNG. The current logic is
|
18
|
+
# compatible with Ruby 2.5 (which does not implement the `Random.bytes`
|
19
|
+
# class method) and with Ruby 3.0+ (which deprecates `Random::DEFAULT`).
|
20
|
+
# When we drop support for Ruby 2.5, this can simply be replaced with
|
21
|
+
# the class `Random`.
|
22
|
+
#
|
23
|
+
# @return [#bytes]
|
24
|
+
RANDOM = Random.respond_to?(:bytes) ? Random : Random::DEFAULT
|
25
|
+
|
26
|
+
private_constant :CURRENT_SPAN_KEY, :RANDOM
|
17
27
|
|
18
28
|
# An invalid trace identifier, a 16-byte string with all zero bytes.
|
19
29
|
INVALID_TRACE_ID = ("\0" * 16).b
|
@@ -27,7 +37,7 @@ module OpenTelemetry
|
|
27
37
|
# @return [String] a valid trace ID.
|
28
38
|
def generate_trace_id
|
29
39
|
loop do
|
30
|
-
id =
|
40
|
+
id = RANDOM.bytes(16)
|
31
41
|
return id unless id == INVALID_TRACE_ID
|
32
42
|
end
|
33
43
|
end
|
@@ -38,7 +48,7 @@ module OpenTelemetry
|
|
38
48
|
# @return [String] a valid span ID.
|
39
49
|
def generate_span_id
|
40
50
|
loop do
|
41
|
-
id =
|
51
|
+
id = RANDOM.bytes(8)
|
42
52
|
return id unless id == INVALID_SPAN_ID
|
43
53
|
end
|
44
54
|
end
|
@@ -76,6 +86,7 @@ end
|
|
76
86
|
|
77
87
|
require 'opentelemetry/trace/link'
|
78
88
|
require 'opentelemetry/trace/trace_flags'
|
89
|
+
require 'opentelemetry/trace/tracestate'
|
79
90
|
require 'opentelemetry/trace/span_context'
|
80
91
|
require 'opentelemetry/trace/span_kind'
|
81
92
|
require 'opentelemetry/trace/span'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
4
|
#
|
5
5
|
# SPDX-License-Identifier: Apache-2.0
|
6
6
|
|
@@ -15,20 +15,13 @@ module OpenTelemetry
|
|
15
15
|
# for context propagation in the W3C Trace Context format.
|
16
16
|
module TraceContext
|
17
17
|
extend self
|
18
|
-
|
18
|
+
TRACEPARENT_KEY = 'traceparent'
|
19
|
+
TRACESTATE_KEY = 'tracestate'
|
19
20
|
TEXT_MAP_EXTRACTOR = TextMapExtractor.new
|
20
21
|
TEXT_MAP_INJECTOR = TextMapInjector.new
|
21
|
-
RACK_EXTRACTOR = TextMapExtractor.new(
|
22
|
-
traceparent_key: 'HTTP_TRACEPARENT',
|
23
|
-
tracestate_key: 'HTTP_TRACESTATE'
|
24
|
-
)
|
25
|
-
RACK_INJECTOR = TextMapInjector.new(
|
26
|
-
traceparent_key: 'HTTP_TRACEPARENT',
|
27
|
-
tracestate_key: 'HTTP_TRACESTATE'
|
28
|
-
)
|
29
22
|
|
30
|
-
private_constant :
|
31
|
-
:
|
23
|
+
private_constant :TRACEPARENT_KEY, :TRACESTATE_KEY,
|
24
|
+
:TEXT_MAP_INJECTOR, :TEXT_MAP_EXTRACTOR
|
32
25
|
|
33
26
|
# Returns an extractor that extracts context using the W3C Trace Context
|
34
27
|
# format
|
@@ -41,18 +34,6 @@ module OpenTelemetry
|
|
41
34
|
def text_map_injector
|
42
35
|
TEXT_MAP_INJECTOR
|
43
36
|
end
|
44
|
-
|
45
|
-
# Returns an extractor that extracts context using the W3C Trace Context
|
46
|
-
# with Rack normalized keys (upcased and prefixed with HTTP_)
|
47
|
-
def rack_extractor
|
48
|
-
RACK_EXTRACTOR
|
49
|
-
end
|
50
|
-
|
51
|
-
# Returns an injector that injects context using the W3C Trace Context
|
52
|
-
# format with Rack normalized keys (upcased and prefixed with HTTP_)
|
53
|
-
def rack_injector
|
54
|
-
RACK_INJECTOR
|
55
|
-
end
|
56
37
|
end
|
57
38
|
end
|
58
39
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
4
|
#
|
5
5
|
# SPDX-License-Identifier: Apache-2.0
|
6
6
|
module OpenTelemetry
|
@@ -9,18 +9,15 @@ module OpenTelemetry
|
|
9
9
|
module TraceContext
|
10
10
|
# Extracts context from carriers in the W3C Trace Context format
|
11
11
|
class TextMapExtractor
|
12
|
-
include Context::Propagation::DefaultGetter
|
13
|
-
|
14
12
|
# Returns a new TextMapExtractor that extracts context using the
|
15
|
-
# specified
|
13
|
+
# specified getter
|
16
14
|
#
|
17
|
-
# @param [
|
18
|
-
#
|
15
|
+
# @param [optional Getter] default_getter The default getter used to read
|
16
|
+
# headers from a carrier during extract. Defaults to a +TextMapGetter+
|
17
|
+
# instance.
|
19
18
|
# @return [TextMapExtractor]
|
20
|
-
def initialize(
|
21
|
-
|
22
|
-
@traceparent_key = traceparent_key
|
23
|
-
@tracestate_key = tracestate_key
|
19
|
+
def initialize(default_getter = Context::Propagation.text_map_getter)
|
20
|
+
@default_getter = default_getter
|
24
21
|
end
|
25
22
|
|
26
23
|
# Extract a remote {Trace::SpanContext} from the supplied carrier.
|
@@ -28,19 +25,15 @@ module OpenTelemetry
|
|
28
25
|
#
|
29
26
|
# @param [Carrier] carrier The carrier to get the header from.
|
30
27
|
# @param [Context] context The context to be updated with extracted context
|
31
|
-
# @param [optional
|
32
|
-
#
|
33
|
-
#
|
34
|
-
# @yield [Carrier, String] if an optional getter is provided, extract will yield the carrier
|
35
|
-
# and the header key to the getter.
|
28
|
+
# @param [optional Getter] getter If the optional getter is provided, it
|
29
|
+
# will be used to read the header from the carrier, otherwise the default
|
30
|
+
# getter will be used.
|
36
31
|
# @return [Context] Updated context with span context from the header, or the original
|
37
32
|
# context if parsing fails.
|
38
|
-
def extract(carrier, context,
|
39
|
-
getter ||= default_getter
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
tracestate = getter.call(carrier, @tracestate_key)
|
33
|
+
def extract(carrier, context, getter = nil)
|
34
|
+
getter ||= @default_getter
|
35
|
+
tp = TraceParent.from_string(getter.get(carrier, TRACEPARENT_KEY))
|
36
|
+
tracestate = Tracestate.from_string(getter.get(carrier, TRACESTATE_KEY))
|
44
37
|
|
45
38
|
span_context = Trace::SpanContext.new(trace_id: tp.trace_id,
|
46
39
|
span_id: tp.span_id,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright
|
3
|
+
# Copyright The OpenTelemetry Authors
|
4
4
|
#
|
5
5
|
# SPDX-License-Identifier: Apache-2.0
|
6
6
|
module OpenTelemetry
|
@@ -9,35 +9,30 @@ module OpenTelemetry
|
|
9
9
|
module TraceContext
|
10
10
|
# Injects context into carriers using the W3C Trace Context format
|
11
11
|
class TextMapInjector
|
12
|
-
include Context::Propagation::DefaultSetter
|
13
|
-
|
14
12
|
# Returns a new TextMapInjector that injects context using the
|
15
|
-
# specified
|
13
|
+
# specified setter
|
16
14
|
#
|
17
|
-
# @param [
|
18
|
-
#
|
15
|
+
# @param [optional Setter] default_setter The default setter used to
|
16
|
+
# write context into a carrier during inject. Defaults to a
|
17
|
+
# {TextMapSetter} instance.
|
19
18
|
# @return [TextMapInjector]
|
20
|
-
def initialize(
|
21
|
-
|
22
|
-
@traceparent_key = traceparent_key
|
23
|
-
@tracestate_key = tracestate_key
|
19
|
+
def initialize(default_setter = Context::Propagation.text_map_setter)
|
20
|
+
@default_setter = default_setter
|
24
21
|
end
|
25
22
|
|
26
23
|
# Set the span context on the supplied carrier.
|
27
24
|
#
|
28
25
|
# @param [Context] context The active {Context}.
|
29
|
-
# @param [optional
|
30
|
-
#
|
31
|
-
# will be used
|
32
|
-
# @yield [Carrier, String, String] if an optional setter is provided, inject will yield
|
33
|
-
# carrier, header key, header value to the setter.
|
26
|
+
# @param [optional Setter] setter If the optional setter is provided, it
|
27
|
+
# will be used to write context into the carrier, otherwise the default
|
28
|
+
# setter will be used.
|
34
29
|
# @return [Object] the carrier with context injected
|
35
|
-
def inject(carrier, context,
|
30
|
+
def inject(carrier, context, setter = nil)
|
36
31
|
return carrier unless (span_context = span_context_from(context))
|
37
32
|
|
38
|
-
setter ||=
|
39
|
-
setter.
|
40
|
-
setter.
|
33
|
+
setter ||= @default_setter
|
34
|
+
setter.set(carrier, TRACEPARENT_KEY, TraceParent.from_span_context(span_context).to_s)
|
35
|
+
setter.set(carrier, TRACESTATE_KEY, span_context.tracestate.to_s) unless span_context.tracestate.empty?
|
41
36
|
|
42
37
|
carrier
|
43
38
|
end
|