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 +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/opentelemetry/sdk/internal.rb +5 -5
- data/lib/opentelemetry/sdk/trace/export/batch_span_processor.rb +19 -22
- data/lib/opentelemetry/sdk/trace/export.rb +13 -1
- data/lib/opentelemetry/sdk/trace/span.rb +6 -6
- data/lib/opentelemetry/sdk/trace/tracer_provider.rb +1 -1
- data/lib/opentelemetry/sdk/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83a673caf48821ecaaebd3bf954cc674b720eee1727eff03b5094ecd4338971c
|
4
|
+
data.tar.gz: 3fb2937947b640cc86e4ae7d56137bf4cf6683e4f11e378002a56ca8c45506d5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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(
|
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)
|
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(
|
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.
|
150
|
-
report_dropped_spans(dropped_spans, reason: 'terminating') if dropped_spans.
|
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
|
-
|
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(
|
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,
|
189
|
+
report_result(result_code, span_array)
|
189
190
|
result_code
|
190
191
|
rescue StandardError => e
|
191
|
-
report_result(FAILURE,
|
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,
|
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:
|
200
|
+
@metrics_reporter.add_to_counter('otel.bsp.exported_spans', increment: span_array.size)
|
200
201
|
else
|
201
|
-
OpenTelemetry.handle_error(exception: ExportError.new(
|
202
|
+
OpenTelemetry.handle_error(exception: ExportError.new(span_array))
|
202
203
|
@metrics_reporter.add_to_counter('otel.bsp.export.failure')
|
203
|
-
report_dropped_spans(
|
204
|
+
report_dropped_spans(span_array, reason: 'export-failure')
|
204
205
|
end
|
205
206
|
end
|
206
207
|
|
207
|
-
def report_dropped_spans(
|
208
|
-
@metrics_reporter.add_to_counter('otel.bsp.dropped_spans', increment:
|
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
|
-
|
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
|
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
|
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 + (
|
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,
|
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.
|
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:
|
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.
|
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.
|
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:
|