opentelemetry-sdk 1.3.1 → 1.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a170a385c24de9a417323b40bee2d07f8040bdf2535e08ee4f5cf3ac5ce440c
4
- data.tar.gz: 8f2bf92d634725f8863e551522dc06e0ccb562e08b1741529cb1f3633cfd344b
3
+ metadata.gz: 83a673caf48821ecaaebd3bf954cc674b720eee1727eff03b5094ecd4338971c
4
+ data.tar.gz: 3fb2937947b640cc86e4ae7d56137bf4cf6683e4f11e378002a56ca8c45506d5
5
5
  SHA512:
6
- metadata.gz: 652201b97d3ff1f384a0f101f882d7dbf1cbc8ab6e402a75d3a029784cef5e655cda907df6066d69e2af511933a59323f430ede8903c442d2f267f7cd9c52ac8
7
- data.tar.gz: 91321cf005b589ffc0e2715d63ea03fad1369e8b3288a9f1493c3847e4f32077167d3cee31fc61fba35c6f8718bd5ac999e2ede13a521a8f6991eca6e7e393d9
6
+ metadata.gz: e3f0135a67fffcb1a50c8d7a639dcd9e02a2b7d8abe61ff9beb3553a2ed1e8d93fbbe08904b46fbbebaa0c913ae6acd3a88c93329168cf00be13f205511bc48f
7
+ data.tar.gz: 7197e47a5a52adabad0f651b3d7b7a9cc3f5b5f4792e64a20790efb69fc20315ab5fef322ff0798eb6e3ee6eb88e8b25429e5412657cc61fcb19496fbbe79de9
data/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Release History: opentelemetry-sdk
2
2
 
3
+ ### v1.4.0 / 2024-01-25
4
+
5
+ * ADDED: Add spans to Trace::ExportError
6
+
7
+ ### v1.3.2 / 2024-01-23
8
+
9
+ * FIXED: Reduce allocations on GraphQL hot paths
10
+ * FIXED: Add context to metrics reporting of buffer-full events
11
+
3
12
  ### v1.3.1 / 2023-11-02
4
13
 
5
14
  * FIXED: Spec compliance for span attribute limit
@@ -49,17 +49,17 @@ module OpenTelemetry
49
49
  end
50
50
 
51
51
  def valid_attributes?(owner, kind, attrs)
52
- attrs.nil? || attrs.all? do |k, v|
52
+ attrs.nil? || attrs.each do |k, v|
53
53
  if !valid_key?(k)
54
54
  OpenTelemetry.handle_error(message: "invalid #{kind} attribute key type #{k.class} on span '#{owner}'")
55
- false
55
+ return false
56
56
  elsif !valid_value?(v)
57
57
  OpenTelemetry.handle_error(message: "invalid #{kind} attribute value type #{v.class} for key '#{k}' on span '#{owner}'")
58
- false
59
- else
60
- true
58
+ return false
61
59
  end
62
60
  end
61
+
62
+ true
63
63
  end
64
64
  end
65
65
  end
@@ -81,8 +81,8 @@ module OpenTelemetry
81
81
  reset_on_fork
82
82
  n = spans.size + 1 - max_queue_size
83
83
  if n.positive?
84
- spans.shift(n)
85
- report_dropped_spans(n, reason: 'buffer-full')
84
+ dropped_spans = spans.shift(n)
85
+ report_dropped_spans(dropped_spans, reason: 'buffer-full', function: __method__.to_s)
86
86
  end
87
87
  spans << span
88
88
  @condition.signal if spans.size > batch_size
@@ -110,7 +110,7 @@ module OpenTelemetry
110
110
  remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time)
111
111
  return TIMEOUT if remaining_timeout&.zero?
112
112
 
113
- batch = snapshot.shift(@batch_size).map!(&:to_span_data)
113
+ batch = snapshot.shift(@batch_size)
114
114
  result_code = export_batch(batch, timeout: remaining_timeout)
115
115
  return result_code unless result_code == SUCCESS
116
116
  end
@@ -122,10 +122,10 @@ module OpenTelemetry
122
122
  lock do
123
123
  n = spans.size + snapshot.size - max_queue_size
124
124
  if n.positive?
125
- snapshot.shift(n)
126
- report_dropped_spans(n, reason: 'buffer-full')
125
+ dropped_spans = snapshot.shift(n)
126
+ report_dropped_spans(dropped_spans, reason: 'buffer-full', function: __method__.to_s)
127
127
  end
