opentelemetry-api 0.10.0 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|