opentelemetry-sdk 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|