opentelemetry-sdk 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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -0
  3. data/CHANGELOG.md +23 -0
  4. data/LICENSE +1 -1
  5. data/README.md +73 -0
  6. data/lib/opentelemetry-sdk.rb +7 -0
  7. data/lib/opentelemetry/sdk.rb +51 -0
  8. data/lib/opentelemetry/sdk/baggage.rb +16 -0
  9. data/lib/opentelemetry/sdk/baggage/builder.rb +40 -0
  10. data/lib/opentelemetry/sdk/baggage/manager.rb +97 -0
  11. data/lib/opentelemetry/sdk/configurator.rb +172 -0
  12. data/lib/opentelemetry/sdk/instrumentation_library.rb +13 -0
  13. data/lib/opentelemetry/sdk/internal.rb +21 -1
  14. data/lib/opentelemetry/sdk/resources.rb +1 -0
  15. data/lib/opentelemetry/sdk/resources/constants.rb +124 -0
  16. data/lib/opentelemetry/sdk/resources/resource.rb +39 -19
  17. data/lib/opentelemetry/sdk/trace.rb +2 -1
  18. data/lib/opentelemetry/sdk/trace/config/trace_config.rb +3 -3
  19. data/lib/opentelemetry/sdk/trace/event.rb +48 -0
  20. data/lib/opentelemetry/sdk/trace/export.rb +2 -7
  21. data/lib/opentelemetry/sdk/trace/export/batch_span_processor.rb +41 -35
  22. data/lib/opentelemetry/sdk/trace/export/console_span_exporter.rb +1 -1
  23. data/lib/opentelemetry/sdk/trace/export/in_memory_span_exporter.rb +7 -7
  24. data/lib/opentelemetry/sdk/trace/export/multi_span_exporter.rb +8 -14
  25. data/lib/opentelemetry/sdk/trace/export/noop_span_exporter.rb +4 -4
  26. data/lib/opentelemetry/sdk/trace/export/simple_span_processor.rb +10 -1
  27. data/lib/opentelemetry/sdk/trace/multi_span_processor.rb +12 -1
  28. data/lib/opentelemetry/sdk/trace/noop_span_processor.rb +10 -1
  29. data/lib/opentelemetry/sdk/trace/samplers.rb +48 -57
  30. data/lib/opentelemetry/sdk/trace/samplers/constant_sampler.rb +33 -0
  31. data/lib/opentelemetry/sdk/trace/samplers/decision.rb +3 -3
  32. data/lib/opentelemetry/sdk/trace/samplers/parent_based.rb +53 -0
  33. data/lib/opentelemetry/sdk/trace/samplers/result.rb +4 -3
  34. data/lib/opentelemetry/sdk/trace/samplers/trace_id_ratio_based.rb +45 -0
  35. data/lib/opentelemetry/sdk/trace/span.rb +39 -28
  36. data/lib/opentelemetry/sdk/trace/span_data.rb +18 -2
  37. data/lib/opentelemetry/sdk/trace/tracer.rb +26 -15
  38. data/lib/opentelemetry/sdk/trace/{tracer_factory.rb → tracer_provider.rb} +9 -9
  39. data/lib/opentelemetry/sdk/version.rb +1 -1
  40. metadata +20 -8
  41. data/lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb +0 -74
@@ -18,13 +18,13 @@ module OpenTelemetry
18
18
  class Span < OpenTelemetry::Trace::Span
19
19
  # The following readers are intended for the use of SpanProcessors and
20
20
  # should not be considered part of the public interface for instrumentation.
21
- attr_reader :name, :status, :kind, :parent_span_id, :start_timestamp, :end_timestamp, :links, :library_resource
21
+ attr_reader :name, :status, :kind, :parent_span_id, :start_timestamp, :end_timestamp, :links, :resource, :instrumentation_library
22
22
 
23
23
  # Return a frozen copy of the current attributes. This is intended for
24
- # use of SpanProcesses and should not be considered part of the public
24
+ # use of SpanProcessors and should not be considered part of the public
25
25
  # interface for instrumentation.
26
26
  #