128
- spans.unshift(snapshot) unless snapshot.empty?
128
+ spans.unshift(*snapshot) unless snapshot.empty?
129
129
  @condition.signal if spans.size > max_queue_size / 2
130
130
  end
131
131
  end
@@ -146,8 +146,8 @@ module OpenTelemetry
146
146
 
147
147
  thread&.join(timeout)
148
148
  force_flush(timeout: OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time))
149
- dropped_spans = lock { spans.size }
150
- report_dropped_spans(dropped_spans, reason: 'terminating') if dropped_spans.positive?
149
+ dropped_spans = lock { spans.shift(spans.length) }
150
+ report_dropped_spans(dropped_spans, reason: 'terminating') if dropped_spans.any?
151
151
  @exporter.shutdown(timeout: OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time))
152
152
  end
153
153
 
@@ -162,7 +162,7 @@ module OpenTelemetry
162
162
  @condition.wait(@mutex, @delay_seconds) while spans.empty? && @keep_running
163
163
  return unless @keep_running
164
164
 
165
- fetch_batch
165
+ spans.shift(@batch_size)
166
166
  end
167
167
 
168
168
  @metrics_reporter.observe_value('otel.bsp.buffer_utilization', value: spans.size / max_queue_size.to_f)
@@ -183,33 +183,30 @@ module OpenTelemetry
183
183
  OpenTelemetry.handle_error(exception: e, message: 'unexpected error in BatchSpanProcessor#reset_on_fork')
184
184
  end
185
185
 
186
- def export_batch(batch, timeout: @exporter_timeout_seconds)
186
+ def export_batch(span_array, timeout: @exporter_timeout_seconds)
187
+ batch = span_array.map(&:to_span_data)
187
188
  result_code = @export_mutex.synchronize { @exporter.export(batch, timeout: timeout) }
188
- report_result(result_code, batch)
189
+ report_result(result_code, span_array)
189
190
  result_code
190
191
  rescue StandardError => e
191
- report_result(FAILURE, batch)
192
+ report_result(FAILURE, span_array)
192
193
  @metrics_reporter.add_to_counter('otel.bsp.error', labels: { 'reason' => e.class.to_s })
193
194
  FAILURE
194
195
  end
195
196
 
196
- def report_result(result_code, batch)
197
+ def report_result(result_code, span_array)
197
198
  if result_code == SUCCESS
198
199
  @metrics_reporter.add_to_counter('otel.bsp.export.success')
199
- @metrics_reporter.add_to_counter('otel.bsp.exported_spans', increment: batch.size)
200
+ @metrics_reporter.add_to_counter('otel.bsp.exported_spans', increment: span_array.size)
200
201
  else
201
- OpenTelemetry.handle_error(exception: ExportError.new("Unable to export #{batch.size} spans"))
202
+ OpenTelemetry.handle_error(exception: ExportError.new(span_array))
202
203
  @metrics_reporter.add_to_counter('otel.bsp.export.failure')
203
- report_dropped_spans(batch.size, reason: 'export-failure')
204
+ report_dropped_spans(span_array, reason: 'export-failure')
204
205
  end
205
206
  end
206
207
 
207
- def report_dropped_spans(count, reason:)
208
- @metrics_reporter.add_to_counter('otel.bsp.dropped_spans', increment: count, labels: { 'reason' => reason })
209
- end
210
-
211
- def fetch_batch
212
- spans.shift(@batch_size).map!(&:to_span_data)
208
+ def report_dropped_spans(dropped_spans, reason:, function: nil)
209
+ @metrics_reporter.add_to_counter('otel.bsp.dropped_spans', increment: dropped_spans.size, labels: { 'reason' => reason, OpenTelemetry::SemanticConventions::Trace::CODE_FUNCTION => function }.compact)
213
210
  end
214
211
 
215
212
  def lock
@@ -10,7 +10,19 @@ module OpenTelemetry
10
10
  # The Export module contains the built-in exporters and span processors for the OpenTelemetry
11
11
  # reference implementation.
12
12
  module Export
13
- ExportError = Class.new(OpenTelemetry::Error)
13
+ # Raised when an export fails; spans are available via :spans accessor
14
+ class ExportError < OpenTelemetry::Error
15
+ # Returns the {Span} array for this exception
16
+ #
17
+ # @return [Array<OpenTelemetry::SDK::Trace::Span>]
18
+ attr_reader :spans
19
+
20
+ # @param [Array<OpenTelemetry::SDK::Trace::Span>] spans the array of spans that failed to export
21
+ def initialize(spans)
22
+ super("Unable to export #{spans.size} spans")
23
+ @spans = spans
24
+ end
25
+ end
14
26
 
