opentelemetry-sdk 0.12.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 718ea2029bb234ea6ed56da8b65923595e275bb4730c3f3ea50bc20c4a01597d
4
- data.tar.gz: 39e4031d0ef4ff426fe9bd776b4e85a2dd351a77c9dc8e19b80330dc5bf9d544
3
+ metadata.gz: 83141347c526da6e87b4858c6ad9277ec4d2a59a452944114f21618b86d98db1
4
+ data.tar.gz: e1ebac32ea8dbcbb5087bf2d06bae25f5ed269fb7a3e17159d37d41def7b5063
5
5
  SHA512:
6
- metadata.gz: caa3842133c57ab739e0c21d8e1cd5f9cd58293e1e34055eef6b18fd4ff0869a39edbe87bcbb0fef7e76ea733f9ea0f9ff84663cf70a3a88820b7074c78c156d
7
- data.tar.gz: f3e8176d0b495ea3784b6f8e2b2676000e35b3db7a1fab7b0890014ff69accd9caa69a00af02b4668964d3837aabd470bdaec78bda0d06ada1a9cfe6f1b000a7
6
+ metadata.gz: 68a19f8ce70e8a1dc00bcea801c16f405f86a826e9501a9e513fd0070adca7e8cbe51f958f6957f8d38bae768fa9f8b4b111c55112d95309bb0bcfb8b85c5e26
7
+ data.tar.gz: a25e070825c5d2f886e01c8b1659e63f73810fbae89ac629c4e5b2319391c859db90b87901d294044fc06e8f4bb7879e97ce3549484d408695f7aac0345c1256
data/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # Release History: opentelemetry-sdk
2
2
 
3
+ ### v0.15.0 / 2021-02-18
4
+
5
+ * BREAKING CHANGE: Streamline processor pipeline
6
+
7
+ * ADDED: Add instrumentation config validation
8
+ * FIXED: Streamline processor pipeline
9
+ * FIXED: OTEL_TRACE -> OTEL_TRACES env vars
10
+ * FIXED: Change limits from 1000 to 128
11
+ * FIXED: OTEL_TRACES_EXPORTER and OTEL_PROPAGATORS
12
+ * FIXED: Add thread error handling to the BSP
13
+ * DOCS: Clarify nil attribute values not allowed
14
+
15
+ ### v0.14.0 / 2021-02-03
16
+
17
+ * BREAKING CHANGE: Replace getter and setter callables and remove rack specific propagators
18
+
19
+ * ADDED: Replace getter and setter callables and remove rack specific propagators
20
+
21
+ ### v0.13.1 / 2021-02-01
22
+
23
+ * FIXED: Leaky test
24
+ * FIXED: Allow env var override of service.name
25
+
26
+ ### v0.13.0 / 2021-01-29
27
+
28
+ * BREAKING CHANGE: Remove MILLIS from BatchSpanProcessor vars
29
+
30
+ * ADDED: Process.runtime resource
31
+ * ADDED: Provide default resource in SDK
32
+ * ADDED: Add optional attributes to record_exception
33
+ * FIXED: Resource.merge consistency
34
+ * FIXED: Remove MILLIS from BatchSpanProcessor vars
35
+
36
+ ### v0.12.1 / 2021-01-13
37
+
38
+ * FIXED: Fix several BatchSpanProcessor errors related to fork safety
39
+ * FIXED: Define default value for traceid ratio
40
+
3
41
  ### v0.12.0 / 2020-12-24
4
42
 
5
43
  * ADDED: Structured error handling