27
- # @return [Hash<String, Object>] may be nil.
27
+ # @return [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] may be nil.
28
28
  def attributes
29
29
  # Don't bother synchronizing. Access by SpanProcessors is expected to
30
30
  # be serialized.
@@ -59,7 +59,7 @@ module OpenTelemetry
59
59
  # meanings.
60
60
  #
61
61
  # @param [String] key
62
- # @param [String, Boolean, Numeric] value
62
+ # @param [String, Boolean, Numeric, Array<String, Numeric, Boolean>] value
63
63
  #
64
64
  # @return [self] returns itself
65
65
  def set_attribute(key, value)
@@ -76,37 +76,30 @@ module OpenTelemetry
76
76
  end
77
77
  self
78
78
  end
79
+ alias []= set_attribute
79
80
 
80
- # Add an Event to a {Span}. This can be accomplished eagerly or lazily.
81
- # Lazy evaluation is useful when the event attributes are expensive to
82
- # build and where the cost can be avoided for an unsampled {Span}.
81
+ # Add an Event to a {Span}.
83
82
  #
84
- # Eager example:
83
+ # Example:
85
84
  #
86
- # span.add_event(name: 'event', attributes: {'eager' => true})
87
- #
88
- # Lazy example:
89
- #
90
- # span.add_event { OpenTelemetry::Trace::Event.new(name: 'event', attributes: {'eager' => false}) }
85
+ # span.add_event('event', attributes: {'eager' => true})
91
86
  #
92
87
  # Note that the OpenTelemetry project
93
- # {https://github.com/open-telemetry/opentelemetry-specification/blob/master/semantic-conventions.md
88
+ # {https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-semantic-conventions.md
94
89
  # documents} certain "standard event names and keys" which have
95
90
  # prescribed semantic meanings.
96
91
  #
97
- # @param [optional String] name Optional name of the event. This is
98
- # required if a block is not given.
99
- # @param [optional Hash<String, Object>] attributes One or more key:value
100
- # pairs, where the keys must be strings and the values may be string,
101
- # boolean or numeric type. This argument should only be used when
102
- # passing in a name.
92
+ # @param [String] name Name of the event.
93
+ # @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] attributes
94
+ # One or more key:value pairs, where the keys must be strings and the
95
+ # values may be string, boolean or numeric type.
103
96
  # @param [optional Time] timestamp Optional timestamp for the event.
104
- # This argument should only be used when passing in a name.
105
97
  #
106
98
  # @return [self] returns itself
107
- def add_event(name: nil, attributes: nil, timestamp: nil)
99
+ def add_event(name, attributes: nil, timestamp: nil)
108
100
  super
109
- event = block_given? ? yield : OpenTelemetry::Trace::Event.new(name: name, attributes: attributes, timestamp: timestamp || Time.now)
101
+ event = Event.new(name: name, attributes: attributes, timestamp: timestamp || Time.now)
102
+
110
103
  @mutex.synchronize do
111
104
  if @ended
112
105
  OpenTelemetry.logger.warn('Calling add_event on an ended Span.')
@@ -119,6 +112,21 @@ module OpenTelemetry
119
112
  self
120
113
  end
121
114
 
115
+ # Record an exception during the execution of this span. Multiple exceptions
116
+ # can be recorded on a span.
117
+ #
118
+ # @param [Exception] exception The exception to be recorded
119
+ #
120
+ # @return [void]
121
+ def record_exception(exception)
122
+ add_event('exception',
123
+ attributes: {
124
+ 'exception.type' => exception.class.to_s,
125
+ 'exception.message' => exception.message,
126
+ 'exception.stacktrace' => exception.full_message(highlight: false, order: :top)
127
+ })
128
+ end
129
+
122
130
  # Sets the Status to the Span
123
131
  #
124
132
  # If used, this will override the default Span status. Default is OK.
@@ -220,15 +228,17 @@ module OpenTelemetry
220
228
  @attributes,
221
229
  @links,
222
230
  @events,
223
- @library_resource,
231
+ @resource,
232
+ @instrumentation_library,
224
233
  context.span_id,
