opentelemetry-sdk 0.2.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +9 -0
- data/CHANGELOG.md +23 -0
- data/LICENSE +1 -1
- data/README.md +73 -0
- data/lib/opentelemetry-sdk.rb +7 -0
- data/lib/opentelemetry/sdk.rb +51 -0
- data/lib/opentelemetry/sdk/baggage.rb +16 -0
- data/lib/opentelemetry/sdk/baggage/builder.rb +40 -0
- data/lib/opentelemetry/sdk/baggage/manager.rb +97 -0
- data/lib/opentelemetry/sdk/configurator.rb +172 -0
- data/lib/opentelemetry/sdk/instrumentation_library.rb +13 -0
- data/lib/opentelemetry/sdk/internal.rb +21 -1
- data/lib/opentelemetry/sdk/resources.rb +1 -0
- data/lib/opentelemetry/sdk/resources/constants.rb +124 -0
- data/lib/opentelemetry/sdk/resources/resource.rb +39 -19
- data/lib/opentelemetry/sdk/trace.rb +2 -1
- data/lib/opentelemetry/sdk/trace/config/trace_config.rb +3 -3
- data/lib/opentelemetry/sdk/trace/event.rb +48 -0
- data/lib/opentelemetry/sdk/trace/export.rb +2 -7
- data/lib/opentelemetry/sdk/trace/export/batch_span_processor.rb +41 -35
- data/lib/opentelemetry/sdk/trace/export/console_span_exporter.rb +1 -1
- data/lib/opentelemetry/sdk/trace/export/in_memory_span_exporter.rb +7 -7
- data/lib/opentelemetry/sdk/trace/export/multi_span_exporter.rb +8 -14
- data/lib/opentelemetry/sdk/trace/export/noop_span_exporter.rb +4 -4
- data/lib/opentelemetry/sdk/trace/export/simple_span_processor.rb +10 -1
- data/lib/opentelemetry/sdk/trace/multi_span_processor.rb +12 -1
- data/lib/opentelemetry/sdk/trace/noop_span_processor.rb +10 -1
- data/lib/opentelemetry/sdk/trace/samplers.rb +48 -57
- data/lib/opentelemetry/sdk/trace/samplers/constant_sampler.rb +33 -0
- data/lib/opentelemetry/sdk/trace/samplers/decision.rb +3 -3
- data/lib/opentelemetry/sdk/trace/samplers/parent_based.rb +53 -0
- data/lib/opentelemetry/sdk/trace/samplers/result.rb +4 -3
- data/lib/opentelemetry/sdk/trace/samplers/trace_id_ratio_based.rb +45 -0
- data/lib/opentelemetry/sdk/trace/span.rb +39 -28
- data/lib/opentelemetry/sdk/trace/span_data.rb +18 -2
- data/lib/opentelemetry/sdk/trace/tracer.rb +26 -15
- data/lib/opentelemetry/sdk/trace/{tracer_factory.rb → tracer_provider.rb} +9 -9
- data/lib/opentelemetry/sdk/version.rb +1 -1
- metadata +20 -8
- data/lib/opentelemetry/sdk/trace/samplers/probability_sampler.rb +0 -74
@@ -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
|
@@ -20,10 +20,30 @@ module OpenTelemetry
|
|
20
20
|
key.instance_of?(String)
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def valid_simple_value?(value)
|
24
24
|
value.instance_of?(String) || value == false || value == true || value.is_a?(Numeric)
|
25
25
|
end
|
26
26
|
|
27
|
+
def valid_array_value?(value)
|
28
|
+
return false unless value.is_a?(Array)
|
29
|
+
return true if value.empty?
|
30
|
+
|
31
|
+
case value.first
|
32
|
+
when String
|
33
|
+
value.all? { |v| v.instance_of?(String) }
|
34
|
+
when TrueClass, FalseClass
|
35
|
+
value.all? { |v| boolean?(v) }
|
36
|
+
when Numeric
|
37
|
+
value.all? { |v| v.is_a?(Numeric) }
|
38
|
+
else
|
39
|
+
false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def valid_value?(value)
|
44
|
+
valid_simple_value?(value) || valid_array_value?(value)
|
45
|
+
end
|
46
|
+
|
27
47
|
def valid_attributes?(attrs)
|
28
48
|
attrs.nil? || attrs.all? { |k, v| valid_key?(k) && valid_value?(v) }
|
29
49
|
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
|
@@ -13,20 +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
|
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, '
|
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)
|
25
26
|
|
26
|
-
memo[-k] =
|
27
|
+
memo[-k] = v.freeze
|
27
28
|
end.freeze
|
28
29
|
|
29
|
-
new(
|
30
|
+
new(frozen_attributes)
|
31
|
+
end
|
32
|
+
|
33
|
+
def telemetry_sdk
|
34
|
+
resource_attributes = {
|
35
|
+
Constants::TELEMETRY_SDK_RESOURCE[:name] => 'opentelemetry',
|
36
|
+
Constants::TELEMETRY_SDK_RESOURCE[:language] => 'ruby',
|
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)
|
30
50
|
end
|
31
51
|
end
|
32
52
|
|
@@ -35,18 +55,18 @@ module OpenTelemetry
|
|
35
55
|
# Users should use the {create} factory method to obtain a {Resource}
|
36
56
|
# instance.
|
37
57
|
#
|
38
|
-
# @param [Hash<String, String>]
|
39
|
-
# 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
|
40
60
|
# @return [Resource]
|
41
|
-
def initialize(
|
42
|
-
@
|
61
|
+
def initialize(frozen_attributes)
|
62
|
+
@attributes = frozen_attributes
|
43
63
|
end
|
44
64
|
|
45
|
-
# Returns an enumerator for
|
65
|
+
# Returns an enumerator for attributes of this {Resource}
|
46
66
|
#
|
47
67
|
# @return [Enumerator]
|
48
|
-
def
|
49
|
-
@
|
68
|
+
def attribute_enumerator
|
69
|
+
@attribute_enumerator ||= attributes.to_enum
|
50
70
|
end
|
51
71
|
|
52
72
|
# Returns a new, merged {Resource} by merging the current {Resource} with
|
@@ -59,16 +79,16 @@ module OpenTelemetry
|
|
59
79
|
def merge(other)
|
60
80
|
return self unless other.is_a?(Resource)
|
61
81
|
|
62
|
-
|
82
|
+
merged_attributes = attributes.merge(other.attributes) do |_, old_v, new_v|
|
63
83
|
old_v.empty? ? new_v : old_v
|
64
84
|
end
|
65
85
|
|
66
|
-
self.class.send(:new,
|
86
|
+
self.class.send(:new, merged_attributes.freeze)
|
67
87
|
end
|
68
88
|
|
69
89
|
protected
|
70
90
|
|
71
|
-
attr_reader :
|
91
|
+
attr_reader :attributes
|
72
92
|
end
|
73
93
|
end
|
74
94
|
end
|
@@ -15,10 +15,11 @@ 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'
|
21
22
|
require 'opentelemetry/sdk/trace/span_data'
|
22
23
|
require 'opentelemetry/sdk/trace/span'
|
23
24
|
require 'opentelemetry/sdk/trace/tracer'
|
24
|
-
require 'opentelemetry/sdk/trace/
|
25
|
+
require 'opentelemetry/sdk/trace/tracer_provider'
|
@@ -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
|
@@ -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,29 @@ 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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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}.
|
37
43
|
def initialize(exporter:,
|
38
|
-
exporter_timeout_millis:
|
39
|
-
schedule_delay_millis:
|
40
|
-
max_queue_size:
|
41
|
-
max_export_batch_size:
|
42
|
-
max_export_attempts: MAX_EXPORT_ATTEMPTS)
|
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)))
|
43
48
|
raise ArgumentError if max_export_batch_size > max_queue_size
|
44
49
|
|
45
50
|
@exporter = exporter
|
@@ -50,7 +55,6 @@ module OpenTelemetry
|
|
50
55
|
@delay_seconds = schedule_delay_millis / 1000.0
|
51
56
|
@max_queue_size = max_queue_size
|
52
57
|
@batch_size = max_export_batch_size
|
53
|
-
@export_attempts = max_export_attempts
|
54
58
|
@spans = []
|
55
59
|
@thread = Thread.new { work }
|
56
60
|
end
|
@@ -72,6 +76,23 @@ module OpenTelemetry
|
|
72
76
|
end
|
73
77
|
end
|
74
78
|
|
79
|
+
# TODO: test this explicitly.
|
80
|
+
# Export all ended spans to the configured `Exporter` that have not yet
|
81
|
+
# been exported.
|
82
|
+
#
|
83
|
+
# This method should only be called in cases where it is absolutely
|
84
|
+
# necessary, such as when using some FaaS providers that may suspend
|
85
|
+
# the process after an invocation, but before the `Processor` exports
|
86
|
+
# the completed spans.
|
87
|
+
def force_flush
|
88
|
+
snapshot = lock { spans.shift(spans.size) }
|
89
|
+
until snapshot.empty?
|
90
|
+
batch = snapshot.shift(@batch_size).map!(&:to_span_data)
|
91
|
+
result_code = @exporter.export(batch)
|
92
|
+
report_result(result_code, batch)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
75
96
|
# shuts the consumer thread down and flushes the current accumulated buffer
|
76
97
|
# will block until the thread is finished
|
77
98
|
def shutdown
|
@@ -81,7 +102,7 @@ module OpenTelemetry
|
|
81
102
|
end
|
82
103
|
|
83
104
|
@thread.join
|
84
|
-
|
105
|
+
force_flush
|
85
106
|
@exporter.shutdown
|
86
107
|
end
|
87
108
|
|
@@ -104,35 +125,20 @@ module OpenTelemetry
|
|
104
125
|
end
|
105
126
|
|
106
127
|
def export_batch(batch)
|
107
|
-
result_code =
|
108
|
-
@export_attempts.times do |attempts|
|
109
|
-
result_code = export_with_timeout(batch)
|
110
|
-
break unless result_code == FAILED_RETRYABLE
|
111
|
-
|
112
|
-
sleep(0.1 * attempts)
|
113
|
-
end
|
128
|
+
result_code = export_with_timeout(batch)
|
114
129
|
report_result(result_code, batch)
|
115
130
|
end
|
116
131
|
|
117
132
|
def export_with_timeout(batch)
|
118
133
|
Timeout.timeout(@exporter_timeout_seconds) { @exporter.export(batch) }
|
119
134
|
rescue Timeout::Error
|
120
|
-
|
135
|
+
FAILURE
|
121
136
|
end
|
122
137
|
|
123
138
|
def report_result(result_code, batch)
|
124
139
|
OpenTelemetry.logger.error("Unable to export #{batch.size} spans") unless result_code == SUCCESS
|
125
140
|
end
|
126
141
|
|
127
|
-
def flush
|
128
|
-
snapshot = lock { spans.shift(spans.size) }
|
129
|
-
until snapshot.empty?
|
130
|
-
batch = snapshot.shift(@batch_size).map!(&:to_span_data)
|
131
|
-
result_code = @exporter.export(batch)
|
132
|
-
report_result(result_code, batch)
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
142
|
def fetch_batch
|
137
143
|
spans.shift(@batch_size).map!(&:to_span_data)
|
138
144
|
end
|