15
27
  # Result codes for the SpanExporter#export method and the SpanProcessor#force_flush and SpanProcessor#shutdown methods.
16
28
 
@@ -282,7 +282,7 @@ module OpenTelemetry
282
282
  end
283
283
 
284
284
  # @api private
285
- def initialize(context, parent_context, parent_span, name, kind, parent_span_id, span_limits, span_processors, attributes, links, start_timestamp, resource, instrumentation_scope) # rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
285
+ def initialize(context, parent_context, parent_span, name, kind, parent_span_id, span_limits, span_processors, attributes, links, start_timestamp, resource, instrumentation_scope) # rubocop:disable Metrics/MethodLength, Metrics/PerceivedComplexity
286
286
  super(span_context: context)
287
287
  @mutex = Mutex.new
288
288
  @name = name
@@ -297,7 +297,7 @@ module OpenTelemetry
297
297
  @total_recorded_events = 0
298
298
  @total_recorded_links = links&.size || 0
299
299
  @total_recorded_attributes = attributes&.size || 0
300
- @attributes = attributes.nil? ? nil : Hash[attributes] # We need a mutable copy of attributes.
300
+ @attributes = attributes
301
301
  trim_span_attributes(@attributes)
302
302
  @events = nil
303
303
  @links = trim_links(links, span_limits.link_count_limit, span_limits.link_attribute_count_limit)
@@ -317,7 +317,7 @@ module OpenTelemetry
317
317
  # SpanData.
318
318
  @monotonic_start_timestamp = monotonic_now
319
319
  @realtime_start_timestamp = if parent_span.recording?
320
- relative_realtime(parent_span.realtime_start_timestamp, parent_span.monotonic_start_timestamp)
320
+ relative_realtime(parent_span.realtime_start_timestamp, parent_span.monotonic_start_timestamp, @monotonic_start_timestamp)
321
321
  else
322
322
  realtime_now
323
323
  end
@@ -419,15 +419,15 @@ module OpenTelemetry
419
419
  def relative_timestamp(timestamp)
420
420
  return time_in_nanoseconds(timestamp) unless timestamp.nil?
421
421
 
422
- relative_realtime(realtime_start_timestamp, monotonic_start_timestamp)
422
+ relative_realtime(realtime_start_timestamp, monotonic_start_timestamp, monotonic_now)
423
423
  end
424
424
 
425
425
  def time_in_nanoseconds(timestamp)
426
426
  (timestamp.to_r * 1_000_000_000).to_i
427
427
  end
428
428
 
429
- def relative_realtime(realtime_base, monotonic_base)
430
- realtime_base + (monotonic_now - monotonic_base)
429
+ def relative_realtime(realtime_base, monotonic_base, now)
430
+ realtime_base + (now - monotonic_base)
431
431
  end
432
432
 
433
433
  def realtime_now
@@ -141,7 +141,7 @@ module OpenTelemetry
141
141
  if result.recording? && !@stopped
142
142
  trace_flags = result.sampled? ? OpenTelemetry::Trace::TraceFlags::SAMPLED : OpenTelemetry::Trace::TraceFlags::DEFAULT
143
143
  context = OpenTelemetry::Trace::SpanContext.new(trace_id: trace_id, span_id: span_id, trace_flags: trace_flags, tracestate: result.tracestate)
144
- attributes = attributes&.merge(result.attributes) || result.attributes
144
+ attributes = attributes&.merge(result.attributes) || result.attributes.dup
145
145
  Span.new(
146
146
  context,
147
147
  parent_context,
@@ -7,6 +7,6 @@
7
7
  module OpenTelemetry
8
8
  module SDK
9
9
  ## Current OpenTelemetry version
10
- VERSION = '1.3.1'
10
+ VERSION = '1.4.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: 1.3.1
4
+ version: 1.4.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: 2023-11-02 00:00:00.000000000 Z
11
+ date: 2024-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: opentelemetry-api
@@ -294,10 +294,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
294
294
  licenses:
295
295
  - Apache-2.0
296
296
  metadata:
297
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-sdk/v1.3.1/file.CHANGELOG.html
297
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-sdk/v1.4.0/file.CHANGELOG.html
298
298
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/sdk
299
299
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
300
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-sdk/v1.3.1
300
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-sdk/v1.4.0
301
301
  post_install_message:
302
302
  rdoc_options: []
303
303
  require_paths: