opentelemetry-api 0.2.0 → 0.6.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -0
  3. data/CHANGELOG.md +13 -0
  4. data/LICENSE +1 -1
  5. data/OVERVIEW.md +66 -0
  6. data/lib/{opentelemetry/distributed_context/manager.rb → opentelemetry-api.rb} +1 -6
  7. data/lib/opentelemetry.rb +37 -19
  8. data/lib/opentelemetry/baggage.rb +16 -0
  9. data/lib/opentelemetry/baggage/builder.rb +18 -0
  10. data/lib/opentelemetry/baggage/manager.rb +41 -0
  11. data/lib/opentelemetry/baggage/propagation.rb +57 -0
  12. data/lib/opentelemetry/baggage/propagation/context_keys.rb +27 -0
  13. data/lib/opentelemetry/baggage/propagation/text_map_extractor.rb +60 -0
  14. data/lib/opentelemetry/baggage/propagation/text_map_injector.rb +55 -0
  15. data/lib/opentelemetry/context.rb +138 -15
  16. data/lib/opentelemetry/context/key.rb +29 -0
  17. data/lib/opentelemetry/context/propagation.rb +22 -0
  18. data/lib/opentelemetry/context/propagation/composite_propagator.rb +73 -0
  19. data/lib/opentelemetry/context/propagation/default_getter.rb +26 -0
  20. data/lib/opentelemetry/context/propagation/default_setter.rb +26 -0
  21. data/lib/opentelemetry/context/propagation/noop_extractor.rb +26 -0
  22. data/lib/opentelemetry/context/propagation/noop_injector.rb +26 -0
  23. data/lib/opentelemetry/context/propagation/propagation.rb +27 -0
  24. data/lib/opentelemetry/context/propagation/propagator.rb +64 -0
  25. data/lib/opentelemetry/instrumentation.rb +15 -0
  26. data/lib/opentelemetry/instrumentation/base.rb +245 -0
  27. data/lib/opentelemetry/instrumentation/registry.rb +87 -0
  28. data/lib/opentelemetry/metrics.rb +1 -1
  29. data/lib/opentelemetry/metrics/handles.rb +5 -15
  30. data/lib/opentelemetry/metrics/instruments.rb +18 -69
  31. data/lib/opentelemetry/metrics/meter.rb +2 -39
  32. data/lib/opentelemetry/metrics/{meter_factory.rb → meter_provider.rb} +2 -2
  33. data/lib/opentelemetry/trace.rb +14 -17
  34. data/lib/opentelemetry/trace/link.rb +4 -3
  35. data/lib/opentelemetry/trace/propagation.rb +17 -0
  36. data/lib/opentelemetry/trace/propagation/context_keys.rb +35 -0
  37. data/lib/opentelemetry/trace/propagation/trace_context.rb +59 -0
  38. data/lib/opentelemetry/trace/propagation/trace_context/text_map_extractor.rb +58 -0
  39. data/lib/opentelemetry/trace/propagation/trace_context/text_map_injector.rb +55 -0
  40. data/lib/opentelemetry/trace/propagation/trace_context/trace_parent.rb +130 -0
  41. data/lib/opentelemetry/trace/span.rb +20 -20
  42. data/lib/opentelemetry/trace/span_context.rb +25 -1
  43. data/lib/opentelemetry/trace/status.rb +7 -2
  44. data/lib/opentelemetry/trace/tracer.rb +47 -13
  45. data/lib/opentelemetry/trace/tracer_provider.rb +22 -0
  46. data/lib/opentelemetry/trace/util/http_to_status.rb +47 -0
  47. data/lib/opentelemetry/version.rb +1 -1
  48. metadata +35 -17
  49. data/lib/opentelemetry/distributed_context.rb +0 -19
  50. data/lib/opentelemetry/distributed_context/distributed_context.rb +0 -24
  51. data/lib/opentelemetry/distributed_context/entry.rb +0 -66
  52. data/lib/opentelemetry/distributed_context/propagation.rb +0 -19
  53. data/lib/opentelemetry/distributed_context/propagation/binary_format.rb +0 -26
  54. data/lib/opentelemetry/distributed_context/propagation/text_format.rb +0 -76
  55. data/lib/opentelemetry/distributed_context/propagation/trace_parent.rb +0 -124
  56. data/lib/opentelemetry/internal.rb +0 -22
  57. data/lib/opentelemetry/trace/event.rb +0 -45
  58. data/lib/opentelemetry/trace/sampling_hint.rb +0 -22
  59. data/lib/opentelemetry/trace/tracer_factory.rb +0 -45
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- module DistributedContext
9
- # An Entry consists of Entry::Metadata, Entry::Key, and Entry::Value.
10
- class Entry
11
- attr_reader :metadata, :key, :value
12
-
13
- # Entry::Key is the name of the Entry. Entry::Key along with Entry::Value can be used to aggregate and group stats,
14
- # annotate traces and logs, etc.
15
- #
16
- # Restrictions
17
- # - Must contain only printable ASCII (codes between 32 and 126 inclusive)
18
- # - Must have length greater than zero and less than 256.
19
- # - Must not be empty.
20
- class Key
21
- attr_reader :name
22
-
23
- def initialize(name)
24
- raise ArgumentError unless Internal.printable_ascii?(name) && (1..255).include?(name.length)
25
-
26
- @name = -name
27
- end
28
- end
29
-
30
- # Entry::Value wraps a string. It MUST contain only printable ASCII (codes between 32 and 126).
31
- class Value
32
- def initialize(value)
33
- raise ArgumentError unless Internal.printable_ascii?(value)
34
-
35
- @value = -value
36
- end
37
-
38
- def to_s
39
- @value
40
- end
41
- end
42
-
43
- # Entry::Metadata contains properties associated with an Entry. For now only the property entry_ttl is defined.
44
- # In future, additional properties may be added to address specific situations.
45
- #
46
- # The creator of entries determines metadata of an entry it creates.
47
- class Metadata
48
- attr_reader :entry_ttl
49
-
50
- # An @see Entry with NO_PROPAGATION is considered to have local scope and is used within the process
51
- # where it is created.
52
- NO_PROPAGATION = 0
53
-
54
- # An @see Entry with UNLIMITED_PROPAGATION can propagate unlimited hops. However, it is still subject
55
- # to outgoing and incoming (on remote side) filter criteria.
56
- UNLIMITED_PROPAGATION = -1
57
-
58
- def initialize(entry_ttl)
59
- raise ArgumentError unless entry_ttl.is_a?(Integer)
60
-
61
- @entry_ttl = entry_ttl
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- require 'opentelemetry/distributed_context/propagation/binary_format'
8
- require 'opentelemetry/distributed_context/propagation/trace_parent'
9
- require 'opentelemetry/distributed_context/propagation/text_format'
10
-
11
- module OpenTelemetry
12
- module DistributedContext
13
- # Propagation API consists of two main formats:
14
- # - @see BinaryFormat is used to serialize and deserialize a value into a binary representation.
15
- # - @see TextFormat is used to inject and extract a value as text into carriers that travel in-band across process boundaries.
16
- module Propagation
17
- end
18
- end
19
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- module DistributedContext
9
- module Propagation
10
- # Formatter for serializing and deserializing a SpanContext into a binary format.
11
- class BinaryFormat
12
- EMPTY_BYTE_ARRAY = [].freeze
13
-
14
- private_constant(:EMPTY_BYTE_ARRAY)
15
-
16
- def to_bytes(span_context)
17
- EMPTY_BYTE_ARRAY
18
- end
19
-
20
- def from_bytes(bytes)
21
- Trace::SpanContext.invalid
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
- module OpenTelemetry
7
- module DistributedContext
8
- module Propagation
9
- # TextFormat is a formatter that injects and extracts a value as text into carriers that travel in-band across
10
- # process boundaries.
11
- # Encoding is expected to conform to the HTTP Header Field semantics. Values are often encoded as RPC/HTTP request
12
- # headers.
13
- #
14
- # The carrier of propagated data on both the client (injector) and server (extractor) side is usually an http request.
15
- # Propagation is usually implemented via library-specific request interceptors, where the client-side injects values
16
- # and the server-side extracts them.
17
- class TextFormat
18
- DEFAULT_GETTER = ->(carrier, key) { carrier[key] }
19
- DEFAULT_SETTER = ->(carrier, key, value) { carrier[key] = value }
20
- private_constant(:DEFAULT_GETTER, :DEFAULT_SETTER)
21
-
22
- # Returns an array with the trace context header keys used by this formatter
23
- attr_reader :fields
24
-
25
- # Returns a new TextFormat that injects and extracts using the specified trace context
26
- # header keys
27
- #
28
- # @param [String] traceparent_header_key The traceparent header key used in the carrier
29
- # @param [String] tracestate_header_key The tracestate header key used in the carrier
30
- # @return [TextFormatter]
31
- def initialize(traceparent_header_key:, tracestate_header_key:)
32
- @traceparent_header_key = traceparent_header_key
33
- @tracestate_header_key = tracestate_header_key
34
- @fields = [traceparent_header_key, tracestate_header_key].freeze
35
- end
36
-
37
- # Return a remote {Trace::SpanContext} extracted from the supplied carrier. Expects the
38
- # the supplied carrier to have keys in rack normalized format (HTTP_#{UPPERCASE_KEY}).
39
- # Invalid headers will result in a new, valid, non-remote {Trace::SpanContext}.
40
- #
41
- # @param [Carrier] carrier The carrier to get the header from.
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 [SpanContext] the span context from the header, or a new one if parsing fails.
48
- def extract(carrier, &getter)
49
- getter ||= DEFAULT_GETTER
50
- header = getter.call(carrier, @traceparent_header_key)
51
- tp = TraceParent.from_string(header)
52
-
53
- tracestate = getter.call(carrier, @tracestate_header_key)
54
-
55
- Trace::SpanContext.new(trace_id: tp.trace_id, span_id: tp.span_id, trace_flags: tp.flags, tracestate: tracestate, remote: true)
56
- rescue OpenTelemetry::Error
57
- Trace::SpanContext.new
58
- end
59
-
60
- # Set the span context on the supplied carrier.
61
- #
62
- # @param [SpanContext] context The active {Trace::SpanContext}.
63
- # @param [optional Callable] setter An optional callable that takes a carrier and a key and
64
- # a value and assigns the key-value pair in the carrier. If omitted the default setter
65
- # will be used which expects the carrier to respond to [] and []=.
66
- # @yield [Carrier, String, String] if an optional setter is provided, inject will yield
67
- # carrier, header key, header value to the setter.
68
- def inject(context, carrier, &setter)
69
- setter ||= DEFAULT_SETTER
70
- setter.call(carrier, @traceparent_header_key, TraceParent.from_context(context).to_s)
71
- setter.call(carrier, @tracestate_header_key, context.tracestate) unless context.tracestate.nil?
72
- end
73
- end
74
- end
75
- end
76
- end
@@ -1,124 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
- module OpenTelemetry
7
- module DistributedContext
8
- module Propagation
9
- # A TraceParent is an implementation of the W3C trace context specification
10
- # https://www.w3.org/TR/trace-context/
11
- # {Trace::SpanContext}
12
- class TraceParent
13
- InvalidFormatError = Class.new(Error)
14
- InvalidVersionError = Class.new(Error)
15
- InvalidTraceIDError = Class.new(Error)
16
- InvalidSpanIDError = Class.new(Error)
17
-
18
- TRACE_PARENT_HEADER = 'traceparent'
19
- SUPPORTED_VERSION = 0
20
- private_constant :SUPPORTED_VERSION
21
- MAX_VERSION = 254
22
- private_constant :MAX_VERSION
23
-
24
- REGEXP = /^(?<version>[A-Fa-f0-9]{2})-(?<trace_id>[A-Fa-f0-9]{32})-(?<span_id>[A-Fa-f0-9]{16})-(?<flags>[A-Fa-f0-9]{2})(?<ignored>-.*)?$/.freeze
25
- private_constant :REGEXP
26
-
27
- class << self
28
- # Creates a new {TraceParent} from a supplied {Trace::SpanContext}
29
- # @param [SpanContext] ctx The context
30
- # @return [TraceParent] a trace parent
31
- def from_context(ctx)
32
- new(trace_id: ctx.trace_id, span_id: ctx.span_id, flags: ctx.trace_flags)
33
- end
34
-
35
- # Deserializes the {TraceParent} from the string representation
36
- # @param [String] string The serialized trace parent
37
- # @return [TraceParent] a trace_parent
38
- # @raise [InvalidFormatError] on an invalid format
39
- # @raise [InvalidVerionError] on an invalid version
40
- # @raise [InvalidTraceIDError] on an invalid trace_id
41
- # @raise [InvalidSpanIDError] on an invalid span_id
42
- def from_string(string)
43
- matches = match_input(string)
44
-
45
- version = parse_version(matches[:version])
46
- raise InvalidFormatError if version > SUPPORTED_VERSION && string.length < 55
47
-
48
- trace_id = parse_trace_id(matches[:trace_id])
49
- span_id = parse_span_id(matches[:span_id])
50
- flags = parse_flags(matches[:flags])
51
-
52
- new(trace_id: trace_id, span_id: span_id, flags: flags)
53
- end
54
-
55
- private
56
-
57
- def match_input(string)
58
- matches = REGEXP.match(string)
59
- raise InvalidFormatError, 'regexp match failed' if !matches || matches.length < 6
60
-
61
- matches
62
- end
63
-
64
- def parse_version(string)
65
- v = string.to_i(16)
66
- raise InvalidFormatError, string unless v
67
- raise InvalidVersionError, v if v > MAX_VERSION
68
-
69
- v
70
- end
71
-
72
- def parse_trace_id(string)
73
- raise InvalidTraceIDError, string if string == OpenTelemetry::Trace::INVALID_TRACE_ID
74
-
75
- string.downcase!
76
- string
77
- end
78
-
79
- def parse_span_id(string)
80
- raise InvalidSpanIDError, string if string == OpenTelemetry::Trace::INVALID_SPAN_ID
81
-
82
- string.downcase!
83
- string
84
- end
85
-
86
- def parse_flags(string)
87
- OpenTelemetry::Trace::TraceFlags.from_byte(string.to_i(16))
88
- end
89
- end
90
-
91
- attr_reader :version, :trace_id, :span_id, :flags
92
-
93
- private_class_method :new
94
-
95
- # Returns the sampling choice from the trace_flags
96
- # @return [Boolean] the sampling choice
97
- def sampled?
98
- flags.sampled?
99
- end
100
-
101
- # converts this object into a string according to the w3c spec
102
- # @return [String] the serialized trace_parent
103
- def to_s
104
- "00-#{trace_id}-#{span_id}-#{flag_string}"
105
- end
106
-
107
- private
108
-
109
- def flag_string
110
- # the w3c standard only dictates the one flag for this version
111
- # therefore we can only output the one flag.
112
- flags.sampled? ? '01' : '00'
113
- end
114
-
115
- def initialize(trace_id: nil, span_id: nil, version: SUPPORTED_VERSION, flags: Trace::TraceFlags::DEFAULT)
116
- @trace_id = trace_id
117
- @span_id = span_id
118
- @version = version
119
- @flags = flags
120
- end
121
- end
122
- end
123
- end
124
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- # @api private
9
- #
10
- # Internal contains helpers used by the no-op API implementation.
11
- module Internal
12
- extend self
13
-
14
- def printable_ascii?(string)
15
- return false unless string.is_a?(String)
16
-
17
- r = 32..126
18
- string.each_codepoint { |c| return false unless r.include?(c) }
19
- true
20
- end
21
- end
22
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- module Trace
9
- # A text annotation with a set of attributes and a timestamp.
10
- class Event
11
- EMPTY_ATTRIBUTES = {}.freeze
12
-
13
- private_constant :EMPTY_ATTRIBUTES
14
-
15
- # Returns the name of this event
16
- #
17
- # @return [String]
18
- attr_reader :name
19
-
20
- # Returns the frozen attributes for this event
21
- #
22
- # @return [Hash<String, Object>]
23
- attr_reader :attributes
24
-
25
- # Returns the timestamp for this event
26
- #
27
- # @return [Time]
28
- attr_reader :timestamp
29
-
30
- # Returns a new immutable {Event}.
31
- #
32
- # @param [String] name The name of this event
33
- # @param [optional Hash<String, Object>] attributes A hash of attributes for this
34
- # event. Attributes will be frozen during Event initialization.
35
- # @param [optional Time] timestamp The timestamp for this event.
36
- # Defaults to Time.now.
37
- # @return [Event]
38
- def initialize(name:, attributes: nil, timestamp: nil)
39
- @name = name
40
- @attributes = attributes.freeze || EMPTY_ATTRIBUTES
41
- @timestamp = timestamp || Time.now
42
- end
43
- end
44
- end
45
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- module Trace
9
- # Hints to influence sampling decisions. The default option for span
10
- # creation is to not provide any suggestion.
11
- module SamplingHint
12
- # Suggest to not record events and not sample.
13
- NOT_RECORD = :__not_record__
14
-
15
- # Suggest to record events and not sample.
16
- RECORD = :__record__
17
-
18
- # Suggest to record events and sample.
19
- RECORD_AND_SAMPLED = :__record_and_sampled__
20
- end
21
- end
22
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- module Trace
9
- # No-op implementation of a tracer factory.
10
- class TracerFactory
11
- HTTP_TEXT_FORMAT = DistributedContext::Propagation::TextFormat.new(
12
- traceparent_header_key: 'traceparent',
13
- tracestate_header_key: 'tracestate'
14
- )
15
- RACK_HTTP_TEXT_FORMAT = DistributedContext::Propagation::TextFormat.new(
16
- traceparent_header_key: 'HTTP_TRACEPARENT',
17
- tracestate_header_key: 'HTTP_TRACESTATE'
18
- )
19
- BINARY_FORMAT = DistributedContext::Propagation::BinaryFormat.new
20
- private_constant(:HTTP_TEXT_FORMAT, :RACK_HTTP_TEXT_FORMAT, :BINARY_FORMAT)
21
-
22
- # Returns a {Tracer} instance.
23
- #
24
- # @param [optional String] name Instrumentation package name
25
- # @param [optional String] version Instrumentation package version
26
- #
27
- # @return [Tracer]
28
- def tracer(name = nil, version = nil)
29
- @tracer ||= Tracer.new
30
- end
31
-
32
- def binary_format
33
- BINARY_FORMAT
34
- end
35
-
36
- def http_text_format
37
- HTTP_TEXT_FORMAT
38
- end
39
-
40
- def rack_http_text_format
41
- RACK_HTTP_TEXT_FORMAT
42
- end
43
- end
44
- end
45
- end