opentelemetry-sdk 0.4.0 → 0.5.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/lib/opentelemetry/sdk.rb +3 -2
- data/lib/opentelemetry/sdk/configurator.rb +34 -21
- data/lib/opentelemetry/sdk/correlation_context.rb +1 -1
- data/lib/opentelemetry/sdk/instrumentation_library.rb +13 -0
- data/lib/opentelemetry/sdk/resources.rb +1 -0
- data/lib/opentelemetry/sdk/resources/constants.rb +124 -0
- data/lib/opentelemetry/sdk/resources/resource.rb +8 -0
- data/lib/opentelemetry/sdk/trace/export.rb +2 -7
- data/lib/opentelemetry/sdk/trace/export/batch_span_processor.rb +4 -17
- data/lib/opentelemetry/sdk/trace/export/console_span_exporter.rb +1 -1
- data/lib/opentelemetry/sdk/trace/export/in_memory_span_exporter.rb +2 -2
- data/lib/opentelemetry/sdk/trace/export/multi_span_exporter.rb +3 -7
- data/lib/opentelemetry/sdk/trace/export/noop_span_exporter.rb +1 -1
- data/lib/opentelemetry/sdk/trace/samplers.rb +15 -21
- data/lib/opentelemetry/sdk/trace/samplers/constant_sampler.rb +33 -0
- data/lib/opentelemetry/sdk/trace/samplers/parent_or_else.rb +43 -0
- data/lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb +5 -2
- data/lib/opentelemetry/sdk/trace/span.rb +6 -3
- data/lib/opentelemetry/sdk/trace/span_data.rb +3 -1
- data/lib/opentelemetry/sdk/trace/tracer.rb +22 -10
- data/lib/opentelemetry/sdk/trace/tracer_provider.rb +4 -4
- data/lib/opentelemetry/sdk/version.rb +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1929c4e29a936b51b4f2eca8ec7b4e2f7a597e43e72039e6e963aa72cd00f65f
|
4
|
+
data.tar.gz: cbf9a0ade97c3dab0a8005cf84729ab8d549c6f0768ea9446d8a71585d676d4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de2f88ace625de9e494a6800291462330c58d12e0ecac2e8a7a184a8c34382557639aea59eea3dbf16a603355c604446e00cd2b9fe8f2ad3cb009f21c68186cb
|
7
|
+
data.tar.gz: 42342b8cee795fd241a650b2abae0b8f3f4f73a202605bdcce6ec861de5fe53325fc3e273fe8c06e386df4b42a76ab3d0667990a502f31a0636de733f62b2aef
|
data/lib/opentelemetry/sdk.rb
CHANGED
@@ -30,13 +30,13 @@ module OpenTelemetry
|
|
30
30
|
# Install instrumentation individually with optional config
|
31
31
|
#
|
32
32
|
# OpenTelemetry::SDK.configure do |c|
|
33
|
-
# c.use 'OpenTelemetry::
|
33
|
+
# c.use 'OpenTelemetry::Instrumentation::Faraday', tracer_middleware: SomeMiddleware
|
34
34
|
# end
|
35
35
|
#
|
36
36
|
# Install all instrumentation with optional config
|
37
37
|
#
|
38
38
|
# OpenTelemetry::SDK.configure do |c|
|
39
|
-
# c.use_all 'OpenTelemetry::
|
39
|
+
# c.use_all 'OpenTelemetry::Instrumentation::Faraday' => { tracer_middleware: SomeMiddleware }
|
40
40
|
# end
|
41
41
|
#
|
42
42
|
# Add a span processor
|
@@ -63,6 +63,7 @@ end
|
|
63
63
|
require 'opentelemetry/sdk/configurator'
|
64
64
|
require 'opentelemetry/sdk/correlation_context'
|
65
65
|
require 'opentelemetry/sdk/internal'
|
66
|
+
require 'opentelemetry/sdk/instrumentation_library'
|
66
67
|
require 'opentelemetry/sdk/resources'
|
67
68
|
require 'opentelemetry/sdk/trace'
|
68
69
|
require 'opentelemetry/sdk/version'
|
@@ -8,7 +8,7 @@ module OpenTelemetry
|
|
8
8
|
module SDK
|
9
9
|
# The configurator provides defaults and facilitates configuring the
|
10
10
|
# SDK for use.
|
11
|
-
class Configurator
|
11
|
+
class Configurator # rubocop:disable Metrics/ClassLength
|
12
12
|
USE_MODE_UNSPECIFIED = 0
|
13
13
|
USE_MODE_ONE = 1
|
14
14
|
USE_MODE_ALL = 2
|
@@ -19,46 +19,55 @@ module OpenTelemetry
|
|
19
19
|
:text_injectors
|
20
20
|
|
21
21
|
def initialize
|
22
|
-
@
|
23
|
-
@
|
22
|
+
@instrumentation_names = []
|
23
|
+
@instrumentation_config_map = {}
|
24
24
|
@http_extractors = nil
|
25
25
|
@http_injectors = nil
|
26
26
|
@text_extractors = nil
|
27
27
|
@text_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
34
|
@logger ||= Logger.new(STDOUT)
|
35
35
|
end
|
36
36
|
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
37
|
+
# Accepts a resource object that is merged with the default telemetry sdk
|
38
|
+
# resource. The use of this method is optional, and is provided as means
|
39
|
+
# to add additional resource information.
|
40
|
+
#
|
41
|
+
# @param [Resource] new_resource The resource to be merged
|
42
|
+
def resource=(new_resource)
|
43
|
+
@resource = @resource.merge(new_resource)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Install an instrumentation with specificied optional +config+.
|
47
|
+
# Use can be called multiple times to install multiple instrumentation.
|
48
|
+
# Only +use+ or +use_all+, but not both when installing
|
40
49
|
# instrumentation. A call to +use_all+ after +use+ will result in an
|
41
50
|
# exception.
|
42
51
|
#
|
43
|
-
# @param [String]
|
44
|
-
# @param [optional Hash] config The config for this
|
45
|
-
def use(
|
52
|
+
# @param [String] instrumentation_name The name of the instrumentation
|
53
|
+
# @param [optional Hash] config The config for this instrumentation
|
54
|
+
def use(instrumentation_name, config = nil)
|
46
55
|
check_use_mode!(USE_MODE_ONE)
|
47
|
-
@
|
48
|
-
@
|
56
|
+
@instrumentation_names << instrumentation_name
|
57
|
+
@instrumentation_config_map[instrumentation_name] = config if config
|
49
58
|
end
|
50
59
|
|
51
60
|
# Install all registered instrumentation. Configuration for specific
|
52
|
-
#
|
61
|
+
# instrumentation can be provided with the optional +instrumentation_config_map+
|
53
62
|
# parameter. Only +use+ or +use_all+, but not both when installing
|
54
63
|
# instrumentation. A call to +use+ after +use_all+ will result in an
|
55
64
|
# exception.
|
56
65
|
#
|
57
|
-
# @param [optional Hash<String,Hash>]
|
58
|
-
# representing the
|
59
|
-
def use_all(
|
66
|
+
# @param [optional Hash<String,Hash>] instrumentation_config_map A map with string keys
|
67
|
+
# representing the instrumentation name and values specifying the instrumentation config
|
68
|
+
def use_all(instrumentation_config_map = {})
|
60
69
|
check_use_mode!(USE_MODE_ALL)
|
61
|
-
@
|
70
|
+
@instrumentation_config_map = instrumentation_config_map
|
62
71
|
end
|
63
72
|
|
64
73
|
# Add a span processor to the export pipeline
|
@@ -83,12 +92,16 @@ module OpenTelemetry
|
|
83
92
|
OpenTelemetry.correlations = CorrelationContext::Manager.new
|
84
93
|
configure_propagation
|
85
94
|
configure_span_processors
|
86
|
-
OpenTelemetry.tracer_provider =
|
95
|
+
OpenTelemetry.tracer_provider = tracer_provider
|
87
96
|
install_instrumentation
|
88
97
|
end
|
89
98
|
|
90
99
|
private
|
91
100
|
|
101
|
+
def tracer_provider
|
102
|
+
@tracer_provider ||= Trace::TracerProvider.new(@resource)
|
103
|
+
end
|
104
|
+
|
92
105
|
def check_use_mode!(mode)
|
93
106
|
@use_mode = mode if @use_mode == USE_MODE_UNSPECIFIED
|
94
107
|
raise 'Use either `use_all` or `use`, but not both' unless @use_mode == mode
|
@@ -97,15 +110,15 @@ module OpenTelemetry
|
|
97
110
|
def install_instrumentation
|
98
111
|
case @use_mode
|
99
112
|
when USE_MODE_ONE
|
100
|
-
OpenTelemetry.instrumentation_registry.install(@
|
113
|
+
OpenTelemetry.instrumentation_registry.install(@instrumentation_names, @instrumentation_config_map)
|
101
114
|
when USE_MODE_ALL
|
102
|
-
OpenTelemetry.instrumentation_registry.install_all(@
|
115
|
+
OpenTelemetry.instrumentation_registry.install_all(@instrumentation_config_map)
|
103
116
|
end
|
104
117
|
end
|
105
118
|
|
106
119
|
def configure_span_processors
|
107
120
|
processors = @span_processors.empty? ? [default_span_processor] : @span_processors
|
108
|
-
processors.each { |p|
|
121
|
+
processors.each { |p| tracer_provider.add_span_processor(p) }
|
109
122
|
end
|
110
123
|
|
111
124
|
def default_span_processor
|
@@ -9,7 +9,7 @@ require 'opentelemetry/sdk/correlation_context/manager'
|
|
9
9
|
|
10
10
|
module OpenTelemetry
|
11
11
|
module SDK
|
12
|
-
# Contains operational
|
12
|
+
# Contains operational implementations of the CorrelationContext::Manager
|
13
13
|
module CorrelationContext
|
14
14
|
end
|
15
15
|
end
|
@@ -0,0 +1,13 @@
|
|
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
|
+
# InstrumentationLibrary is a struct containing library information for export.
|
10
|
+
InstrumentationLibrary = Struct.new(:name,
|
11
|
+
:version)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Copyright 2020 OpenTelemetry Authors
|
4
|
+
#
|
5
|
+
# SPDX-License-Identifier: Apache-2.0
|
6
|
+
|
7
|
+
module OpenTelemetry
|
8
|
+
module SDK
|
9
|
+
module Resources
|
10
|
+
module Constants
|
11
|
+
# Attributes describing a service instance.
|
12
|
+
SERVICE_RESOURCE = {
|
13
|
+
# Logical name of the service.
|
14
|
+
name: 'service.name',
|
15
|
+
|
16
|
+
# A namespace for `service.name`.
|
17
|
+
namespace: 'service.namespace',
|
18
|
+
|
19
|
+
# The string ID of the service instance.
|
20
|
+
instance_id: 'service.instance.id',
|
21
|
+
|
22
|
+
# The version string of the service API or implementation.
|
23
|
+
version: 'service.version'
|
24
|
+
}.freeze
|
25
|
+
|
26
|
+
# Attributes describing the telemetry library.
|
27
|
+
TELEMETRY_SDK_RESOURCE = {
|
28
|
+
# The name of the telemetry library.
|
29
|
+
name: 'telemetry.sdk.name',
|
30
|
+
|
31
|
+
# The language of the telemetry library and of the code instrumented with it.
|
32
|
+
language: 'telemetry.sdk.language',
|
33
|
+
|
34
|
+
# The version string of the telemetry library
|
35
|
+
version: 'telemetry.sdk.version'
|
36
|
+
}.freeze
|
37
|
+
|
38
|
+
# Attributes defining a compute unit (e.g. Container, Process, Lambda
|
39
|
+
# Function).
|
40
|
+
CONTAINER_RESOURCE = {
|
41
|
+
# The container name.
|
42
|
+
name: 'container.name',
|
43
|
+
|
44
|
+
# The name of the image the container was built on.
|
45
|
+
image_name: 'container.image.name',
|
46
|
+
|
47
|
+
# The container image tag.
|
48
|
+
image_tag: 'container.image.tag'
|
49
|
+
}.freeze
|
50
|
+
|
51
|
+
FAAS_RESOURCE = {
|
52
|
+
# The name of the function being executed.
|
53
|
+
name: 'faas.name',
|
54
|
+
|
55
|
+
# The unique name of the function being executed.
|
56
|
+
id: 'faas.id',
|
57
|
+
|
58
|
+
# The version string of the function being executed.
|
59
|
+
version: 'faas.version',
|
60
|
+
|
61
|
+
# The execution environment ID as a string.
|
62
|
+
instance: 'faas.instance'
|
63
|
+
}.freeze
|
64
|
+
|
65
|
+
# Attributes defining a deployment service (e.g. Kubernetes).
|
66
|
+
K8S_RESOURCE = {
|
67
|
+
# The name of the cluster that the pod is running in.
|
68
|
+
cluster_name: 'k8s.cluster.name',
|
69
|
+
|
70
|
+
# The name of the namespace that the pod is running in.
|
71
|
+
namespace_name: 'k8s.namespace.name',
|
72
|
+
|
73
|
+
# The name of the pod.
|
74
|
+
pod_name: 'k8s.pod.name',
|
75
|
+
|
76
|
+
# The name of the deployment.
|
77
|
+
deployment_name: 'k8s.deployment.name'
|
78
|
+
}.freeze
|
79
|
+
|
80
|
+
# Attributes defining a computing instance (e.g. host).
|
81
|
+
HOST_RESOURCE = {
|
82
|
+
# Hostname of the host. It contains what the hostname command returns on the
|
83
|
+
# host machine.
|
84
|
+
hostname: 'host.hostname',
|
85
|
+
|
86
|
+
# Unique host id. For Cloud this must be the instance_id assigned by the
|
87
|
+
# cloud provider
|
88
|
+
id: 'host.id',
|
89
|
+
|
90
|
+
# Name of the host. It may contain what hostname returns on Unix systems,
|
91
|
+
# the fully qualified, or a name specified by the user.
|
92
|
+
name: 'host.name',
|
93
|
+
|
94
|
+
# Type of host. For Cloud this must be the machine type.
|
95
|
+
type: 'host.type',
|
96
|
+
|
97
|
+
# Name of the VM image or OS install the host was instantiated from.
|
98
|
+
image_name: 'host.image.name',
|
99
|
+
|
100
|
+
# VM image id. For Cloud, this value is from the provider.
|
101
|
+
image_id: 'host.image.id',
|
102
|
+
|
103
|
+
# The version string of the VM image.
|
104
|
+
image_version: 'host.image.version'
|
105
|
+
}.freeze
|
106
|
+
|
107
|
+
# Attributes defining a running environment (e.g. Cloud, Data Center).
|
108
|
+
CLOUD_RESOURCE = {
|
109
|
+
# Name of the cloud provider. Example values are aws, azure, gcp.
|
110
|
+
provider: 'cloud.provider',
|
111
|
+
|
112
|
+
# The cloud account id used to identify different entities.
|
113
|
+
account_id: 'cloud.account.id',
|
114
|
+
|
115
|
+
# A specific geographical location where different entities can run.
|
116
|
+
region: 'cloud.region',
|
117
|
+
|
118
|
+
# Zones are a sub set of the region connected through low-latency links.
|
119
|
+
zone: 'cloud.zone'
|
120
|
+
}.freeze
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -29,6 +29,14 @@ module OpenTelemetry
|
|
29
29
|
|
30
30
|
new(frozen_labels)
|
31
31
|
end
|
32
|
+
|
33
|
+
def telemetry_sdk
|
34
|
+
create(
|
35
|
+
Constants::TELEMETRY_SDK_RESOURCE[:name] => 'opentelemetry',
|
36
|
+
Constants::TELEMETRY_SDK_RESOURCE[:language] => 'ruby',
|
37
|
+
Constants::TELEMETRY_SDK_RESOURCE[:version] => "semver:#{OpenTelemetry::SDK::VERSION}"
|
38
|
+
)
|
39
|
+
end
|
32
40
|
end
|
33
41
|
|
34
42
|
# @api private
|
@@ -15,13 +15,8 @@ module OpenTelemetry
|
|
15
15
|
# The export operation finished successfully.
|
16
16
|
SUCCESS = 0
|
17
17
|
|
18
|
-
# The export operation finished with an error
|
19
|
-
|
20
|
-
FAILED_RETRYABLE = 1
|
21
|
-
|
22
|
-
# The export operation finished with an error, the caller should not
|
23
|
-
# try to export the same data again.
|
24
|
-
FAILED_NOT_RETRYABLE = 2
|
18
|
+
# The export operation finished with an error.
|
19
|
+
FAILURE = 1
|
25
20
|
end
|
26
21
|
end
|
27
22
|
end
|
@@ -22,24 +22,18 @@ module OpenTelemetry
|
|
22
22
|
# If the queue gets half full a preemptive notification is sent to the
|
23
23
|
# worker thread that exports the spans to wake up and start a new
|
24
24
|
# export cycle.
|
25
|
-
#
|
26
|
-
# max_export_attempts attempts are made to export each batch, while
|
27
|
-
# export fails with {FAILED_RETRYABLE}, backing off linearly in 100ms
|
28
|
-
# increments.
|
29
25
|
class BatchSpanProcessor
|
30
26
|
EXPORTER_TIMEOUT_MILLIS = 30_000
|
31
27
|
SCHEDULE_DELAY_MILLIS = 5_000
|
32
28
|
MAX_QUEUE_SIZE = 2048
|
33
29
|
MAX_EXPORT_BATCH_SIZE = 512
|
34
|
-
|
35
|
-
private_constant(:SCHEDULE_DELAY_MILLIS, :MAX_QUEUE_SIZE, :MAX_EXPORT_BATCH_SIZE, :MAX_EXPORT_ATTEMPTS)
|
30
|
+
private_constant(:SCHEDULE_DELAY_MILLIS, :MAX_QUEUE_SIZE, :MAX_EXPORT_BATCH_SIZE)
|
36
31
|
|
37
32
|
def initialize(exporter:,
|
38
33
|
exporter_timeout_millis: EXPORTER_TIMEOUT_MILLIS,
|
39
34
|
schedule_delay_millis: SCHEDULE_DELAY_MILLIS,
|
40
35
|
max_queue_size: MAX_QUEUE_SIZE,
|
41
|
-
max_export_batch_size: MAX_EXPORT_BATCH_SIZE
|
42
|
-
max_export_attempts: MAX_EXPORT_ATTEMPTS)
|
36
|
+
max_export_batch_size: MAX_EXPORT_BATCH_SIZE)
|
43
37
|
raise ArgumentError if max_export_batch_size > max_queue_size
|
44
38
|
|
45
39
|
@exporter = exporter
|
@@ -50,7 +44,6 @@ module OpenTelemetry
|
|
50
44
|
@delay_seconds = schedule_delay_millis / 1000.0
|
51
45
|
@max_queue_size = max_queue_size
|
52
46
|
@batch_size = max_export_batch_size
|
53
|
-
@export_attempts = max_export_attempts
|
54
47
|
@spans = []
|
55
48
|
@thread = Thread.new { work }
|
56
49
|
end
|
@@ -121,20 +114,14 @@ module OpenTelemetry
|
|
121
114
|
end
|
122
115
|
|
123
116
|
def export_batch(batch)
|
124
|
-
result_code =
|
125
|
-
@export_attempts.times do |attempts|
|
126
|
-
result_code = export_with_timeout(batch)
|
127
|
-
break unless result_code == FAILED_RETRYABLE
|
128
|
-
|
129
|
-
sleep(0.1 * attempts)
|
130
|
-
end
|
117
|
+
result_code = export_with_timeout(batch)
|
131
118
|
report_result(result_code, batch)
|
132
119
|
end
|
133
120
|
|
134
121
|
def export_with_timeout(batch)
|
135
122
|
Timeout.timeout(@exporter_timeout_seconds) { @exporter.export(batch) }
|
136
123
|
rescue Timeout::Error
|
137
|
-
|
124
|
+
FAILURE
|
138
125
|
end
|
139
126
|
|
140
127
|
def report_result(result_code, batch)
|
@@ -61,10 +61,10 @@ module OpenTelemetry
|
|
61
61
|
# @param [Enumerable<SpanData>] span_datas the list of sampled {SpanData}s to be
|
62
62
|
# exported.
|
63
63
|
# @return [Integer] the result of the export, SUCCESS or
|
64
|
-
#
|
64
|
+
# FAILURE
|
65
65
|
def export(span_datas)
|
66
66
|
@mutex.synchronize do
|
67
|
-
return
|
67
|
+
return FAILURE if @stopped
|
68
68
|
|
69
69
|
@finished_spans.concat(span_datas.to_a)
|
70
70
|
end
|
@@ -29,7 +29,7 @@ module OpenTelemetry
|
|
29
29
|
merge_result_code(result_code, span_exporter.export(spans))
|
30
30
|
rescue => e # rubocop:disable Style/RescueStandardError
|
31
31
|
OpenTelemetry.logger.warn("exception raised by export - #{e}")
|
32
|
-
|
32
|
+
FAILURE
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -46,13 +46,9 @@ module OpenTelemetry
|
|
46
46
|
if result_code == SUCCESS && new_result_code == SUCCESS
|
47
47
|
# If both errors are success then return success.
|
48
48
|
SUCCESS
|
49
|
-
elsif result_code == FAILED_NOT_RETRYABLE || new_result_code == FAILED_NOT_RETRYABLE
|
50
|
-
# If any of the codes is not retryable then return not_retryable.
|
51
|
-
FAILED_NOT_RETRYABLE
|
52
49
|
else
|
53
|
-
# At this point at least one of the code is
|
54
|
-
|
55
|
-
FAILED_RETRYABLE
|
50
|
+
# At this point at least one of the code is FAILURE, so return FAILURE.
|
51
|
+
FAILURE
|
56
52
|
end
|
57
53
|
end
|
58
54
|
end
|
@@ -6,6 +6,8 @@
|
|
6
6
|
|
7
7
|
require 'opentelemetry/sdk/trace/samplers/decision'
|
8
8
|
require 'opentelemetry/sdk/trace/samplers/result'
|
9
|
+
require 'opentelemetry/sdk/trace/samplers/constant_sampler'
|
10
|
+
require 'opentelemetry/sdk/trace/samplers/parent_or_else'
|
9
11
|
require 'opentelemetry/sdk/trace/samplers/probability_sampler'
|
10
12
|
|
11
13
|
module OpenTelemetry
|
@@ -13,17 +15,16 @@ module OpenTelemetry
|
|
13
15
|
module Trace
|
14
16
|
# The Samplers module contains the sampling logic for OpenTelemetry. The
|
15
17
|
# reference implementation provides a {ProbabilitySampler}, {ALWAYS_ON},
|
16
|
-
# {ALWAYS_OFF}, and {
|
18
|
+
# {ALWAYS_OFF}, and {ParentOrElse}.
|
17
19
|
#
|
18
|
-
# Custom samplers can be provided by SDK users. The required interface is
|
19
|
-
# a callable with the signature:
|
20
|
+
# Custom samplers can be provided by SDK users. The required interface is:
|
20
21
|
#
|
21
|
-
# (trace_id:,
|
22
|
+
# should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:) -> Result
|
23
|
+
# description -> String
|
22
24
|
#
|
23
25
|
# Where:
|
24
26
|
#
|
25
27
|
# @param [String] trace_id The trace_id of the {Span} to be created.
|
26
|
-
# @param [String] span_id The span_id of the {Span} to be created.
|
27
28
|
# @param [OpenTelemetry::Trace::SpanContext] parent_context The
|
28
29
|
# {OpenTelemetry::Trace::SpanContext} of a parent span, typically
|
29
30
|
# extracted from the wire. Can be nil for a root span.
|
@@ -44,27 +45,20 @@ module OpenTelemetry
|
|
44
45
|
|
45
46
|
private_constant(:RECORD_AND_SAMPLED, :NOT_RECORD, :RECORD, :SAMPLING_HINTS, :APPLY_PROBABILITY_TO_SYMBOLS)
|
46
47
|
|
47
|
-
# rubocop:disable Lint/UnusedBlockArgument
|
48
|
-
|
49
48
|
# Returns a {Result} with {Decision::RECORD_AND_SAMPLED}.
|
50
|
-
ALWAYS_ON =
|
49
|
+
ALWAYS_ON = ConstantSampler.new(result: RECORD_AND_SAMPLED, description: 'AlwaysOnSampler')
|
51
50
|
|
52
51
|
# Returns a {Result} with {Decision::NOT_RECORD}.
|
53
|
-
ALWAYS_OFF =
|
52
|
+
ALWAYS_OFF = ConstantSampler.new(result: NOT_RECORD, description: 'AlwaysOffSampler')
|
54
53
|
|
55
|
-
# Returns a
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
else
|
63
|
-
NOT_RECORD
|
64
|
-
end
|
54
|
+
# Returns a new sampler. It either respects the parent span's sampling
|
55
|
+
# decision or delegates to delegate_sampler for root spans.
|
56
|
+
#
|
57
|
+
# @param [Sampler] delegate_sampler The sampler to which the sampling
|
58
|
+
# decision is delegated for root spans.
|
59
|
+
def self.parent_or_else(delegate_sampler)
|
60
|
+
ParentOrElse.new(delegate_sampler)
|
65
61
|
end
|
66
|
-
# rubocop:enable Style/Lambda
|
67
|
-
# rubocop:enable Lint/UnusedBlockArgument
|
68
62
|
|
69
63
|
# Returns a new sampler. The probability of sampling a trace is equal
|
70
64
|
# to that of the specified probability.
|
@@ -0,0 +1,33 @@
|
|
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
|
+
# Implements a sampler returning a constant result.
|
14
|
+
class ConstantSampler
|
15
|
+
attr_reader :description
|
16
|
+
|
17
|
+
def initialize(result:, description:)
|
18
|
+
@result = result
|
19
|
+
@description = description
|
20
|
+
end
|
21
|
+
|
22
|
+
# @api private
|
23
|
+
#
|
24
|
+
# See {Samplers}.
|
25
|
+
def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:)
|
26
|
+
# All arguments ignored for sampling decision.
|
27
|
+
@result
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,43 @@
|
|
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
|
@@ -12,18 +12,21 @@ module OpenTelemetry
|
|
12
12
|
#
|
13
13
|
# Implements sampling based on a probability.
|
14
14
|
class ProbabilitySampler
|
15
|
+
attr_reader :description
|
16
|
+
|
15
17
|
def initialize(probability, ignore_parent:, apply_to_remote_parent:, apply_to_all_spans:)
|
16
18
|
@probability = probability
|
17
19
|
@id_upper_bound = format('%016x', (probability * (2**64 - 1)).ceil)
|
18
20
|
@use_parent_sampled_flag = !ignore_parent
|
19
21
|
@apply_to_remote_parent = apply_to_remote_parent
|
20
22
|
@apply_to_all_spans = apply_to_all_spans
|
23
|
+
@description = format('ProbabilitySampler{%.6f}', probability)
|
21
24
|
end
|
22
25
|
|
23
26
|
# @api private
|
24
27
|
#
|
25
|
-
#
|
26
|
-
def
|
28
|
+
# See {Samplers}.
|
29
|
+
def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:)
|
27
30
|
# Ignored for sampling decision: links, name, kind, attributes.
|
28
31
|
|
29
32
|
if sample?(trace_id, parent_context)
|
@@ -18,7 +18,7 @@ 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, :library_resource, :instrumentation_library
|
22
22
|
|
23
23
|
# Return a frozen copy of the current attributes. This is intended for
|
24
24
|
# use of SpanProcesses and should not be considered part of the public
|
@@ -237,14 +237,16 @@ module OpenTelemetry
|
|
237
237
|
@links,
|
238
238
|
@events,
|
239
239
|
@library_resource,
|
240
|
+
@instrumentation_library,
|
240
241
|
context.span_id,
|
241
242
|
context.trace_id,
|
242
|
-
context.trace_flags
|
243
|
+
context.trace_flags,
|
244
|
+
context.tracestate
|
243
245
|
)
|
244
246
|
end
|
245
247
|
|
246
248
|
# @api private
|
247
|
-
def initialize(context, name, kind, parent_span_id, trace_config, span_processor, attributes, links, start_timestamp, library_resource) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
249
|
+
def initialize(context, name, kind, parent_span_id, trace_config, span_processor, attributes, links, start_timestamp, library_resource, instrumentation_library) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
|
248
250
|
super(span_context: context)
|
249
251
|
@mutex = Mutex.new
|
250
252
|
@name = name
|
@@ -253,6 +255,7 @@ module OpenTelemetry
|
|
253
255
|
@trace_config = trace_config
|
254
256
|
@span_processor = span_processor
|
255
257
|
@library_resource = library_resource
|
258
|
+
@instrumentation_library = instrumentation_library
|
256
259
|
@ended = false
|
257
260
|
@status = nil
|
258
261
|
@child_count = 0
|
@@ -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,12 +19,14 @@ 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
32
|
def start_root_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
|
@@ -40,22 +43,31 @@ module OpenTelemetry
|
|
40
43
|
trace_id = parent_span_context&.trace_id
|
41
44
|
trace_id ||= OpenTelemetry::Trace.generate_trace_id
|
42
45
|
span_id = OpenTelemetry::Trace.generate_span_id
|
43
|
-
sampler =
|
44
|
-
result = sampler.
|
45
|
-
|
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)
|
46
48
|
internal_create_span(result, name, kind, trace_id, span_id, parent_span_id, attributes, links, start_timestamp, tracestate)
|
47
49
|
end
|
48
50
|
|
49
51
|
private
|
50
52
|
|
51
53
|
def internal_create_span(result, name, kind, trace_id, span_id, parent_span_id, attributes, links, start_timestamp, tracestate) # rubocop:disable Metrics/AbcSize
|
52
|
-
if result.recording? && !
|
54
|
+
if result.recording? && !tracer_provider.stopped?
|
53
55
|
trace_flags = result.sampled? ? OpenTelemetry::Trace::TraceFlags::SAMPLED : OpenTelemetry::Trace::TraceFlags::DEFAULT
|
54
56
|
context = OpenTelemetry::Trace::SpanContext.new(trace_id: trace_id, trace_flags: trace_flags, tracestate: tracestate)
|
55
57
|
attributes = attributes&.merge(result.attributes) || result.attributes
|
56
|
-
|
57
|
-
|
58
|
-
|
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
|
+
)
|
59
71
|
else
|
60
72
|
OpenTelemetry::Trace::Span.new(span_context: OpenTelemetry::Trace::SpanContext.new(trace_id: trace_id))
|
61
73
|
end
|
@@ -13,20 +13,20 @@ module OpenTelemetry
|
|
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
19
|
# Returns a new {TracerProvider} instance.
|
21
20
|
#
|
22
21
|
# @return [TracerProvider]
|
23
|
-
def initialize
|
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
|
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.5.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-07-17 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.5.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.5.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -153,8 +153,10 @@ files:
|
|
153
153
|
- lib/opentelemetry/sdk/correlation_context.rb
|
154
154
|
- lib/opentelemetry/sdk/correlation_context/builder.rb
|
155
155
|
- lib/opentelemetry/sdk/correlation_context/manager.rb
|
156
|
+
- lib/opentelemetry/sdk/instrumentation_library.rb
|
156
157
|
- lib/opentelemetry/sdk/internal.rb
|
157
158
|
- lib/opentelemetry/sdk/resources.rb
|
159
|
+
- lib/opentelemetry/sdk/resources/constants.rb
|
158
160
|
- lib/opentelemetry/sdk/resources/resource.rb
|
159
161
|
- lib/opentelemetry/sdk/trace.rb
|
160
162
|
- lib/opentelemetry/sdk/trace/config.rb
|
@@ -169,7 +171,9 @@ files:
|
|
169
171
|
- lib/opentelemetry/sdk/trace/multi_span_processor.rb
|
170
172
|
- lib/opentelemetry/sdk/trace/noop_span_processor.rb
|
171
173
|
- lib/opentelemetry/sdk/trace/samplers.rb
|
174
|
+
- lib/opentelemetry/sdk/trace/samplers/constant_sampler.rb
|
172
175
|
- lib/opentelemetry/sdk/trace/samplers/decision.rb
|
176
|
+
- lib/opentelemetry/sdk/trace/samplers/parent_or_else.rb
|
173
177
|
- lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb
|
174
178
|
- lib/opentelemetry/sdk/trace/samplers/result.rb
|
175
179
|
- lib/opentelemetry/sdk/trace/span.rb
|