225
234
  context.trace_id,
226
- context.trace_flags
235
+ context.trace_flags,
236
+ context.tracestate
227
237
  )
228
238
  end
229
239
 
230
240
  # @api private
231
- def initialize(context, name, kind, parent_span_id, trace_config, span_processor, attributes, links, start_timestamp, library_resource) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
241
+ def initialize(context, name, kind, parent_span_id, trace_config, span_processor, attributes, links, start_timestamp, resource, instrumentation_library) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
232
242
  super(span_context: context)
233
243
  @mutex = Mutex.new
234
244
  @name = name
@@ -236,7 +246,8 @@ module OpenTelemetry
236
246
  @parent_span_id = parent_span_id.freeze || OpenTelemetry::Trace::INVALID_SPAN_ID
237
247
  @trace_config = trace_config
238
248
  @span_processor = span_processor
239
- @library_resource = library_resource
249
+ @resource = resource
250
+ @instrumentation_library = instrumentation_library
240
251
  @ended = false
241
252
  @status = nil
242
253
  @child_count = 0
@@ -306,7 +317,7 @@ module OpenTelemetry
306
317
  attrs.keep_if { |key, value| Internal.valid_key?(key) && Internal.valid_value?(value) }
307
318
  excess = attrs.size - max_attributes_per_event
308
319
  excess.times { attrs.shift } if excess.positive?
309
- event = OpenTelemetry::Trace::Event.new(name: event.name, attributes: attrs, timestamp: event.timestamp)
320
+ event = Event.new(name: event.name, attributes: attrs, timestamp: event.timestamp)
310
321
  end
311
322
  events << event
312
323
  end
@@ -23,10 +23,26 @@ module OpenTelemetry
23
23
  :attributes,
24
24
  :links,
25
25
  :events,
26
- :library_resource,
26
+ :resource,
27
+ :instrumentation_library,
27
28
  :span_id,
28
29
  :trace_id,
29
- :trace_flags)
30
+ :trace_flags,
31
+ :tracestate) do
32
+ # Returns the lowercase [hex encoded](https://tools.ietf.org/html/rfc4648#section-8) span ID.
33
+ #
34
+ # @return [String] A 16-hex-character lowercase string.
35
+ def hex_span_id
36
+ span_id.unpack1('H*')
37
+ end
38
+
39
+ # Returns the lowercase [hex encoded](https://tools.ietf.org/html/rfc4648#section-8) trace ID.
40
+ #
41
+ # @return [String] A 32-hex-character lowercase string.
42
+ def hex_trace_id
43
+ trace_id.unpack1('H*')
44
+ end
45
+ end
30
46
  end
31
47
  end
32
48
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright 2020 OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -11,6 +11,7 @@ module OpenTelemetry
11
11
  class Tracer < OpenTelemetry::Trace::Tracer
12
12
  attr_reader :name
13
13
  attr_reader :version
14
+ attr_reader :tracer_provider
14
15
 
15
16
  # @api private
16
17
  #
@@ -18,45 +19,55 @@ module OpenTelemetry
18
19
  #
19
20
  # @param [String] name Instrumentation package name
20
21
  # @param [String] version Instrumentation package version
22
+ # @param [TracerProvider] tracer_provider TracerProvider that initialized the tracer
21
23
  #
22
24
  # @return [Tracer]
23
- def initialize(name, version)
25
+ def initialize(name, version, tracer_provider)
24
26
  @name = name
25
27
  @version = version
26
- @resource = Resources::Resource.create('name' => name, 'version' => version)
28
+ @instrumentation_library = InstrumentationLibrary.new(name, version)
29
+ @tracer_provider = tracer_provider
27
30
  end
28
31
 
29
- def start_root_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil, sampling_hint: nil)
30
- parent_span_context = OpenTelemetry::Trace::SpanContext::INVALID
31
- start_span(name, with_parent_context: parent_span_context, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind, sampling_hint: sampling_hint)
32
+ def start_root_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
33
+ start_span(name, with_parent_context: Context.empty, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind)
32
34
  end
33
35
 
