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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/LICENSE +1 -1
  4. data/README.md +2 -2
  5. data/lib/opentelemetry-api.rb +1 -1
  6. data/lib/opentelemetry.rb +22 -4
  7. data/lib/opentelemetry/baggage.rb +1 -1
  8. data/lib/opentelemetry/baggage/builder.rb +1 -1
  9. data/lib/opentelemetry/baggage/manager.rb +1 -1
  10. data/lib/opentelemetry/baggage/propagation.rb +3 -23
  11. data/lib/opentelemetry/baggage/propagation/context_keys.rb +1 -1
  12. data/lib/opentelemetry/baggage/propagation/text_map_extractor.rb +13 -16
  13. data/lib/opentelemetry/baggage/propagation/text_map_injector.rb +13 -16
  14. data/lib/opentelemetry/context.rb +1 -1
  15. data/lib/opentelemetry/context/key.rb +1 -1
  16. data/lib/opentelemetry/context/propagation.rb +29 -4
  17. data/lib/opentelemetry/context/propagation/composite_propagator.rb +11 -12
  18. data/lib/opentelemetry/context/propagation/noop_extractor.rb +2 -2
  19. data/lib/opentelemetry/context/propagation/noop_injector.rb +1 -1
  20. data/lib/opentelemetry/context/propagation/propagator.rb +11 -11
  21. data/lib/opentelemetry/context/propagation/rack_env_getter.rb +46 -0
  22. data/lib/opentelemetry/context/propagation/text_map_getter.rb +27 -0
  23. data/lib/opentelemetry/context/propagation/text_map_setter.rb +21 -0
  24. data/lib/opentelemetry/error.rb +1 -1
  25. data/lib/opentelemetry/instrumentation.rb +1 -1
  26. data/lib/opentelemetry/instrumentation/base.rb +1 -1
  27. data/lib/opentelemetry/instrumentation/registry.rb +2 -3
  28. data/lib/opentelemetry/metrics.rb +1 -1
  29. data/lib/opentelemetry/metrics/handles.rb +1 -1
  30. data/lib/opentelemetry/metrics/instruments.rb +1 -1
  31. data/lib/opentelemetry/metrics/meter.rb +1 -1
  32. data/lib/opentelemetry/metrics/meter_provider.rb +1 -1
  33. data/lib/opentelemetry/trace.rb +15 -4
  34. data/lib/opentelemetry/trace/link.rb +1 -1
  35. data/lib/opentelemetry/trace/propagation.rb +1 -1
  36. data/lib/opentelemetry/trace/propagation/trace_context.rb +5 -24
  37. data/lib/opentelemetry/trace/propagation/trace_context/text_map_extractor.rb +14 -21
  38. data/lib/opentelemetry/trace/propagation/trace_context/text_map_injector.rb +14 -19
  39. data/lib/opentelemetry/trace/propagation/trace_context/trace_parent.rb +1 -1
  40. data/lib/opentelemetry/trace/span.rb +6 -2
  41. data/lib/opentelemetry/trace/span_context.rb +3 -3
  42. data/lib/opentelemetry/trace/span_kind.rb +1 -1
  43. data/lib/opentelemetry/trace/status.rb +1 -1
  44. data/lib/opentelemetry/trace/trace_flags.rb +1 -1
  45. data/lib/opentelemetry/trace/tracer.rb +1 -1
  46. data/lib/opentelemetry/trace/tracer_provider.rb +1 -1
  47. data/lib/opentelemetry/trace/tracestate.rb +158 -0
  48. data/lib/opentelemetry/trace/util/http_to_status.rb +1 -1
  49. data/lib/opentelemetry/version.rb +2 -2
  50. metadata +9 -8
  51. data/lib/opentelemetry/context/propagation/default_getter.rb +0 -26
  52. data/lib/opentelemetry/context/propagation/default_setter.rb +0 -26
  53. data/lib/opentelemetry/context/propagation/propagation.rb +0 -27
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2020 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2020 OpenTelemetry Authors
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 Callable] setter An optional callable that takes a carrier, a key and
32
- # a value and assigns the key-value pair in the carrier. If omitted the default setter
33
- # will be used which expects the carrier to respond to [] and []=.
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 = Context.current, &setter)
37
- @injector.inject(carrier, context, &setter)
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 Callable] getter An optional callable that takes a carrier and a key and
50
- # returns the value associated with the key. If omitted the default getter will be used
51
- # which expects the carrier to respond to [] and []=.
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 = Context.current, &getter)
56
- @extractor.extract(carrier, context, &getter)
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
  module OpenTelemetry
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2020 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2020 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2020 OpenTelemetry Authors
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.logger.warn "Instrumentation: #{instrumentation.name} unhandled exception" \
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
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
- private_constant :CURRENT_SPAN_KEY
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 = Random::DEFAULT.bytes(16)
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 = Random::DEFAULT.bytes(8)
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 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2020 OpenTelemetry Authors
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 :TEXT_MAP_INJECTOR, :TEXT_MAP_EXTRACTOR,
31
- :RACK_INJECTOR, :RACK_EXTRACTOR
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 2020 OpenTelemetry Authors
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 header keys
13
+ # specified getter
16
14
  #
17
- # @param [String] traceparent_key The traceparent header key used in the carrier
18
- # @param [String] tracestate_key The tracestate header key used in the carrier
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(traceparent_key: 'traceparent',
21
- tracestate_key: 'tracestate')
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 Callable] getter An optional callable that takes a carrier and a key and
32
- # returns the value associated with the key. If omitted the default getter will be used
33
- # which expects the carrier to respond to [] and []=.
34
- # @yield [Carrier, String] if an optional getter is provided, extract will yield the carrier
35
- # and the header key to the getter.
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, &getter)
39
- getter ||= default_getter
40
- header = getter.call(carrier, @traceparent_key)
41
- tp = TraceParent.from_string(header)
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 2020 OpenTelemetry Authors
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 header keys
13
+ # specified setter
16
14
  #
17
- # @param [String] traceparent_key The traceparent header key used in the carrier
18
- # @param [String] tracestate_key The tracestate header key used in the carrier
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(traceparent_key: 'traceparent',
21
- tracestate_key: 'tracestate')
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 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.
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, &setter)
30
+ def inject(carrier, context, setter = nil)
36
31
  return carrier unless (span_context = span_context_from(context))
37
32
 
38
- setter ||= DEFAULT_SETTER
39
- setter.call(carrier, @traceparent_key, TraceParent.from_span_context(span_context).to_s)
40
- setter.call(carrier, @tracestate_key, span_context.tracestate) unless span_context.tracestate.nil?
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