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.
- checksums.yaml +4 -4
- data/.yardopts +9 -0
- data/CHANGELOG.md +23 -0
- data/LICENSE +1 -1
- data/README.md +73 -0
- data/lib/opentelemetry-sdk.rb +7 -0
- data/lib/opentelemetry/sdk.rb +51 -0
- data/lib/opentelemetry/sdk/baggage.rb +16 -0
- data/lib/opentelemetry/sdk/baggage/builder.rb +40 -0
- data/lib/opentelemetry/sdk/baggage/manager.rb +97 -0
- data/lib/opentelemetry/sdk/configurator.rb +172 -0
- data/lib/opentelemetry/sdk/instrumentation_library.rb +13 -0
- data/lib/opentelemetry/sdk/internal.rb +21 -1
- data/lib/opentelemetry/sdk/resources.rb +1 -0
- data/lib/opentelemetry/sdk/resources/constants.rb +124 -0
- data/lib/opentelemetry/sdk/resources/resource.rb +39 -19
- data/lib/opentelemetry/sdk/trace.rb +2 -1
- data/lib/opentelemetry/sdk/trace/config/trace_config.rb +3 -3
- data/lib/opentelemetry/sdk/trace/event.rb +48 -0
- data/lib/opentelemetry/sdk/trace/export.rb +2 -7
- data/lib/opentelemetry/sdk/trace/export/batch_span_processor.rb +41 -35
- data/lib/opentelemetry/sdk/trace/export/console_span_exporter.rb +1 -1
- data/lib/opentelemetry/sdk/trace/export/in_memory_span_exporter.rb +7 -7
- data/lib/opentelemetry/sdk/trace/export/multi_span_exporter.rb +8 -14
- data/lib/opentelemetry/sdk/trace/export/noop_span_exporter.rb +4 -4
- data/lib/opentelemetry/sdk/trace/export/simple_span_processor.rb +10 -1
- data/lib/opentelemetry/sdk/trace/multi_span_processor.rb +12 -1
- data/lib/opentelemetry/sdk/trace/noop_span_processor.rb +10 -1
- data/lib/opentelemetry/sdk/trace/samplers.rb +48 -57
- data/lib/opentelemetry/sdk/trace/samplers/constant_sampler.rb +33 -0
- data/lib/opentelemetry/sdk/trace/samplers/decision.rb +3 -3
- data/lib/opentelemetry/sdk/trace/samplers/parent_based.rb +53 -0
- data/lib/opentelemetry/sdk/trace/samplers/result.rb +4 -3
- data/lib/opentelemetry/sdk/trace/samplers/trace_id_ratio_based.rb +45 -0
- data/lib/opentelemetry/sdk/trace/span.rb +39 -28
- data/lib/opentelemetry/sdk/trace/span_data.rb +18 -2
- data/lib/opentelemetry/sdk/trace/tracer.rb +26 -15
- data/lib/opentelemetry/sdk/trace/{tracer_factory.rb → tracer_provider.rb} +9 -9
- data/lib/opentelemetry/sdk/version.rb +1 -1
- metadata +20 -8
- 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, :
|
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
|
24
|
+
# use of SpanProcessors and should not be considered part of the public
|
25
25
|
# interface for instrumentation.
|
26
26
|
#
|
27
|
-
# @return [Hash<String,
|
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}.
|
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
|
-
#
|
83
|
+
# Example:
|
85
84
|
#
|
86
|
-
# span.add_event(
|
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 [
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
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
|
99
|
+
def add_event(name, attributes: nil, timestamp: nil)
|
108
100
|
super
|
109
|
-
event =
|
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
|
-
@
|
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,
|
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
|
-
@
|
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 =
|
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
|
-
:
|
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
|
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
|
-
@
|
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
|
30
|
-
|
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
|
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
|
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 =
|
45
|
-
result = sampler.
|
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? && !
|
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
|
-
|
58
|
-
|
59
|
-
|
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
|
-
# {
|
11
|
-
class
|
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 {
|
19
|
+
# Returns a new {TracerProvider} instance.
|
21
20
|
#
|
22
|
-
# @return [
|
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
|
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.
|
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:
|
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:
|
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:
|
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/
|
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/
|
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.
|
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.
|
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
|