opentelemetry-sdk 0.5.1 → 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/CHANGELOG.md +23 -0
- data/README.md +1 -1
- data/lib/opentelemetry/sdk.rb +1 -1
- data/lib/opentelemetry/sdk/baggage.rb +16 -0
- data/lib/opentelemetry/sdk/{correlation_context → baggage}/builder.rb +5 -5
- data/lib/opentelemetry/sdk/{correlation_context → baggage}/manager.rb +37 -27
- data/lib/opentelemetry/sdk/configurator.rb +19 -18
- data/lib/opentelemetry/sdk/resources/resource.rb +33 -22
- data/lib/opentelemetry/sdk/trace.rb +1 -0
- 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/batch_span_processor.rb +21 -10
- data/lib/opentelemetry/sdk/trace/samplers.rb +39 -32
- data/lib/opentelemetry/sdk/trace/samplers/parent_based.rb +53 -0
- data/lib/opentelemetry/sdk/trace/samplers/trace_id_ratio_based.rb +45 -0
- data/lib/opentelemetry/sdk/trace/span.rb +22 -30
- data/lib/opentelemetry/sdk/trace/span_data.rb +16 -2
- data/lib/opentelemetry/sdk/version.rb +1 -1
- metadata +11 -10
- data/lib/opentelemetry/sdk/correlation_context.rb +0 -16
- data/lib/opentelemetry/sdk/trace/samplers/parent_or_else.rb +0 -43
- data/lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a01fcf121db23108ffb47d196f9594993018bb1b945242710620bb87daa8320
|
4
|
+
data.tar.gz: ef3b3e9cd4e2853a22ffb149e7a18cbd021988412d24c40350192e222b3be58b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5da08d0e902ece66efc7afa892f99f2b9fe3bcd5b89b51cd3da1a565a23ab0917eb1c39d6fb44ed6b82a71048624cb357539d9b6305b1a0c8debc594ef2467d3
|
7
|
+
data.tar.gz: 5fe47387c0d91e8d5436be4d4464839f08a9ae46964e8fe1679ab6ef7e7bf8b7a59ae086472d465e6f12c57b70c712a982064351f287a8ebbb6bbe173c37b45d
|
data/CHANGELOG.md
CHANGED
@@ -1 +1,24 @@
|
|
1
1
|
# Release History: opentelemetry-sdk
|
2
|
+
|
3
|
+
### v0.6.0 / 2020-09-10
|
4
|
+
|
5
|
+
* BREAKING CHANGE: Rename Resource labels to attributes
|
6
|
+
* BREAKING CHANGE: Export resource from Span/SpanData instead of library_resource
|
7
|
+
* BREAKING CHANGE: Rename CorrelationContext to Baggage
|
8
|
+
* BREAKING CHANGE: Rename Text* to TextMap* (propagators, injectors, extractors)
|
9
|
+
* BREAKING CHANGE: Rename span.record_error to span.record_exception
|
10
|
+
* BREAKING CHANGE: Update samplers to match spec
|
11
|
+
* BREAKING CHANGE: Remove support for lazy event creation
|
12
|
+
|
13
|
+
* ADDED: Add OTLP exporter
|
14
|
+
* ADDED: Add support for OTEL_LOG_LEVEL env var
|
15
|
+
* FIXED: Rename Resource labels to attributes
|
16
|
+
* ADDED: Environment variable resource detection
|
17
|
+
* ADDED: BatchSpanProcessor environment variable support
|
18
|
+
* FIXED: Remove semver prefix
|
19
|
+
* FIXED: Docs for array valued attributes
|
20
|
+
* ADDED: Add hex_trace_id and hex_span_id helpers to SpanData
|
21
|
+
* FIXED: Fix ProbabilitySampler
|
22
|
+
* ADDED: Implement GetCorrelations
|
23
|
+
* FIXED: Change default Sampler to ParentOrElse(AlwaysOn)
|
24
|
+
* FIXED: Fix probability sampler
|
data/README.md
CHANGED
@@ -41,7 +41,7 @@ tracer.in_span('foo') do |span|
|
|
41
41
|
# set an attribute
|
42
42
|
span.set_attribute('platform', 'osx')
|
43
43
|
# add an event
|
44
|
-
span.add_event(
|
44
|
+
span.add_event('event in bar')
|
45
45
|
# create bar as child of foo
|
46
46
|
tracer.in_span('bar') do |child_span|
|
47
47
|
# inspect the span
|
data/lib/opentelemetry/sdk.rb
CHANGED
@@ -61,7 +61,7 @@ module OpenTelemetry
|
|
61
61
|
end
|
62
62
|
|
63
63
|
require 'opentelemetry/sdk/configurator'
|
64
|
-
require 'opentelemetry/sdk/
|
64
|
+
require 'opentelemetry/sdk/baggage'
|
65
65
|
require 'opentelemetry/sdk/internal'
|
66
66
|
require 'opentelemetry/sdk/instrumentation_library'
|
67
67
|
require 'opentelemetry/sdk/resources'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2019 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
require 'opentelemetry/sdk/baggage/builder'
|
8
|
+
require 'opentelemetry/sdk/baggage/manager'
|
9
|
+
|
10
|
+
module OpenTelemetry
|
11
|
+
module SDK
|
12
|
+
# Contains operational implementations of the Baggage::Manager
|
13
|
+
module Baggage
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -6,8 +6,8 @@
|
|
6
6
|
|
7
7
|
module OpenTelemetry
|
8
8
|
module SDK
|
9
|
-
module
|
10
|
-
# SDK implementation of
|
9
|
+
module Baggage
|
10
|
+
# SDK implementation of Baggage::Builder
|
11
11
|
class Builder
|
12
12
|
attr_reader :entries
|
13
13
|
|
@@ -15,7 +15,7 @@ module OpenTelemetry
|
|
15
15
|
@entries = entries
|
16
16
|
end
|
17
17
|
|
18
|
-
# Set key-value in the to-be-created
|
18
|
+
# Set key-value in the to-be-created baggage
|
19
19
|
#
|
20
20
|
# @param [String] key The key to store this value under
|
21
21
|
# @param [String] value String value to be stored under key
|
@@ -23,14 +23,14 @@ module OpenTelemetry
|
|
23
23
|
@entries[key] = value.to_s
|
24
24
|
end
|
25
25
|
|
26
|
-
# Removes key from the to-be-created
|
26
|
+
# Removes key from the to-be-created baggage
|
27
27
|
#
|
28
28
|
# @param [String] key The key to remove
|
29
29
|
def remove_value(key)
|
30
30
|
@entries.delete(key)
|
31
31
|
end
|
32
32
|
|
33
|
-
# Clears all
|
33
|
+
# Clears all baggage from the to-be-created baggage
|
34
34
|
def clear
|
35
35
|
@entries.clear
|
36
36
|
end
|
@@ -6,38 +6,38 @@
|
|
6
6
|
|
7
7
|
module OpenTelemetry
|
8
8
|
module SDK
|
9
|
-
module
|
10
|
-
# Manages
|
9
|
+
module Baggage
|
10
|
+
# Manages baggage
|
11
11
|
class Manager
|
12
|
-
|
13
|
-
|
14
|
-
private_constant(:
|
12
|
+
BAGGAGE_KEY = OpenTelemetry::Baggage::Propagation::ContextKeys.baggage_key
|
13
|
+
EMPTY_BAGGAGE = {}.freeze
|
14
|
+
private_constant(:BAGGAGE_KEY, :EMPTY_BAGGAGE)
|
15
15
|
|
16
|
-
# Used to chain modifications to
|
17
|
-
# context with an updated
|
18
|
-
# modification is being made to
|
16
|
+
# Used to chain modifications to baggage. The result is a
|
17
|
+
# context with an updated baggage. If only a single
|
18
|
+
# modification is being made to baggage, use the other
|
19
19
|
# methods on +Manager+, if multiple modifications are being made, use
|
20
20
|
# this one.
|
21
21
|
#
|
22
22
|
# @param [optional Context] context The context to update with with new
|
23
|
-
# modified
|
23
|
+
# modified baggage. Defaults to +Context.current+
|
24
24
|
# @return [Context]
|
25
25
|
def build_context(context: Context.current)
|
26
|
-
builder = Builder.new(
|
26
|
+
builder = Builder.new(baggage_for(context).dup)
|
27
27
|
yield builder
|
28
|
-
context.set_value(
|
28
|
+
context.set_value(BAGGAGE_KEY, builder.entries)
|
29
29
|
end
|
30
30
|
|
31
|
-
# Returns a new context with empty
|
31
|
+
# Returns a new context with empty baggage
|
32
32
|
#
|
33
|
-
# @param [optional Context] context Context to clear
|
33
|
+
# @param [optional Context] context Context to clear baggage from. Defaults
|
34
34
|
# to +Context.current+
|
35
35
|
# @return [Context]
|
36
36
|
def clear(context: Context.current)
|
37
|
-
context.set_value(
|
37
|
+
context.set_value(BAGGAGE_KEY, EMPTY_BAGGAGE)
|
38
38
|
end
|
39
39
|
|
40
|
-
# Returns the corresponding
|
40
|
+
# Returns the corresponding baggage value (or nil) for key
|
41
41
|
#
|
42
42
|
# @param [String] key The lookup key
|
43
43
|
# @param [optional Context] context The context from which to retrieve
|
@@ -45,7 +45,17 @@ module OpenTelemetry
|
|
45
45
|
# Defaults to +Context.current+
|
46
46
|
# @return [String]
|
47
47
|
def value(key, context: Context.current)
|
48
|
-
|
48
|
+
baggage_for(context)[key]
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns the baggage
|
52
|
+
#
|
53
|
+
# @param [optional Context] context The context from which to retrieve
|
54
|
+
# the baggage.
|
55
|
+
# Defaults to +Context.current+
|
56
|
+
# @return [Hash]
|
57
|
+
def values(context: Context.current)
|
58
|
+
baggage_for(context).dup.freeze
|
49
59
|
end
|
50
60
|
|
51
61
|
# Returns a new context with new key-value pair
|
@@ -56,30 +66,30 @@ module OpenTelemetry
|
|
56
66
|
# value. Defaults to +Context.current+
|
57
67
|
# @return [Context]
|
58
68
|
def set_value(key, value, context: Context.current)
|
59
|
-
|
60
|
-
|
61
|
-
context.set_value(
|
69
|
+
new_baggage = baggage_for(context).dup
|
70
|
+
new_baggage[key] = value
|
71
|
+
context.set_value(BAGGAGE_KEY, new_baggage)
|
62
72
|
end
|
63
73
|
|
64
74
|
# Returns a new context with value at key removed
|
65
75
|
#
|
66
76
|
# @param [String] key The key to remove
|
67
|
-
# @param [optional Context] context The context to remove
|
77
|
+
# @param [optional Context] context The context to remove baggage
|
68
78
|
# from. Defaults to +Context.current+
|
69
79
|
# @return [Context]
|
70
80
|
def remove_value(key, context: Context.current)
|
71
|
-
|
72
|
-
return context unless
|
81
|
+
baggage = baggage_for(context)
|
82
|
+
return context unless baggage.key?(key)
|
73
83
|
|
74
|
-
|
75
|
-
|
76
|
-
context.set_value(
|
84
|
+
new_baggage = baggage.dup
|
85
|
+
new_baggage.delete(key)
|
86
|
+
context.set_value(BAGGAGE_KEY, new_baggage)
|
77
87
|
end
|
78
88
|
|
79
89
|
private
|
80
90
|
|
81
|
-
def
|
82
|
-
context.value(
|
91
|
+
def baggage_for(context)
|
92
|
+
context.value(BAGGAGE_KEY) || EMPTY_BAGGAGE
|
83
93
|
end
|
84
94
|
end
|
85
95
|
end
|
@@ -15,32 +15,33 @@ module OpenTelemetry
|
|
15
15
|
|
16
16
|
private_constant :USE_MODE_UNSPECIFIED, :USE_MODE_ONE, :USE_MODE_ALL
|
17
17
|
|
18
|
-
attr_writer :logger, :http_extractors, :http_injectors, :
|
19
|
-
:
|
18
|
+
attr_writer :logger, :http_extractors, :http_injectors, :text_map_extractors,
|
19
|
+
:text_map_injectors
|
20
20
|
|
21
21
|
def initialize
|
22
22
|
@instrumentation_names = []
|
23
23
|
@instrumentation_config_map = {}
|
24
24
|
@http_extractors = nil
|
25
25
|
@http_injectors = nil
|
26
|
-
@
|
27
|
-
@
|
26
|
+
@text_map_extractors = nil
|
27
|
+
@text_map_injectors = nil
|
28
28
|
@span_processors = []
|
29
29
|
@use_mode = USE_MODE_UNSPECIFIED
|
30
30
|
@resource = Resources::Resource.telemetry_sdk
|
31
31
|
end
|
32
32
|
|
33
33
|
def logger
|
34
|
-
@logger ||=
|
34
|
+
@logger ||= OpenTelemetry.logger
|
35
35
|
end
|
36
36
|
|
37
37
|
# Accepts a resource object that is merged with the default telemetry sdk
|
38
38
|
# resource. The use of this method is optional, and is provided as means
|
39
|
-
# to
|
39
|
+
# to include additional resource information.
|
40
|
+
# If a resource key collision occurs the passed in resource takes priority.
|
40
41
|
#
|
41
42
|
# @param [Resource] new_resource The resource to be merged
|
42
43
|
def resource=(new_resource)
|
43
|
-
@resource =
|
44
|
+
@resource = new_resource.merge(@resource)
|
44
45
|
end
|
45
46
|
|
46
47
|
# Install an instrumentation with specificied optional +config+.
|
@@ -89,7 +90,7 @@ module OpenTelemetry
|
|
89
90
|
# - install instrumentation
|
90
91
|
def configure
|
91
92
|
OpenTelemetry.logger = logger
|
92
|
-
OpenTelemetry.
|
93
|
+
OpenTelemetry.baggage = Baggage::Manager.new
|
93
94
|
configure_propagation
|
94
95
|
configure_span_processors
|
95
96
|
OpenTelemetry.tracer_provider = tracer_provider
|
@@ -130,8 +131,8 @@ module OpenTelemetry
|
|
130
131
|
def configure_propagation
|
131
132
|
OpenTelemetry.propagation.http = create_propagator(@http_injectors || default_http_injectors,
|
132
133
|
@http_extractors || default_http_extractors)
|
133
|
-
OpenTelemetry.propagation.text = create_propagator(@
|
134
|
-
@
|
134
|
+
OpenTelemetry.propagation.text = create_propagator(@text_map_injectors || default_text_map_injectors,
|
135
|
+
@text_map_extractors || default_text_map_extractors)
|
135
136
|
end
|
136
137
|
|
137
138
|
def create_propagator(injectors, extractors)
|
@@ -143,27 +144,27 @@ module OpenTelemetry
|
|
143
144
|
end
|
144
145
|
|
145
146
|
def default_http_injectors
|
146
|
-
|
147
|
+
default_text_map_injectors
|
147
148
|
end
|
148
149
|
|
149
150
|
def default_http_extractors
|
150
151
|
[
|
151
152
|
OpenTelemetry::Trace::Propagation::TraceContext.rack_extractor,
|
152
|
-
OpenTelemetry::
|
153
|
+
OpenTelemetry::Baggage::Propagation.rack_extractor
|
153
154
|
]
|
154
155
|
end
|
155
156
|
|
156
|
-
def
|
157
|
+
def default_text_map_injectors
|
157
158
|
[
|
158
|
-
OpenTelemetry::Trace::Propagation::TraceContext.
|
159
|
-
OpenTelemetry::
|
159
|
+
OpenTelemetry::Trace::Propagation::TraceContext.text_map_injector,
|
160
|
+
OpenTelemetry::Baggage::Propagation.text_map_injector
|
160
161
|
]
|
161
162
|
end
|
162
163
|
|
163
|
-
def
|
164
|
+
def default_text_map_extractors
|
164
165
|
[
|
165
|
-
OpenTelemetry::Trace::Propagation::TraceContext.
|
166
|
-
OpenTelemetry::
|
166
|
+
OpenTelemetry::Trace::Propagation::TraceContext.text_map_extractor,
|
167
|
+
OpenTelemetry::Baggage::Propagation.text_map_extractor
|
167
168
|
]
|
168
169
|
end
|
169
170
|
end
|
@@ -13,29 +13,40 @@ module OpenTelemetry
|
|
13
13
|
class << self
|
14
14
|
private :new # rubocop:disable Style/AccessModifierDeclarations
|
15
15
|
|
16
|
-
# Returns a newly created {Resource} with the specified
|
16
|
+
# Returns a newly created {Resource} with the specified attributes
|
17
17
|
#
|
18
|
-
# @param [Hash{String => String, Numeric, Boolean}
|
19
|
-
# as
|
20
|
-
# @raise [ArgumentError] If
|
18
|
+
# @param [Hash{String => String, Numeric, Boolean} attributes Hash of key-value pairs to be used
|
19
|
+
# as attributes for this resource
|
20
|
+
# @raise [ArgumentError] If attribute keys and values are not strings
|
21
21
|
# @return [Resource]
|
22
|
-
def create(
|
23
|
-
|
24
|
-
raise ArgumentError, '
|
25
|
-
raise ArgumentError, '
|
22
|
+
def create(attributes = {})
|
23
|
+
frozen_attributes = attributes.each_with_object({}) do |(k, v), memo|
|
24
|
+
raise ArgumentError, 'attribute keys must be strings' unless k.is_a?(String)
|
25
|
+
raise ArgumentError, 'attribute values must be strings, integers, floats, or booleans' unless Internal.valid_value?(v)
|
26
26
|
|
27
27
|
memo[-k] = v.freeze
|
28
28
|
end.freeze
|
29
29
|
|
30
|
-
new(
|
30
|
+
new(frozen_attributes)
|
31
31
|
end
|
32
32
|
|
33
33
|
def telemetry_sdk
|
34
|
-
|
34
|
+
resource_attributes = {
|
35
35
|
Constants::TELEMETRY_SDK_RESOURCE[:name] => 'opentelemetry',
|
36
36
|
Constants::TELEMETRY_SDK_RESOURCE[:language] => 'ruby',
|
37
|
-
Constants::TELEMETRY_SDK_RESOURCE[:version] =>
|
38
|
-
|
37
|
+
Constants::TELEMETRY_SDK_RESOURCE[:version] => OpenTelemetry::SDK::VERSION
|
38
|
+
}
|
39
|
+
|
40
|
+
resource_pairs = ENV['OTEL_RESOURCE_ATTRIBUTES']
|
41
|
+
return create(resource_attributes) unless resource_pairs.is_a?(String)
|
42
|
+
|
43
|
+
resource_pairs.split(',').each do |pair|
|
44
|
+
key, value = pair.split('=')
|
45
|
+
resource_attributes[key] = value
|
46
|
+
end
|
47
|
+
|
48
|
+
resource_attributes.delete_if { |_key, value| value.nil? || value.empty? }
|
49
|
+
create(resource_attributes)
|
39
50
|
end
|
40
51
|
end
|
41
52
|
|
@@ -44,18 +55,18 @@ module OpenTelemetry
|
|
44
55
|
# Users should use the {create} factory method to obtain a {Resource}
|
45
56
|
# instance.
|
46
57
|
#
|
47
|
-
# @param [Hash<String, String>]
|
48
|
-
# key-value pairs to be used as
|
58
|
+
# @param [Hash<String, String>] frozen_attributes Frozen-hash of frozen-string
|
59
|
+
# key-value pairs to be used as attributes for this resource
|
49
60
|
# @return [Resource]
|
50
|
-
def initialize(
|
51
|
-
@
|
61
|
+
def initialize(frozen_attributes)
|
62
|
+
@attributes = frozen_attributes
|
52
63
|
end
|
53
64
|
|
54
|
-
# Returns an enumerator for
|
65
|
+
# Returns an enumerator for attributes of this {Resource}
|
55
66
|
#
|
56
67
|
# @return [Enumerator]
|
57
|
-
def
|
58
|
-
@
|
68
|
+
def attribute_enumerator
|
69
|
+
@attribute_enumerator ||= attributes.to_enum
|
59
70
|
end
|
60
71
|
|
61
72
|
# Returns a new, merged {Resource} by merging the current {Resource} with
|
@@ -68,16 +79,16 @@ module OpenTelemetry
|
|
68
79
|
def merge(other)
|
69
80
|
return self unless other.is_a?(Resource)
|
70
81
|
|
71
|
-
|
82
|
+
merged_attributes = attributes.merge(other.attributes) do |_, old_v, new_v|
|
72
83
|
old_v.empty? ? new_v : old_v
|
73
84
|
end
|
74
85
|
|
75
|
-
self.class.send(:new,
|
86
|
+
self.class.send(:new, merged_attributes.freeze)
|
76
87
|
end
|
77
88
|
|
78
89
|
protected
|
79
90
|
|
80
|
-
attr_reader :
|
91
|
+
attr_reader :attributes
|
81
92
|
end
|
82
93
|
end
|
83
94
|
end
|
@@ -15,6 +15,7 @@ end
|
|
15
15
|
|
16
16
|
require 'opentelemetry/sdk/trace/samplers'
|
17
17
|
require 'opentelemetry/sdk/trace/config'
|
18
|
+
require 'opentelemetry/sdk/trace/event'
|
18
19
|
require 'opentelemetry/sdk/trace/export'
|
19
20
|
require 'opentelemetry/sdk/trace/multi_span_processor'
|
20
21
|
require 'opentelemetry/sdk/trace/noop_span_processor'
|
@@ -10,7 +10,7 @@ module OpenTelemetry
|
|
10
10
|
module Config
|
11
11
|
# Class that holds global trace parameters.
|
12
12
|
class TraceConfig
|
13
|
-
DEFAULT_SAMPLER = Samplers::ALWAYS_ON
|
13
|
+
DEFAULT_SAMPLER = Samplers.parent_based(root: Samplers::ALWAYS_ON)
|
14
14
|
DEFAULT_MAX_ATTRIBUTES_COUNT = 32
|
15
15
|
DEFAULT_MAX_EVENTS_COUNT = 128
|
16
16
|
DEFAULT_MAX_LINKS_COUNT = 32
|
@@ -30,13 +30,13 @@ module OpenTelemetry
|
|
30
30
|
# The global default max number of attributes per {Span}.
|
31
31
|
attr_reader :max_attributes_count
|
32
32
|
|
33
|
-
# The global default max number of {OpenTelemetry::Trace::Event}s per {Span}.
|
33
|
+
# The global default max number of {OpenTelemetry::SDK::Trace::Event}s per {Span}.
|
34
34
|
attr_reader :max_events_count
|
35
35
|
|
36
36
|
# The global default max number of {OpenTelemetry::Trace::Link} entries per {Span}.
|
37
37
|
attr_reader :max_links_count
|
38
38
|
|
39
|
-
# The global default max number of attributes per {OpenTelemetry::Trace::Event}.
|
39
|
+
# The global default max number of attributes per {OpenTelemetry::SDK::Trace::Event}.
|
40
40
|
attr_reader :max_attributes_per_event
|
41
41
|
|
42
42
|
# The global default max number of attributes per {OpenTelemetry::Trace::Link}.
|
@@ -0,0 +1,48 @@
|
|
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
|
+
# A text annotation with a set of attributes and a timestamp.
|
11
|
+
class Event
|
12
|
+
EMPTY_ATTRIBUTES = {}.freeze
|
13
|
+
|
14
|
+
private_constant :EMPTY_ATTRIBUTES
|
15
|
+
|
16
|
+
# Returns the name of this event
|
17
|
+
#
|
18
|
+
# @return [String]
|
19
|
+
attr_reader :name
|
20
|
+
|
21
|
+
# Returns the frozen attributes for this event
|
22
|
+
#
|
23
|
+
# @return [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
|
24
|
+
attr_reader :attributes
|
25
|
+
|
26
|
+
# Returns the timestamp for this event
|
27
|
+
#
|
28
|
+
# @return [Time]
|
29
|
+
attr_reader :timestamp
|
30
|
+
|
31
|
+
# Returns a new immutable {Event}.
|
32
|
+
#
|
33
|
+
# @param [String] name The name of this event
|
34
|
+
# @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
|
35
|
+
# attributes A hash of attributes for this event. Attributes will be
|
36
|
+
# frozen during Event initialization.
|
37
|
+
# @param [optional Time] timestamp The timestamp for this event.
|
38
|
+
# Defaults to Time.now.
|
39
|
+
# @return [Event]
|
40
|
+
def initialize(name:, attributes: nil, timestamp: nil)
|
41
|
+
@name = name
|
42
|
+
@attributes = attributes.freeze || EMPTY_ATTRIBUTES
|
43
|
+
@timestamp = timestamp || Time.now
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -23,17 +23,28 @@ module OpenTelemetry
|
|
23
23
|
# worker thread that exports the spans to wake up and start a new
|
24
24
|
# export cycle.
|
25
25
|
class BatchSpanProcessor
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
# Returns a new instance of the {BatchSpanProcessor}.
|
27
|
+
#
|
28
|
+
# @param [SpanExporter] exporter
|
29
|
+
# @param [Numeric] exporter_timeout_millis the delay interval between two
|
30
|
+
# consecutive exports. Defaults to the value of the OTEL_BSP_EXPORT_TIMEOUT_MILLIS
|
31
|
+
# environment variable, if set, or 30,000 (30 seconds).
|
32
|
+
# @param [Numeric] schedule_delay_millis the maximum allowed time to export data.
|
33
|
+
# Defaults to the value of the OTEL_BSP_SCHEDULE_DELAY_MILLIS environment
|
34
|
+
# variable, if set, or 5,000 (5 seconds).
|
35
|
+
# @param [Integer] max_queue_size the maximum queue size in spans.
|
36
|
+
# Defaults to the value of the OTEL_BSP_MAX_QUEUE_SIZE environment
|
37
|
+
# variable, if set, or 2048.
|
38
|
+
# @param [Integer] max_export_batch_size the maximum batch size in spans.
|
39
|
+
# Defaults to the value of the OTEL_BSP_MAX_EXPORT_BATCH_SIZE environment
|
40
|
+
# variable, if set, or 512.
|
41
|
+
#
|
42
|
+
# @return a new instance of the {BatchSpanProcessor}.
|
32
43
|
def initialize(exporter:,
|
33
|
-
exporter_timeout_millis:
|
34
|
-
schedule_delay_millis:
|
35
|
-
max_queue_size:
|
36
|
-
max_export_batch_size:
|
44
|
+
exporter_timeout_millis: Float(ENV.fetch('OTEL_BSP_EXPORT_TIMEOUT_MILLIS', 30_000)),
|
45
|
+
schedule_delay_millis: Float(ENV.fetch('OTEL_BSP_SCHEDULE_DELAY_MILLIS', 5_000)),
|
46
|
+
max_queue_size: Integer(ENV.fetch('OTEL_BSP_MAX_QUEUE_SIZE', 2048)),
|
47
|
+
max_export_batch_size: Integer(ENV.fetch('OTEL_BSP_MAX_EXPORT_BATCH_SIZE', 512)))
|
37
48
|
raise ArgumentError if max_export_batch_size > max_queue_size
|
38
49
|
|
39
50
|
@exporter = exporter
|
@@ -7,15 +7,15 @@
|
|
7
7
|
require 'opentelemetry/sdk/trace/samplers/decision'
|
8
8
|
require 'opentelemetry/sdk/trace/samplers/result'
|
9
9
|
require 'opentelemetry/sdk/trace/samplers/constant_sampler'
|
10
|
-
require 'opentelemetry/sdk/trace/samplers/
|
11
|
-
require 'opentelemetry/sdk/trace/samplers/
|
10
|
+
require 'opentelemetry/sdk/trace/samplers/parent_based'
|
11
|
+
require 'opentelemetry/sdk/trace/samplers/trace_id_ratio_based'
|
12
12
|
|
13
13
|
module OpenTelemetry
|
14
14
|
module SDK
|
15
15
|
module Trace
|
16
16
|
# The Samplers module contains the sampling logic for OpenTelemetry. The
|
17
|
-
# reference implementation provides a {
|
18
|
-
# {ALWAYS_OFF}, and {
|
17
|
+
# reference implementation provides a {TraceIdRatioBased}, {ALWAYS_ON},
|
18
|
+
# {ALWAYS_OFF}, and {ParentBased}.
|
19
19
|
#
|
20
20
|
# Custom samplers can be provided by SDK users. The required interface is:
|
21
21
|
#
|
@@ -41,9 +41,8 @@ module OpenTelemetry
|
|
41
41
|
NOT_RECORD = Result.new(decision: Decision::NOT_RECORD)
|
42
42
|
RECORD = Result.new(decision: Decision::RECORD)
|
43
43
|
SAMPLING_HINTS = [Decision::NOT_RECORD, Decision::RECORD, Decision::RECORD_AND_SAMPLED].freeze
|
44
|
-
APPLY_PROBABILITY_TO_SYMBOLS = %i[root_spans root_spans_and_remote_parent all_spans].freeze
|
45
44
|
|
46
|
-
private_constant(:RECORD_AND_SAMPLED, :NOT_RECORD, :RECORD, :SAMPLING_HINTS
|
45
|
+
private_constant(:RECORD_AND_SAMPLED, :NOT_RECORD, :RECORD, :SAMPLING_HINTS)
|
47
46
|
|
48
47
|
# Returns a {Result} with {Decision::RECORD_AND_SAMPLED}.
|
49
48
|
ALWAYS_ON = ConstantSampler.new(result: RECORD_AND_SAMPLED, description: 'AlwaysOnSampler')
|
@@ -51,38 +50,46 @@ module OpenTelemetry
|
|
51
50
|
# Returns a {Result} with {Decision::NOT_RECORD}.
|
52
51
|
ALWAYS_OFF = ConstantSampler.new(result: NOT_RECORD, description: 'AlwaysOffSampler')
|
53
52
|
|
54
|
-
# Returns a new sampler. It
|
55
|
-
# decision or delegates to delegate_sampler for root spans.
|
53
|
+
# Returns a new sampler. It delegates to samplers according to the following rules:
|
56
54
|
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
|
60
|
-
|
55
|
+
# | Parent | parent.remote? | parent.trace_flags.sampled? | Invoke sampler |
|
56
|
+
# |--|--|--|--|
|
57
|
+
# | absent | n/a | n/a | root |
|
58
|
+
# | present | true | true | remote_parent_sampled |
|
59
|
+
# | present | true | false | remote_parent_not_sampled |
|
60
|
+
# | present | false | true | local_parent_sampled |
|
61
|
+
# | present | false | false | local_parent_not_sampled |
|
62
|
+
#
|
63
|
+
# @param [Sampler] root The sampler to which the sampling
|
64
|
+
# decision is delegated for spans with no parent (root spans).
|
65
|
+
# @param [optional Sampler] remote_parent_sampled The sampler to which the sampling
|
66
|
+
# decision is delegated for remote parent sampled spans. Defaults to ALWAYS_ON.
|
67
|
+
# @param [optional Sampler] remote_parent_not_sampled The sampler to which the sampling
|
68
|
+
# decision is delegated for remote parent not sampled spans. Defaults to ALWAYS_OFF.
|
69
|
+
# @param [optional Sampler] local_parent_sampled The sampler to which the sampling
|
70
|
+
# decision is delegated for local parent sampled spans. Defaults to ALWAYS_ON.
|
71
|
+
# @param [optional Sampler] local_parent_not_sampled The sampler to which the sampling
|
72
|
+
# decision is delegated for local parent not sampld spans. Defaults to ALWAYS_OFF.
|
73
|
+
def self.parent_based(
|
74
|
+
root:,
|
75
|
+
remote_parent_sampled: ALWAYS_ON,
|
76
|
+
remote_parent_not_sampled: ALWAYS_OFF,
|
77
|
+
local_parent_sampled: ALWAYS_ON,
|
78
|
+
local_parent_not_sampled: ALWAYS_OFF
|
79
|
+
)
|
80
|
+
ParentBased.new(root, remote_parent_sampled, remote_parent_not_sampled, local_parent_sampled, local_parent_not_sampled)
|
61
81
|
end
|
62
82
|
|
63
|
-
# Returns a new sampler. The
|
64
|
-
#
|
83
|
+
# Returns a new sampler. The ratio describes the proportion of the trace ID
|
84
|
+
# space that is sampled.
|
65
85
|
#
|
66
|
-
# @param [Numeric]
|
86
|
+
# @param [Numeric] ratio The desired sampling ratio.
|
67
87
|
# Must be within [0.0, 1.0].
|
68
|
-
# @
|
69
|
-
|
70
|
-
|
71
|
-
# probability sampling to root spans, root spans and remote parents,
|
72
|
-
# or all spans. Allowed values include :root_spans, :root_spans_and_remote_parent,
|
73
|
-
# and :all_spans. Defaults to :root_spans_and_remote_parent.
|
74
|
-
# @raise [ArgumentError] if probability is out of range
|
75
|
-
# @raise [ArgumentError] if apply_probability_to is not one of the allowed symbols
|
76
|
-
def self.probability(probability,
|
77
|
-
ignore_parent: false,
|
78
|
-
apply_probability_to: :root_spans_and_remote_parent)
|
79
|
-
raise ArgumentError, 'probability must be in range [0.0, 1.0]' unless (0.0..1.0).include?(probability)
|
80
|
-
raise ArgumentError, 'apply_probability_to' unless APPLY_PROBABILITY_TO_SYMBOLS.include?(apply_probability_to)
|
88
|
+
# @raise [ArgumentError] if ratio is out of range
|
89
|
+
def self.trace_id_ratio_based(ratio)
|
90
|
+
raise ArgumentError, 'ratio must be in range [0.0, 1.0]' unless (0.0..1.0).include?(ratio)
|
81
91
|
|
82
|
-
|
83
|
-
ignore_parent: ignore_parent,
|
84
|
-
apply_to_remote_parent: apply_probability_to != :root_spans,
|
85
|
-
apply_to_all_spans: apply_probability_to == :all_spans)
|
92
|
+
TraceIdRatioBased.new(ratio)
|
86
93
|
end
|
87
94
|
end
|
88
95
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright The 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
|
+
# This is a composite sampler. ParentBased helps distinguished between the
|
14
|
+
# following cases:
|
15
|
+
# * No parent (root span).
|
16
|
+
# * Remote parent (SpanContext.remote? with trace_flags.sampled?)
|
17
|
+
# * Remote parent (SpanContext.remote? with !trace_flags.sampled?)
|
18
|
+
# * Local parent (!SpanContext.remote? with trace_flags.sampled?)
|
19
|
+
# * Local parent (!SpanContext.remote? with !trace_flags.sampled?)
|
20
|
+
class ParentBased
|
21
|
+
def initialize(root, remote_parent_sampled, remote_parent_not_sampled, local_parent_sampled, local_parent_not_sampled)
|
22
|
+
@root = root
|
23
|
+
@remote_parent_sampled = remote_parent_sampled
|
24
|
+
@remote_parent_not_sampled = remote_parent_not_sampled
|
25
|
+
@local_parent_sampled = local_parent_sampled
|
26
|
+
@local_parent_not_sampled = local_parent_not_sampled
|
27
|
+
end
|
28
|
+
|
29
|
+
# @api private
|
30
|
+
#
|
31
|
+
# See {Samplers}.
|
32
|
+
def description
|
33
|
+
"ParentBased{root=#{@root.description}, remote_parent_sampled=#{@remote_parent_sampled.description}, remote_parent_not_sampled=#{@remote_parent_not_sampled.description}, local_parent_sampled=#{@local_parent_sampled.description}, local_parent_not_sampled=#{@local_parent_not_sampled.description}}"
|
34
|
+
end
|
35
|
+
|
36
|
+
# @api private
|
37
|
+
#
|
38
|
+
# See {Samplers}.
|
39
|
+
def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:)
|
40
|
+
delegate = if parent_context.nil?
|
41
|
+
@root
|
42
|
+
elsif parent_context.remote?
|
43
|
+
parent_context.trace_flags.sampled? ? @remote_parent_sampled : @remote_parent_not_sampled
|
44
|
+
else
|
45
|
+
parent_context.trace_flags.sampled? ? @local_parent_sampled : @local_parent_not_sampled
|
46
|
+
end
|
47
|
+
delegate.should_sample?(trace_id: trace_id, parent_context: parent_context, links: links, name: name, kind: kind, attributes: attributes)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,45 @@
|
|
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 TraceIdRatioBased
|
15
|
+
attr_reader :description
|
16
|
+
|
17
|
+
def initialize(probability)
|
18
|
+
@probability = probability
|
19
|
+
@id_upper_bound = (probability * (2**64 - 1)).ceil
|
20
|
+
@description = format('TraceIdRatioBased{%.6f}', probability)
|
21
|
+
end
|
22
|
+
|
23
|
+
# @api private
|
24
|
+
#
|
25
|
+
# See {Samplers}.
|
26
|
+
def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:)
|
27
|
+
# Ignored for sampling decision: parent_context:, links, name, kind, attributes.
|
28
|
+
|
29
|
+
if sample?(trace_id)
|
30
|
+
RECORD_AND_SAMPLED
|
31
|
+
else
|
32
|
+
NOT_RECORD
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def sample?(trace_id)
|
39
|
+
@probability == 1.0 || trace_id[8, 8].unpack1('Q>') < @id_upper_bound
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -18,10 +18,10 @@ 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
27
|
# @return [Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] may be nil.
|
@@ -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,29 @@ 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
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
|
-
# required if a block is not given.
|
92
|
+
# @param [String] name Name of the event.
|
99
93
|
# @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] attributes
|
100
94
|
# One or more key:value pairs, where the keys must be strings and the
|
101
|
-
# values may be string, boolean or numeric type.
|
102
|
-
# only be used when passing in a name.
|
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)
|
110
102
|
|
111
103
|
@mutex.synchronize do
|
112
104
|
if @ended
|
@@ -120,18 +112,18 @@ module OpenTelemetry
|
|
120
112
|
self
|
121
113
|
end
|
122
114
|
|
123
|
-
# Record an
|
115
|
+
# Record an exception during the execution of this span. Multiple exceptions
|
124
116
|
# can be recorded on a span.
|
125
117
|
#
|
126
|
-
# @param [Exception]
|
118
|
+
# @param [Exception] exception The exception to be recorded
|
127
119
|
#
|
128
120
|
# @return [void]
|
129
|
-
def
|
130
|
-
add_event(
|
121
|
+
def record_exception(exception)
|
122
|
+
add_event('exception',
|
131
123
|
attributes: {
|
132
|
-
'
|
133
|
-
'
|
134
|
-
'
|
124
|
+
'exception.type' => exception.class.to_s,
|
125
|
+
'exception.message' => exception.message,
|
126
|
+
'exception.stacktrace' => exception.full_message(highlight: false, order: :top)
|
135
127
|
})
|
136
128
|
end
|
137
129
|
|
@@ -236,7 +228,7 @@ module OpenTelemetry
|
|
236
228
|
@attributes,
|
237
229
|
@links,
|
238
230
|
@events,
|
239
|
-
@
|
231
|
+
@resource,
|
240
232
|
@instrumentation_library,
|
241
233
|
context.span_id,
|
242
234
|
context.trace_id,
|
@@ -246,7 +238,7 @@ module OpenTelemetry
|
|
246
238
|
end
|
247
239
|
|
248
240
|
# @api private
|
249
|
-
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
|
250
242
|
super(span_context: context)
|
251
243
|
@mutex = Mutex.new
|
252
244
|
@name = name
|
@@ -254,7 +246,7 @@ module OpenTelemetry
|
|
254
246
|
@parent_span_id = parent_span_id.freeze || OpenTelemetry::Trace::INVALID_SPAN_ID
|
255
247
|
@trace_config = trace_config
|
256
248
|
@span_processor = span_processor
|
257
|
-
@
|
249
|
+
@resource = resource
|
258
250
|
@instrumentation_library = instrumentation_library
|
259
251
|
@ended = false
|
260
252
|
@status = nil
|
@@ -325,7 +317,7 @@ module OpenTelemetry
|
|
325
317
|
attrs.keep_if { |key, value| Internal.valid_key?(key) && Internal.valid_value?(value) }
|
326
318
|
excess = attrs.size - max_attributes_per_event
|
327
319
|
excess.times { attrs.shift } if excess.positive?
|
328
|
-
event =
|
320
|
+
event = Event.new(name: event.name, attributes: attrs, timestamp: event.timestamp)
|
329
321
|
end
|
330
322
|
events << event
|
331
323
|
end
|
@@ -23,12 +23,26 @@ module OpenTelemetry
|
|
23
23
|
:attributes,
|
24
24
|
:links,
|
25
25
|
:events,
|
26
|
-
:
|
26
|
+
:resource,
|
27
27
|
:instrumentation_library,
|
28
28
|
:span_id,
|
29
29
|
:trace_id,
|
30
30
|
:trace_flags,
|
31
|
-
:tracestate)
|
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
|
32
46
|
end
|
33
47
|
end
|
34
48
|
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: 2020-
|
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.
|
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.
|
26
|
+
version: 0.6.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -149,10 +149,10 @@ files:
|
|
149
149
|
- README.md
|
150
150
|
- lib/opentelemetry-sdk.rb
|
151
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
|
152
155
|
- lib/opentelemetry/sdk/configurator.rb
|
153
|
-
- lib/opentelemetry/sdk/correlation_context.rb
|
154
|
-
- lib/opentelemetry/sdk/correlation_context/builder.rb
|
155
|
-
- lib/opentelemetry/sdk/correlation_context/manager.rb
|
156
156
|
- lib/opentelemetry/sdk/instrumentation_library.rb
|
157
157
|
- lib/opentelemetry/sdk/internal.rb
|
158
158
|
- lib/opentelemetry/sdk/resources.rb
|
@@ -161,6 +161,7 @@ files:
|
|
161
161
|
- lib/opentelemetry/sdk/trace.rb
|
162
162
|
- lib/opentelemetry/sdk/trace/config.rb
|
163
163
|
- lib/opentelemetry/sdk/trace/config/trace_config.rb
|
164
|
+
- lib/opentelemetry/sdk/trace/event.rb
|
164
165
|
- lib/opentelemetry/sdk/trace/export.rb
|
165
166
|
- lib/opentelemetry/sdk/trace/export/batch_span_processor.rb
|
166
167
|
- lib/opentelemetry/sdk/trace/export/console_span_exporter.rb
|
@@ -173,9 +174,9 @@ files:
|
|
173
174
|
- lib/opentelemetry/sdk/trace/samplers.rb
|
174
175
|
- lib/opentelemetry/sdk/trace/samplers/constant_sampler.rb
|
175
176
|
- lib/opentelemetry/sdk/trace/samplers/decision.rb
|
176
|
-
- lib/opentelemetry/sdk/trace/samplers/
|
177
|
-
- lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb
|
177
|
+
- lib/opentelemetry/sdk/trace/samplers/parent_based.rb
|
178
178
|
- lib/opentelemetry/sdk/trace/samplers/result.rb
|
179
|
+
- lib/opentelemetry/sdk/trace/samplers/trace_id_ratio_based.rb
|
179
180
|
- lib/opentelemetry/sdk/trace/span.rb
|
180
181
|
- lib/opentelemetry/sdk/trace/span_data.rb
|
181
182
|
- lib/opentelemetry/sdk/trace/tracer.rb
|
@@ -200,7 +201,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
201
|
- !ruby/object:Gem::Version
|
201
202
|
version: '0'
|
202
203
|
requirements: []
|
203
|
-
rubygems_version: 3.
|
204
|
+
rubygems_version: 3.1.2
|
204
205
|
signing_key:
|
205
206
|
specification_version: 4
|
206
207
|
summary: A stats collection and distributed tracing framework
|
@@ -1,16 +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/sdk/correlation_context/builder'
|
8
|
-
require 'opentelemetry/sdk/correlation_context/manager'
|
9
|
-
|
10
|
-
module OpenTelemetry
|
11
|
-
module SDK
|
12
|
-
# Contains operational implementations of the CorrelationContext::Manager
|
13
|
-
module CorrelationContext
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Copyright The 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
|
-
# This is a composite sampler. It either respects the parent span's sampling
|
14
|
-
# decision or delegates to delegate_sampler for root spans.
|
15
|
-
class ParentOrElse
|
16
|
-
def initialize(delegate_sampler)
|
17
|
-
@delegate_sampler = delegate_sampler
|
18
|
-
end
|
19
|
-
|
20
|
-
# @api private
|
21
|
-
#
|
22
|
-
# See {Samplers}.
|
23
|
-
def description
|
24
|
-
"ParentOrElse{#{@delegate_sampler.description}}"
|
25
|
-
end
|
26
|
-
|
27
|
-
# @api private
|
28
|
-
#
|
29
|
-
# See {Samplers}.
|
30
|
-
def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:)
|
31
|
-
if parent_context.nil?
|
32
|
-
@delegate_sampler.should_sample?(trace_id: trace_id, parent_context: parent_context, links: links, name: name, kind: kind, attributes: attributes)
|
33
|
-
elsif parent_context.trace_flags.sampled?
|
34
|
-
RECORD_AND_SAMPLED
|
35
|
-
else
|
36
|
-
NOT_RECORD
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,64 +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
|
-
attr_reader :description
|
16
|
-
|
17
|
-
def initialize(probability, ignore_parent:, apply_to_remote_parent:, apply_to_all_spans:)
|
18
|
-
@probability = probability
|
19
|
-
@id_upper_bound = (probability * (2**64 - 1)).ceil
|
20
|
-
@use_parent_sampled_flag = !ignore_parent
|
21
|
-
@apply_to_remote_parent = apply_to_remote_parent
|
22
|
-
@apply_to_all_spans = apply_to_all_spans
|
23
|
-
@description = format('ProbabilitySampler{%.6f}', probability)
|
24
|
-
end
|
25
|
-
|
26
|
-
# @api private
|
27
|
-
#
|
28
|
-
# See {Samplers}.
|
29
|
-
def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:)
|
30
|
-
# Ignored for sampling decision: links, name, kind, attributes.
|
31
|
-
|
32
|
-
if sample?(trace_id, parent_context)
|
33
|
-
RECORD_AND_SAMPLED
|
34
|
-
else
|
35
|
-
NOT_RECORD
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def sample?(trace_id, parent_context)
|
42
|
-
if parent_context.nil?
|
43
|
-
sample_trace_id?(trace_id)
|
44
|
-
else
|
45
|
-
parent_sampled?(parent_context) || sample_trace_id_for_child?(parent_context, trace_id)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def parent_sampled?(parent_context)
|
50
|
-
@use_parent_sampled_flag && parent_context.trace_flags.sampled?
|
51
|
-
end
|
52
|
-
|
53
|
-
def sample_trace_id_for_child?(parent_context, trace_id)
|
54
|
-
(@apply_to_all_spans || (@apply_to_remote_parent && parent_context.remote?)) && sample_trace_id?(trace_id)
|
55
|
-
end
|
56
|
-
|
57
|
-
def sample_trace_id?(trace_id)
|
58
|
-
@probability == 1.0 || trace_id[8, 8].unpack1('Q>') < @id_upper_bound
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|