34
- def start_span(name, with_parent: nil, with_parent_context: nil, attributes: nil, links: nil, start_timestamp: nil, kind: nil, sampling_hint: nil) # rubocop:disable Metrics/AbcSize
36
+ def start_span(name, with_parent: nil, with_parent_context: nil, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
35
37
  name ||= 'empty'
36
38
 
37
- parent_span_context = with_parent&.context || with_parent_context || current_span.context
39
+ parent_span_context = with_parent&.context || active_span_context(with_parent_context)
38
40
  parent_span_context = nil unless parent_span_context.valid?
39
41
  parent_span_id = parent_span_context&.span_id
40
42
  tracestate = parent_span_context&.tracestate
41
43
  trace_id = parent_span_context&.trace_id
42
44
  trace_id ||= OpenTelemetry::Trace.generate_trace_id
43
45
  span_id = OpenTelemetry::Trace.generate_span_id
44
- sampler = OpenTelemetry.tracer_factory.active_trace_config.sampler
45
- result = sampler.call(trace_id: trace_id, span_id: span_id, parent_context: parent_span_context, hint: sampling_hint, links: links, name: name, kind: kind, attributes: attributes)
46
-
46
+ sampler = tracer_provider.active_trace_config.sampler
47
+ result = sampler.should_sample?(trace_id: trace_id, parent_context: parent_span_context, links: links, name: name, kind: kind, attributes: attributes)
47
48
  internal_create_span(result, name, kind, trace_id, span_id, parent_span_id, attributes, links, start_timestamp, tracestate)
48
49
  end
49
50
 
50
51
  private
51
52
 
52
53
  def internal_create_span(result, name, kind, trace_id, span_id, parent_span_id, attributes, links, start_timestamp, tracestate) # rubocop:disable Metrics/AbcSize
53
- if result.recording? && !OpenTelemetry.tracer_factory.stopped?
54
+ if result.recording? && !tracer_provider.stopped?
54
55
  trace_flags = result.sampled? ? OpenTelemetry::Trace::TraceFlags::SAMPLED : OpenTelemetry::Trace::TraceFlags::DEFAULT
55
56
  context = OpenTelemetry::Trace::SpanContext.new(trace_id: trace_id, trace_flags: trace_flags, tracestate: tracestate)
56
57
  attributes = attributes&.merge(result.attributes) || result.attributes
57
- active_trace_config = OpenTelemetry.tracer_factory.active_trace_config
58
- active_span_processor = OpenTelemetry.tracer_factory.active_span_processor
59
- Span.new(context, name, kind, parent_span_id, active_trace_config, active_span_processor, attributes, links, start_timestamp || Time.now, @resource)
58
+ Span.new(
59
+ context,
60
+ name,
61
+ kind,
62
+ parent_span_id,
63
+ tracer_provider.active_trace_config,
64
+ tracer_provider.active_span_processor,
65
+ attributes,
66
+ links,
67
+ start_timestamp || Time.now,
68
+ tracer_provider.resource,
69
+ @instrumentation_library
70
+ )
60
71
  else
61
72
  OpenTelemetry::Trace::Span.new(span_context: OpenTelemetry::Trace::SpanContext.new(trace_id: trace_id))
62
73
  end
@@ -7,26 +7,26 @@
7
7
  module OpenTelemetry
8
8
  module SDK
9
9
  module Trace
10
- # {TracerFactory} is the SDK implementation of {OpenTelemetry::Trace::TracerFactory}.
11
- class TracerFactory < OpenTelemetry::Trace::TracerFactory
10
+ # {TracerProvider} is the SDK implementation of {OpenTelemetry::Trace::TracerProvider}.
11
+ class TracerProvider < OpenTelemetry::Trace::TracerProvider
12
12
  Key = Struct.new(:name, :version)
13
13
  private_constant(:Key)
14
14
 
15
15
  attr_accessor :active_trace_config
16
- attr_reader :active_span_processor
17
- attr_reader :stopped
16
+ attr_reader :active_span_processor, :stopped, :resource
18
17
  alias stopped? stopped
19
18
 
20
- # Returns a new {TracerFactory} instance.
19
+ # Returns a new {TracerProvider} instance.
21
20
  #
22
- # @return [TracerFactory]
23
- def initialize
21
+ # @return [TracerProvider]
22
+ def initialize(resource = OpenTelemetry::SDK::Resources::Resource.create)
24
23
  @mutex = Mutex.new
25
24
  @registry = {}
26
25
  @active_span_processor = NoopSpanProcessor.instance
27
26
  @active_trace_config = Config::TraceConfig::DEFAULT
28
27
  @registered_span_processors = []
29
28
  @stopped = false
29
+ @resource = resource
30
30
  end
31
31
 
32
32
  # Returns a {Tracer} instance.
@@ -38,7 +38,7 @@ module OpenTelemetry
38
38
  def tracer(name = nil, version = nil)
39
39
  name ||= ''
40
40
  version ||= ''
41
- @mutex.synchronize { @registry[Key.new(name, version)] ||= Tracer.new(name, version) }
41
+ @mutex.synchronize { @registry[Key.new(name, version)] ||= Tracer.new(name, version, self) }
42
42
  end
43
43
 
44
44
  # Attempts to stop all the activity for this {Tracer}. Calls
@@ -75,7 +75,7 @@ module OpenTelemetry
75
75
  return
76
76
  end
77
77
  @registered_span_processors << span_processor
78
- @active_span_processor = MultiSpanProcessor.new(@registered_span_processors)
78
+ @active_span_processor = MultiSpanProcessor.new(@registered_span_processors.dup)
79
79
  end
80
80
  end
81
81
  end
@@ -7,6 +7,6 @@
7
7
  module OpenTelemetry
8
8
  module SDK
9
9
  ## Current OpenTelemetry version
10
- VERSION = '0.2.0'
10
+ VERSION = '0.6.0'
11
11
  end
12
12
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.6.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: 2019-11-13 00:00:00.000000000 Z
11
+ date: 2020-09-11 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.0'
19
+ version: 0.6.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.0'
26
+ version: 0.6.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -143,15 +143,25 @@ executables: []
143
143
  extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
+ - ".yardopts"
146
147
  - CHANGELOG.md
147
148
  - LICENSE
149
+ - README.md
150
+ - lib/opentelemetry-sdk.rb
148
151
  - lib/opentelemetry/sdk.rb
152
+ - lib/opentelemetry/sdk/baggage.rb
153
+ - lib/opentelemetry/sdk/baggage/builder.rb
154
+ - lib/opentelemetry/sdk/baggage/manager.rb
155
+ - lib/opentelemetry/sdk/configurator.rb
156
+ - lib/opentelemetry/sdk/instrumentation_library.rb
149
157
  - lib/opentelemetry/sdk/internal.rb
150
158
  - lib/opentelemetry/sdk/resources.rb
159
+ - lib/opentelemetry/sdk/resources/constants.rb
151
160
  - lib/opentelemetry/sdk/resources/resource.rb
152
161
  - lib/opentelemetry/sdk/trace.rb
153
162
  - lib/opentelemetry/sdk/trace/config.rb
154
163
  - lib/opentelemetry/sdk/trace/config/trace_config.rb
164
+ - lib/opentelemetry/sdk/trace/event.rb
155
165
  - lib/opentelemetry/sdk/trace/export.rb
156
166
  - lib/opentelemetry/sdk/trace/export/batch_span_processor.rb
157
167
  - lib/opentelemetry/sdk/trace/export/console_span_exporter.rb
@@ -162,13 +172,15 @@ files:
162
172
  - lib/opentelemetry/sdk/trace/multi_span_processor.rb
163
173
  - lib/opentelemetry/sdk/trace/noop_span_processor.rb
164
174
  - lib/opentelemetry/sdk/trace/samplers.rb
175
+ - lib/opentelemetry/sdk/trace/samplers/constant_sampler.rb
165
176
  - lib/opentelemetry/sdk/trace/samplers/decision.rb
166
- - lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb
177
+ - lib/opentelemetry/sdk/trace/samplers/parent_based.rb
167
178
  - lib/opentelemetry/sdk/trace/samplers/result.rb
179
+ - lib/opentelemetry/sdk/trace/samplers/trace_id_ratio_based.rb
168
180
  - lib/opentelemetry/sdk/trace/span.rb
169
181
  - lib/opentelemetry/sdk/trace/span_data.rb
170
182
  - lib/opentelemetry/sdk/trace/tracer.rb
171
- - lib/opentelemetry/sdk/trace/tracer_factory.rb
183
+ - lib/opentelemetry/sdk/trace/tracer_provider.rb
172
184
  - lib/opentelemetry/sdk/version.rb
173
185
  homepage: https://github.com/open-telemetry/opentelemetry-ruby
174
186
  licenses:
@@ -182,14 +194,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
194
  requirements:
183
195
  - - ">="
184
196
  - !ruby/object:Gem::Version
185
- version: 2.4.0
197
+ version: 2.5.0
186
198
  required_rubygems_version: !ruby/object:Gem::Requirement
187
199
  requirements:
188
200
  - - ">="
189
201
  - !ruby/object:Gem::Version
190
202
  version: '0'
191
203
  requirements: []
192
- rubygems_version: 3.0.3
204
+ rubygems_version: 3.1.2
193
205
  signing_key:
194
206
  specification_version: 4
195
207
  summary: A stats collection and distributed tracing framework
@@ -1,74 +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 SDK
9
- module Trace
10
- module Samplers
11
- # @api private
12
- #
13
- # Implements sampling based on a probability.
14
- class ProbabilitySampler
15
- HINT_RECORD_AND_SAMPLED = OpenTelemetry::Trace::SamplingHint::RECORD_AND_SAMPLED
16
- HINT_RECORD = OpenTelemetry::Trace::SamplingHint::RECORD
17
-
18
- private_constant(:HINT_RECORD_AND_SAMPLED, :HINT_RECORD)
19
-
20
- def initialize(probability, ignore_hints:, ignore_parent:, apply_to_remote_parent:, apply_to_all_spans:)
21
- @probability = probability
22
- @id_upper_bound = format('%016x', (probability * (2**64 - 1)).ceil)
23
- @ignored_hints = ignore_hints
24
- @use_parent_sampled_flag = !ignore_parent
25
- @apply_to_remote_parent = apply_to_remote_parent
26
- @apply_to_all_spans = apply_to_all_spans
27
- end
28
-
29
- # @api private
30
- #
31
- # Callable interface for probability sampler. See {Samplers}.
32
- def call(trace_id:, span_id:, parent_context:, hint:, links:, name:, kind:, attributes:)
33
- # Ignored for sampling decision: links, name, kind, attributes.
34
-
35
- hint = nil if @ignored_hints.include?(hint)
36
-
37
- sampled = sample?(hint, trace_id, parent_context)
38
- recording = hint == HINT_RECORD || sampled
39
-
40
- if sampled && recording
41
- RECORD_AND_SAMPLED
42
- elsif recording
43
- RECORD
44
- else
45
- NOT_RECORD
46
- end
47
- end
48
-
49
- private
50
-
51
- def sample?(hint, trace_id, parent_context)
52
- if parent_context.nil?
53
- hint == HINT_RECORD_AND_SAMPLED || sample_trace_id?(trace_id)
54
- else
55
- parent_sampled?(parent_context) || hint == HINT_RECORD_AND_SAMPLED || sample_trace_id_for_child?(parent_context, trace_id)
56
- end
57
- end
58
-
59
- def parent_sampled?(parent_context)
60
- @use_parent_sampled_flag && parent_context.trace_flags.sampled?
61
- end
62
-
63
- def sample_trace_id_for_child?(parent_context, trace_id)
64
- (@apply_to_all_spans || (@apply_to_remote_parent && parent_context.remote?)) && sample_trace_id?(trace_id)
65
- end
66
-
67
- def sample_trace_id?(trace_id)
68
- @probability == 1.0 || trace_id[16, 16] < @id_upper_bound
69
- end
70
- end
71
- end
72
- end
73
- end
74
- end