data/README.md CHANGED
@@ -66,8 +66,8 @@ The `opentelemetry-sdk` gem is distributed under the Apache 2.0 license. See [LI
66
66
  [opentelemetry-home]: https://opentelemetry.io
67
67
  [bundler-home]: https://bundler.io
68
68
  [repo-github]: https://github.com/open-telemetry/opentelemetry-ruby
69
- [license-github]: https://github.com/open-telemetry/opentelemetry-ruby/blob/master/LICENSE
70
- [examples-github]: https://github.com/open-telemetry/opentelemetry-ruby/tree/master/examples
69
+ [license-github]: https://github.com/open-telemetry/opentelemetry-ruby/blob/main/LICENSE
70
+ [examples-github]: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/examples
71
71
  [ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
72
72
  [community-meetings]: https://github.com/open-telemetry/community#community-meetings
73
73
  [ruby-gitter]: https://gitter.im/open-telemetry/opentelemetry-ruby
@@ -15,19 +15,17 @@ 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, :text_map_extractors,
19
- :text_map_injectors, :error_handler, :id_generator
18
+ attr_writer :logger, :extractors, :injectors, :error_handler,
19
+ :id_generator
20
20
 
21
21
  def initialize
22
22
  @instrumentation_names = []
23
23
  @instrumentation_config_map = {}
24
- @http_extractors = nil
25
- @http_injectors = nil
26
- @text_map_extractors = nil
27
- @text_map_injectors = nil
24
+ @injectors = nil
25
+ @extractors = nil
28
26
  @span_processors = []
29
27
  @use_mode = USE_MODE_UNSPECIFIED
30
- @resource = Resources::Resource.telemetry_sdk
28
+ @resource = Resources::Resource.default
31
29
  @id_generator = OpenTelemetry::Trace
32
30
  end
33
31
 
@@ -46,7 +44,7 @@ module OpenTelemetry
46
44
  #
47
45
  # @param [Resource] new_resource The resource to be merged
48
46
  def resource=(new_resource)
49
- @resource = new_resource.merge(@resource)
47
+ @resource = @resource.merge(new_resource)
50
48
  end
51
49
 
52
50
  # Accepts a string that is merged in as the service.name resource attribute.
@@ -54,9 +52,9 @@ module OpenTelemetry
54
52
  # calls to this setter.
55
53
  # @param [String] service_name The value to be used as the service name
56
54
  def service_name=(service_name)
57
- @resource = OpenTelemetry::SDK::Resources::Resource.create(
55
+ self.resource = OpenTelemetry::SDK::Resources::Resource.create(
58
56
  OpenTelemetry::SDK::Resources::Constants::SERVICE_RESOURCE[:name] => service_name
59
- ).merge(@resource)
57
+ )
60
58
  end
61
59
 
62
60
  # Accepts a string that is merged in as the service.version resource attribute.
@@ -64,9 +62,9 @@ module OpenTelemetry
64
62
  # calls to this setter.
65
63
  # @param [String] service_version The value to be used as the service version
66
64
  def service_version=(service_version)
67
- @resource = OpenTelemetry::SDK::Resources::Resource.create(
65
+ self.resource = OpenTelemetry::SDK::Resources::Resource.create(
68
66
  OpenTelemetry::SDK::Resources::Constants::SERVICE_RESOURCE[:version] => service_version
69
- ).merge(@resource)
67
+ )
70
68
  end
71
69
 
72
70
  # Install an instrumentation with specificied optional +config+.
@@ -145,54 +143,66 @@ module OpenTelemetry
145
143
  end
146
144
 
147
145
  def configure_span_processors
148
- processors = @span_processors.empty? ? [default_span_processor] : @span_processors
146
+ processors = @span_processors.empty? ? [wrapped_exporter_from_env].compact : @span_processors
149
147
  processors.each { |p| tracer_provider.add_span_processor(p) }
150
148
  end
151
149
 
152
- def default_span_processor
153
- Trace::Export::SimpleSpanProcessor.new(
154
- Trace::Export::ConsoleSpanExporter.new
155
- )
150
+ def wrapped_exporter_from_env
151
+ exporter = ENV.fetch('OTEL_TRACES_EXPORTER', 'otlp')
152
+ case exporter
153
+ when 'none' then nil
154
+ when 'otlp' then fetch_exporter(exporter, 'OpenTelemetry::Exporter::OTLP::Exporter')
155
+ when 'jaeger' then fetch_exporter(exporter, 'OpenTelemetry::Exporter::Jaeger::CollectorExporter')
156
+ when 'zipkin' then fetch_exporter(exporter, 'OpenTelemetry::Exporter::Zipkin::Exporter')
157
+ else
158
+ OpenTelemetry.logger.warn "The #{exporter} exporter is unknown and cannot be configured, spans will not be exported"
159
+ nil
160
+ end
156
161
  end
157
162
 
158
- def configure_propagation
159
- OpenTelemetry.propagation.http = create_propagator(@http_injectors || default_http_injectors,
160
- @http_extractors || default_http_extractors)
161
- OpenTelemetry.propagation.text = create_propagator(@text_map_injectors || default_text_map_injectors,
162
- @text_map_extractors || default_text_map_extractors)
163
+ def configure_propagation # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
164
+ propagators = ENV.fetch('OTEL_PROPAGATORS', 'tracecontext,baggage').split(',')
165
+ injectors, extractors = propagators.uniq.collect do |propagator|
166
+ case propagator
167
+ when 'tracecontext'
168
+ [OpenTelemetry::Trace::Propagation::TraceContext.text_map_injector, OpenTelemetry::Trace::Propagation::TraceContext.text_map_extractor]
169
+ when 'baggage'
170
+ [OpenTelemetry::Baggage::Propagation.text_map_injector, OpenTelemetry::Baggage::Propagation.text_map_extractor]
171
+ when 'b3' then fetch_propagator(propagator, 'OpenTelemetry::Propagator::B3::Single')
172
+ when 'b3multi' then fetch_propagator(propagator, 'OpenTelemetry::Propagator::B3::Multi', 'b3')
173
+ when 'jaeger' then fetch_propagator(propagator, 'OpenTelemetry::Propagator::Jaeger')
174
+ when 'xray' then fetch_propagator(propagator, 'OpenTelemetry::Propagator::XRay')
175
+ when 'ottrace' then fetch_propagator(propagator, 'OpenTelemetry::Propagator::OTTrace')
176
+ else
177
+ OpenTelemetry.logger.warn "The #{propagator} propagator is unknown and cannot be configured"
178
+ [Context::Propagation::NoopInjector.new, Context::Propagation::NoopExtractor.new]
179
+ end
180
+ end.transpose
181
+ OpenTelemetry.propagation = create_propagator(@injectors || injectors.compact,
182
+ @extractors || extractors.compact)
163
183
  end
164
184
 
165
185
  def create_propagator(injectors, extractors)
166
186
  if injectors.size > 1 || extractors.size > 1
167
187
  Context::Propagation::CompositePropagator.new(injectors, extractors)
168
188
  else
169
- Context::Propagation::Propagator.new(injectors, extractors)
189
+ Context::Propagation::Propagator.new(injectors.first, extractors.first)
170
190
  end
171
191
  end
172
192
 
173
- def default_http_injectors
174
- default_text_map_injectors
175
- end
176
-
177
- def default_http_extractors
178
- [
179
- OpenTelemetry::Trace::Propagation::TraceContext.rack_extractor,
180
- OpenTelemetry::Baggage::Propagation.rack_extractor
181
- ]
182
- end
183
-
184
- def default_text_map_injectors
185
- [
186
- OpenTelemetry::Trace::Propagation::TraceContext.text_map_injector,
187
- OpenTelemetry::Baggage::Propagation.text_map_injector
188
- ]
193
+ def fetch_propagator(name, class_name, gem_suffix = name)
194
+ propagator_class = Kernel.const_get(class_name)
195
+ [propagator_class.text_map_injector, propagator_class.text_map_extractor]
196
+ rescue NameError
197
+ OpenTelemetry.logger.warn "The #{name} propagator cannot be configured - please add opentelemetry-propagator-#{gem_suffix} to your Gemfile"
198
+ [nil, nil]
189
199
  end
190
200
 
191
- def default_text_map_extractors
192
- [
193
- OpenTelemetry::Trace::Propagation::TraceContext.text_map_extractor,
194
- OpenTelemetry::Baggage::Propagation.text_map_extractor
195
- ]
201
+ def fetch_exporter(name, class_name)
202
+ Trace::Export::BatchSpanProcessor.new(Kernel.const_get(class_name).new)
203
+ rescue NameError
204
+ OpenTelemetry.logger.warn "The #{name} exporter cannot be configured - please add opentelemetry-exporter-#{name} to your Gemfile, spans will not be exported"
205
+ nil
196
206
  end
197
207
  end
198
208
  end
@@ -77,6 +77,46 @@ module OpenTelemetry
77
77
  deployment_name: 'k8s.deployment.name'
78
78
  }.freeze
79
79
 
80
+ # Attributes defining an operating system process.
81
+ PROCESS_RESOURCE = {
82
+ # Process identifier (PID).
83
+ pid: 'process.pid',
84
+
85
+ # The name of the process executable.
86
+ executable_name: 'process.executable.name',
87
+
88
+ # The full path to the process executable.
89
+ executable_path: 'process.executable.path',
90
+
91
+ # The command used to launch the process (i.e. the command name).
92
+ command: 'process.command',
93
+
94
+ # The full command used to launch the process as a single string
95
+ # representing the full command.
96
+ command_line: 'process.command_line',
97
+
98
+ # All the command arguments (including the command/executable itself)
99
+ # as received by the process.
100
+ command_args: 'process.command_args',
101
+
102
+ # The username of the user that owns the process.
103
+ owner: 'process.owner'
104
+ }.freeze
105
+
106
+ # Attributes defining the single (language) runtime instance which is monitored.
107
+ PROCESS_RUNTIME_RESOURCE = {
108
+ # The name of the runtime of this process.
109
+ name: 'process.runtime.name',
110
+
111
+ # The version of the runtime of this process, as returned by the runtime
112
+ # without modification.
113
+ version: 'process.runtime.version',
114
+
115
+ # An additional description about the runtime of the process, for example
116
+ # a specific vendor customization of the runtime environment.
117
+ description: 'process.runtime.description'
118
+ }.freeze
119
+
80
120
  # Attributes defining a computing instance (e.g. host).
81
121
  HOST_RESOURCE = {
82
122
  # Unique host id. For Cloud this must be the instance_id assigned by the
@@ -30,6 +30,10 @@ module OpenTelemetry
30
30
  new(frozen_attributes)
31
31
  end
32
32
 
33
+ def default
34
+ @default ||= create(Constants::SERVICE_RESOURCE[:name] => 'unknown_service').merge(process).merge(telemetry_sdk)
35
+ end
36
+
33
37
  def telemetry_sdk
34
38
  resource_attributes = {
35
39
  Constants::TELEMETRY_SDK_RESOURCE[:name] => 'opentelemetry',
@@ -48,6 +52,18 @@ module OpenTelemetry
48
52
  resource_attributes.delete_if { |_key, value| value.nil? || value.empty? }
49
53
  create(resource_attributes)
50
54
  end
55
+
56
+ def process
57
+ resource_attributes = {
58
+ Constants::PROCESS_RESOURCE[:pid] => Process.pid,
59
+ Constants::PROCESS_RESOURCE[:command] => $PROGRAM_NAME,
60
+ Constants::PROCESS_RUNTIME_RESOURCE[:name] => RUBY_ENGINE,
61
+ Constants::PROCESS_RUNTIME_RESOURCE[:version] => RUBY_VERSION,
62
+ Constants::PROCESS_RUNTIME_RESOURCE[:description] => RUBY_DESCRIPTION
63
+ }
64
+
65
+ create(resource_attributes)
66
+ end
51
67
  end
52
68
 
53
69
  # @api private
@@ -79,11 +95,7 @@ module OpenTelemetry
79
95
  def merge(other)
80
96
  return self unless other.is_a?(Resource)
81
97
 
82
- merged_attributes = attributes.merge(other.attributes) do |_, old_v, new_v|
83
- old_v.empty? ? new_v : old_v
84
- end
85
-
86
- self.class.send(:new, merged_attributes.freeze)
98
+ self.class.send(:new, attributes.merge(other.attributes).freeze)
87
99
  end
88
100
 
89
101
  protected
@@ -33,9 +33,9 @@ module OpenTelemetry
33
33
  # @return [TraceConfig] with the desired values.
34
34
  # @raise [ArgumentError] if any of the max numbers are not positive.
35
35
  def initialize(sampler: sampler_from_environment(Samplers.parent_based(root: Samplers::ALWAYS_ON)),
36
- max_attributes_count: Integer(ENV.fetch('OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT', 1000)),
37
- max_events_count: Integer(ENV.fetch('OTEL_SPAN_EVENT_COUNT_LIMIT', 1000)),
38
- max_links_count: Integer(ENV.fetch('OTEL_SPAN_LINK_COUNT_LIMIT', 1000)),
36
+ max_attributes_count: Integer(ENV.fetch('OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT', 128)),
37
+ max_events_count: Integer(ENV.fetch('OTEL_SPAN_EVENT_COUNT_LIMIT', 128)),
38
+ max_links_count: Integer(ENV.fetch('OTEL_SPAN_LINK_COUNT_LIMIT', 128)),
39
39
  max_attributes_per_event: max_attributes_count,
40
40
  max_attributes_per_link: max_attributes_count)
41
41
  raise ArgumentError, 'max_attributes_count must be positive' unless max_attributes_count.positive?
@@ -56,13 +56,13 @@ module OpenTelemetry
56
56
  private
57
57
 
58
58
  def sampler_from_environment(default_sampler) # rubocop:disable Metrics/CyclomaticComplexity
59
- case ENV['OTEL_TRACE_SAMPLER']
59
+ case ENV['OTEL_TRACES_SAMPLER']
60
60
  when 'always_on' then Samplers::ALWAYS_ON
61
61
  when 'always_off' then Samplers::ALWAYS_OFF
62
- when 'traceidratio' then Samplers.trace_id_ratio_based(Float(ENV['OTEL_TRACE_SAMPLER_ARG']))
62
+ when 'traceidratio' then Samplers.trace_id_ratio_based(Float(ENV.fetch('OTEL_TRACES_SAMPLER_ARG', 1.0)))
63
63
  when 'parentbased_always_on' then Samplers.parent_based(root: Samplers::ALWAYS_ON)
64
64
  when 'parentbased_always_off' then Samplers.parent_based(root: Samplers::ALWAYS_OFF)
65
- when 'parentbased_traceidratio' then Samplers.parent_based(root: Samplers.trace_id_ratio_based(Float(ENV['OTEL_TRACE_SAMPLER_ARG'])))
65
+ when 'parentbased_traceidratio' then Samplers.parent_based(root: Samplers.trace_id_ratio_based(Float(ENV.fetch('OTEL_TRACES_SAMPLER_ARG', 1.0))))
66
66
  else default_sampler
67
67
  end
68
68
  rescue StandardError => e
@@ -19,7 +19,7 @@ module OpenTelemetry
19
19
  # All spans reported by the SDK implementation are first added to a
20
20
  # synchronized queue (with a {max_queue_size} maximum size, after the
21
21
  # size is reached spans are dropped) and exported every
22
- # schedule_delay_millis to the exporter pipeline in batches of
22
+ # schedule_delay to the exporter pipeline in batches of
23
23
  # max_export_batch_size.
24
24
  #
25
25
  # If the queue gets half full a preemptive notification is sent to the
@@ -28,12 +28,13 @@ module OpenTelemetry
28
28
  class BatchSpanProcessor # rubocop:disable Metrics/ClassLength
29
29
  # Returns a new instance of the {BatchSpanProcessor}.
30
30
  #
31
- # @param [SpanExporter] exporter
32
- # @param [Numeric] exporter_timeout_millis the delay interval between two
33
- # consecutive exports. Defaults to the value of the OTEL_BSP_EXPORT_TIMEOUT_MILLIS
31
+ # @param [SpanExporter] exporter the (duck type) SpanExporter to where the
32
+ # recorded Spans are pushed after batching.
33
+ # @param [Numeric] exporter_timeout the delay interval between two
34
+ # consecutive exports. Defaults to the value of the OTEL_BSP_EXPORT_TIMEOUT
34
35
  # environment variable, if set, or 30,000 (30 seconds).
35
- # @param [Numeric] schedule_delay_millis the maximum allowed time to export data.
36
- # Defaults to the value of the OTEL_BSP_SCHEDULE_DELAY_MILLIS environment
36
+ # @param [Numeric] schedule_delay the maximum allowed time to export data.
37
+ # Defaults to the value of the OTEL_BSP_SCHEDULE_DELAY environment
37
38
  # variable, if set, or 5,000 (5 seconds).
38
39
  # @param [Integer] max_queue_size the maximum queue size in spans.
39
40
  # Defaults to the value of the OTEL_BSP_MAX_QUEUE_SIZE environment
@@ -43,9 +44,9 @@ module OpenTelemetry
43
44
  # variable, if set, or 512.
44
45
  #
45
46
  # @return a new instance of the {BatchSpanProcessor}.
46
- def initialize(exporter:,
47
- exporter_timeout_millis: Float(ENV.fetch('OTEL_BSP_EXPORT_TIMEOUT_MILLIS', 30_000)),
48
- schedule_delay_millis: Float(ENV.fetch('OTEL_BSP_SCHEDULE_DELAY_MILLIS', 5_000)),
47
+ def initialize(exporter,
48
+ exporter_timeout: Float(ENV.fetch('OTEL_BSP_EXPORT_TIMEOUT', 30_000)),
49
+ schedule_delay: Float(ENV.fetch('OTEL_BSP_SCHEDULE_DELAY', 5_000)),
49
50
  max_queue_size: Integer(ENV.fetch('OTEL_BSP_MAX_QUEUE_SIZE', 2048)),
50
51
  max_export_batch_size: Integer(ENV.fetch('OTEL_BSP_MAX_EXPORT_BATCH_SIZE', 512)),
51
52
  start_thread_on_boot: String(ENV['OTEL_RUBY_BSP_START_THREAD_ON_BOOT']) !~ /false/i,
@@ -53,12 +54,12 @@ module OpenTelemetry
53
54
  raise ArgumentError if max_export_batch_size > max_queue_size
54
55
 
55
56
  @exporter = exporter
56
- @exporter_timeout_seconds = exporter_timeout_millis / 1000.0
57
+ @exporter_timeout_seconds = exporter_timeout / 1000.0
57
58
  @mutex = Mutex.new
58
59
  @export_mutex = Mutex.new
59
60
  @condition = ConditionVariable.new
60
61
  @keep_running = true
61
- @delay_seconds = schedule_delay_millis / 1000.0
62
+ @delay_seconds = schedule_delay / 1000.0
62
63
  @max_queue_size = max_queue_size
63
64
  @batch_size = max_export_batch_size
64
65
  @metrics_reporter = metrics_reporter || OpenTelemetry::SDK::Trace::Export::MetricsReporter
@@ -101,7 +102,7 @@ module OpenTelemetry
101
102
  def force_flush(timeout: nil) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
102
103
  start_time = Time.now
103
104
  snapshot = lock do
104
- reset_on_fork(restart_thread: false) if @keep_running
105
+ reset_on_fork if @keep_running
105
106
  spans.shift(spans.size)
106
107
  end
107
108
  until snapshot.empty?
@@ -136,12 +137,13 @@ module OpenTelemetry
136
137
  # non-specific failure occurred, TIMEOUT if a timeout occurred.
137
138
  def shutdown(timeout: nil)
138
139
  start_time = Time.now
139
- lock do
140
+ thread = lock do
140
141
  @keep_running = false
141
142
  @condition.signal
143
+ @thread
142
144
  end
143
145
 
144
- @thread.join(timeout)
146
+ thread&.join(timeout)
145
147
  force_flush(timeout: OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time))
146
148
  @exporter.shutdown(timeout: OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time))
147
149
  dropped_spans = lock { spans.size }
@@ -155,7 +157,6 @@ module OpenTelemetry
155
157
  def work # rubocop:disable Metrics/AbcSize
156
158
  loop do
157
159
  batch = lock do
158
- reset_on_fork(restart_thread: false)
159
160
  @condition.wait(@mutex, @delay_seconds) if spans.size < batch_size && @keep_running
160
161
  @condition.wait(@mutex, @delay_seconds) while spans.empty? && @keep_running
161
162
  return unless @keep_running
@@ -175,7 +176,10 @@ module OpenTelemetry
175
176
 
176
177
  @pid = pid
177
178
  spans.clear
178
- @thread = Thread.new { work } if restart_thread
179
+ @thread = restart_thread ? Thread.new { work } : nil
180
+ rescue ThreadError => e
181
+ @metrics_reporter.add_to_counter('otel.bsp.error', labels: { 'reason' => 'ThreadError' })
182
+ OpenTelemetry.handle_error(exception: e, message: 'unexpected error in BatchSpanProcessor#reset_on_fork')
179
183
  end
180
184
 
181
185
  def export_batch(batch, timeout: @exporter_timeout_seconds)
@@ -64,6 +64,9 @@ module OpenTelemetry
64
64
  #
65
65
  # @param [String] key
66
66
  # @param [String, Boolean, Numeric, Array<String, Numeric, Boolean>] value
67
+ # Values must be non-nil and (array of) string, boolean or numeric type.
68
+ # Array values must not contain nil elements and all elements must be of
69
+ # the same basic type (string, numeric, boolean).
67
70
  #
68
71
  # @return [self] returns itself
69
72
  def set_attribute(key, value)
@@ -96,7 +99,7 @@ module OpenTelemetry
96
99
  # @param [String] name Name of the event.
97
100
  # @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}] attributes
98
101
  # One or more key:value pairs, where the keys must be strings and the
99
- # values may be string, boolean or numeric type.
102
+ # values may be (array of) string, boolean or numeric type.
100
103
  # @param [optional Time] timestamp Optional timestamp for the event.
101
104
  #
102
105
  # @return [self] returns itself
@@ -120,15 +123,20 @@ module OpenTelemetry
120
123
  # can be recorded on a span.
121
124
  #
122
125
  # @param [Exception] exception The exception to be recorded
126
+ # @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
127
+ # attributes One or more key:value pairs, where the keys must be
128
+ # strings and the values may be (array of) string, boolean or numeric
129
+ # type.
123
130
  #
124
131
  # @return [void]
125
- def record_exception(exception)
126
- add_event('exception',
127
- attributes: {
128
- 'exception.type' => exception.class.to_s,
129
- 'exception.message' => exception.message,
130
- 'exception.stacktrace' => exception.full_message(highlight: false, order: :top)
131
- })
132
+ def record_exception(exception, attributes: nil)
133
+ event_attributes = {
134
+ 'exception.type' => exception.class.to_s,
135
+ 'exception.message' => exception.message,
136
+ 'exception.stacktrace' => exception.full_message(highlight: false, order: :top)
137
+ }
138
+ event_attributes.merge!(attributes) unless attributes.nil?
139
+ add_event('exception', attributes: event_attributes)
132
140
  end
133
141
 
134
142
  # Sets the Status to the Span
@@ -65,11 +65,6 @@ module OpenTelemetry
65
65
 
66
66
  # Adds a new SpanProcessor to this {Tracer}.
67
67
  #
68
- # Any registered processor causes overhead, consider to use an
69
- # async/batch processor especially for span exporting, and export to
70
- # multiple backends using the
71
- # {io.opentelemetry.sdk.trace.export.MultiSpanExporter}.
72
- #
73
68
  # @param span_processor the new SpanProcessor to be added.
74
69
  def add_span_processor(span_processor)
75
70
  @mutex.synchronize do
@@ -78,7 +73,11 @@ module OpenTelemetry
78
73
  return
79
74
  end
80
75
  @registered_span_processors << span_processor
81
- @active_span_processor = MultiSpanProcessor.new(@registered_span_processors.dup)
76
+ @active_span_processor = if @registered_span_processors.size == 1
77
+ span_processor
78
+ else
79
+ MultiSpanProcessor.new(@registered_span_processors.dup)
80
+ end
82
81
  end
83
82
  end
84
83
  end
@@ -7,6 +7,6 @@
7
7
  module OpenTelemetry
8
8
  module SDK
9
9
  ## Current OpenTelemetry version
10
- VERSION = '0.12.0'
10
+ VERSION = '0.15.0'
11
11
  end
12
12
  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.12.0
4
+ version: 0.15.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-12-24 00:00:00.000000000 Z
11
+ date: 2021-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.12.0
19
+ version: 0.15.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.12.0
26
+ version: 0.15.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: opentelemetry-common
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.12.0
33
+ version: 0.15.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.12.0
40
+ version: 0.15.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '5.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: opentelemetry-exporter-jaeger
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.15.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.15.0
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: rake
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -201,10 +215,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
201
215
  licenses:
202
216
  - Apache-2.0
203
217
  metadata:
204
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-sdk/v0.12.0/file.CHANGELOG.html
205
- source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/master/sdk
218
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-sdk/v0.15.0/file.CHANGELOG.html
219
+ source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/sdk
206
220
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
207
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-sdk/v0.12.0
221
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-sdk/v0.15.0
208
222
  post_install_message:
209
223
  rdoc_options: []
210
224
  require_paths: