opentelemetry-sdk 1.3.1 → 1.4.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: 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: