datadog 2.23.0 → 2.24.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 +44 -2
- data/ext/datadog_profiling_native_extension/collectors_stack.c +17 -5
- data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +239 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +4 -1
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +12 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +4 -0
- data/ext/datadog_profiling_native_extension/profiling.c +2 -0
- data/lib/datadog/appsec/context.rb +2 -1
- data/lib/datadog/appsec/remote.rb +1 -9
- data/lib/datadog/appsec/security_engine/result.rb +2 -1
- data/lib/datadog/core/configuration/config_helper.rb +1 -1
- data/lib/datadog/core/configuration/deprecations.rb +2 -2
- data/lib/datadog/core/configuration/option_definition.rb +4 -2
- data/lib/datadog/core/configuration/options.rb +8 -5
- data/lib/datadog/core/configuration/settings.rb +14 -3
- data/lib/datadog/core/configuration/supported_configurations.rb +2 -1
- data/lib/datadog/core/environment/cgroup.rb +52 -25
- data/lib/datadog/core/environment/container.rb +140 -46
- data/lib/datadog/core/environment/ext.rb +1 -0
- data/lib/datadog/core/environment/process.rb +9 -1
- data/lib/datadog/core/rate_limiter.rb +9 -1
- data/lib/datadog/core/remote/client.rb +14 -6
- data/lib/datadog/core/remote/component.rb +6 -4
- data/lib/datadog/core/remote/configuration/content.rb +15 -2
- data/lib/datadog/core/remote/configuration/digest.rb +14 -7
- data/lib/datadog/core/remote/configuration/repository.rb +1 -1
- data/lib/datadog/core/remote/configuration/target.rb +13 -6
- data/lib/datadog/core/remote/transport/config.rb +3 -16
- data/lib/datadog/core/remote/transport/http/config.rb +4 -44
- data/lib/datadog/core/remote/transport/http/negotiation.rb +0 -39
- data/lib/datadog/core/remote/transport/http.rb +13 -24
- data/lib/datadog/core/remote/transport/negotiation.rb +7 -16
- data/lib/datadog/core/telemetry/component.rb +52 -13
- data/lib/datadog/core/telemetry/event/app_started.rb +34 -0
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/metrics_manager.rb +9 -0
- data/lib/datadog/core/telemetry/request.rb +17 -3
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +2 -32
- data/lib/datadog/core/telemetry/transport/http.rb +21 -16
- data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -10
- data/lib/datadog/core/telemetry/worker.rb +88 -32
- data/lib/datadog/core/transport/ext.rb +2 -0
- data/lib/datadog/core/transport/http/api/endpoint.rb +9 -4
- data/lib/datadog/core/transport/http/api/instance.rb +4 -21
- data/lib/datadog/core/transport/http/builder.rb +9 -5
- data/lib/datadog/core/transport/http/client.rb +19 -8
- data/lib/datadog/core/transport/http.rb +22 -19
- data/lib/datadog/core/transport/response.rb +9 -0
- data/lib/datadog/core/transport/transport.rb +90 -0
- data/lib/datadog/core/utils/only_once_successful.rb +2 -0
- data/lib/datadog/core/utils/time.rb +1 -1
- data/lib/datadog/core/workers/async.rb +10 -1
- data/lib/datadog/core/workers/interval_loop.rb +44 -3
- data/lib/datadog/core/workers/polling.rb +2 -0
- data/lib/datadog/core/workers/queue.rb +100 -1
- data/lib/datadog/data_streams/processor.rb +1 -1
- data/lib/datadog/data_streams/transport/http/stats.rb +1 -36
- data/lib/datadog/data_streams/transport/http.rb +5 -6
- data/lib/datadog/data_streams/transport/stats.rb +3 -17
- data/lib/datadog/di/contrib/active_record.rb +31 -5
- data/lib/datadog/di/el/compiler.rb +8 -4
- data/lib/datadog/di/error.rb +5 -0
- data/lib/datadog/di/instrumenter.rb +17 -4
- data/lib/datadog/di/probe_builder.rb +2 -1
- data/lib/datadog/di/probe_manager.rb +37 -31
- data/lib/datadog/di/probe_notification_builder.rb +15 -2
- data/lib/datadog/di/remote.rb +89 -84
- data/lib/datadog/di/transport/diagnostics.rb +7 -35
- data/lib/datadog/di/transport/http/diagnostics.rb +1 -31
- data/lib/datadog/di/transport/http/input.rb +1 -31
- data/lib/datadog/di/transport/http.rb +28 -17
- data/lib/datadog/di/transport/input.rb +7 -34
- data/lib/datadog/di.rb +61 -5
- data/lib/datadog/open_feature/evaluation_engine.rb +2 -1
- data/lib/datadog/open_feature/remote.rb +3 -10
- data/lib/datadog/open_feature/transport.rb +9 -11
- data/lib/datadog/opentelemetry/api/baggage.rb +1 -1
- data/lib/datadog/opentelemetry/configuration/settings.rb +2 -2
- data/lib/datadog/opentelemetry/metrics.rb +21 -14
- data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +5 -8
- data/lib/datadog/profiling/collectors/code_provenance.rb +27 -2
- data/lib/datadog/profiling/collectors/info.rb +2 -1
- data/lib/datadog/profiling/component.rb +12 -11
- data/lib/datadog/profiling/http_transport.rb +4 -1
- data/lib/datadog/tracing/contrib/extensions.rb +10 -2
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +31 -32
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +2 -1
- data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +3 -1
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +6 -3
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
- data/lib/datadog/tracing/remote.rb +1 -9
- data/lib/datadog/tracing/span_event.rb +2 -2
- data/lib/datadog/tracing/span_operation.rb +9 -4
- data/lib/datadog/tracing/trace_operation.rb +44 -6
- data/lib/datadog/tracing/tracer.rb +42 -16
- data/lib/datadog/tracing/transport/http/traces.rb +2 -50
- data/lib/datadog/tracing/transport/http.rb +15 -9
- data/lib/datadog/tracing/transport/io/client.rb +1 -1
- data/lib/datadog/tracing/transport/traces.rb +6 -66
- data/lib/datadog/tracing/workers/trace_writer.rb +5 -0
- data/lib/datadog/tracing/writer.rb +1 -0
- data/lib/datadog/version.rb +2 -2
- metadata +7 -13
- data/lib/datadog/core/remote/transport/http/api.rb +0 -53
- data/lib/datadog/core/telemetry/transport/http/api.rb +0 -43
- data/lib/datadog/core/transport/http/api/spec.rb +0 -36
- data/lib/datadog/data_streams/transport/http/api.rb +0 -33
- data/lib/datadog/data_streams/transport/http/client.rb +0 -21
- data/lib/datadog/di/transport/http/api.rb +0 -42
- data/lib/datadog/opentelemetry/api/baggage.rbs +0 -26
- data/lib/datadog/tracing/transport/http/api.rb +0 -44
|
@@ -55,6 +55,12 @@ module Datadog
|
|
|
55
55
|
:sampled,
|
|
56
56
|
:service
|
|
57
57
|
|
|
58
|
+
# Creates a new TraceOperation.
|
|
59
|
+
#
|
|
60
|
+
# @param auto_finish [Boolean] when true, automatically finishes the trace when the local root span finishes.
|
|
61
|
+
# When false, the trace remains unfinished until {#finish!} is called.
|
|
62
|
+
# This is useful when this {TraceOperation} represents the continuation of a remote {TraceDigest},
|
|
63
|
+
# in which case local root spans in this {TraceOperation} are children of the {TraceDigest}'s last active span.
|
|
58
64
|
def initialize(
|
|
59
65
|
logger: Datadog.logger,
|
|
60
66
|
agent_sample_rate: nil,
|
|
@@ -80,7 +86,8 @@ module Datadog
|
|
|
80
86
|
trace_state_unknown_fields: nil,
|
|
81
87
|
remote_parent: false,
|
|
82
88
|
tracer: nil, # DEV-3.0: deprecated, remove in 3.0
|
|
83
|
-
baggage: nil
|
|
89
|
+
baggage: nil,
|
|
90
|
+
auto_finish: true
|
|
84
91
|
)
|
|
85
92
|
@logger = logger
|
|
86
93
|
|
|
@@ -119,6 +126,7 @@ module Datadog
|
|
|
119
126
|
@events = events || Events.new
|
|
120
127
|
@finished = false
|
|
121
128
|
@spans = []
|
|
129
|
+
@auto_finish = !!auto_finish
|
|
122
130
|
end
|
|
123
131
|
|
|
124
132
|
def full?
|
|
@@ -318,6 +326,29 @@ module Datadog
|
|
|
318
326
|
build_trace(spans, !finished)
|
|
319
327
|
end
|
|
320
328
|
|
|
329
|
+
# When automatic context management is disabled (@auto_finish is false),
|
|
330
|
+
# this method finishes the trace, marking it as completed.
|
|
331
|
+
#
|
|
332
|
+
# The trace will **not** automatically finish when its local root span
|
|
333
|
+
# when @auto_finish is false, thus calling this method is mandatory
|
|
334
|
+
# in such scenario.
|
|
335
|
+
#
|
|
336
|
+
# Unfinished spans are discarded.
|
|
337
|
+
#
|
|
338
|
+
# This method is idempotent and safe to call after the trace is finished.
|
|
339
|
+
# It is also a no-op when @auto_finish is true, to prevent misuse.
|
|
340
|
+
#
|
|
341
|
+
# @!visibility private
|
|
342
|
+
def finish!
|
|
343
|
+
return if @auto_finish || finished?
|
|
344
|
+
|
|
345
|
+
@finished = true
|
|
346
|
+
@active_span = nil
|
|
347
|
+
@active_span_count = 0
|
|
348
|
+
|
|
349
|
+
events.trace_finished.publish(self)
|
|
350
|
+
end
|
|
351
|
+
|
|
321
352
|
# Returns a set of trace headers used for continuing traces.
|
|
322
353
|
# Used for propagation across execution contexts.
|
|
323
354
|
# Data should reflect the active state of the trace.
|
|
@@ -460,7 +491,7 @@ module Datadog
|
|
|
460
491
|
|
|
461
492
|
@active_span = span_op
|
|
462
493
|
|
|
463
|
-
|
|
494
|
+
set_local_root_span!(span_op)
|
|
464
495
|
end
|
|
465
496
|
|
|
466
497
|
def deactivate_span!(span_op)
|
|
@@ -483,6 +514,12 @@ module Datadog
|
|
|
483
514
|
logger.debug { "Error starting span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
|
484
515
|
end
|
|
485
516
|
|
|
517
|
+
# For traces with automatic context management (auto_finish),
|
|
518
|
+
# when the local root span finishes, the trace also finishes.
|
|
519
|
+
# The trace cannot receive new spans after finished.
|
|
520
|
+
#
|
|
521
|
+
# Without auto_finish, the trace can still receive spans
|
|
522
|
+
# until explicitly finished.
|
|
486
523
|
def finish_span(span, span_op, parent)
|
|
487
524
|
# Save finished span & root span
|
|
488
525
|
@spans << span unless span.nil?
|
|
@@ -490,8 +527,9 @@ module Datadog
|
|
|
490
527
|
# Deactivate the span, re-activate parent.
|
|
491
528
|
deactivate_span!(span_op)
|
|
492
529
|
|
|
493
|
-
#
|
|
494
|
-
|
|
530
|
+
# Finish if the local root span is finished and automatic
|
|
531
|
+
# context management is enabled.
|
|
532
|
+
@finished = true if span_op == root_span && @auto_finish
|
|
495
533
|
|
|
496
534
|
# Update active span count
|
|
497
535
|
@active_span_count -= 1
|
|
@@ -505,8 +543,8 @@ module Datadog
|
|
|
505
543
|
logger.debug { "Error finishing span on trace: #{e} Backtrace: #{e.backtrace.first(3)}" }
|
|
506
544
|
end
|
|
507
545
|
|
|
508
|
-
# Track the root
|
|
509
|
-
def
|
|
546
|
+
# Track the root {SpanOperation} object from the current execution context.
|
|
547
|
+
def set_local_root_span!(span)
|
|
510
548
|
return if span.nil? || root_span
|
|
511
549
|
|
|
512
550
|
@root_span = span
|
|
@@ -129,7 +129,6 @@ module Datadog
|
|
|
129
129
|
# @yield Optional block where new newly created {Datadog::Tracing::SpanOperation} captures the execution.
|
|
130
130
|
# @yieldparam [Datadog::Tracing::SpanOperation] span_op the newly created and active [Datadog::Tracing::SpanOperation]
|
|
131
131
|
# @yieldparam [Datadog::Tracing::TraceOperation] trace_op the active [Datadog::Tracing::TraceOperation]
|
|
132
|
-
# rubocop:disable Metrics/MethodLength
|
|
133
132
|
def trace(
|
|
134
133
|
name,
|
|
135
134
|
continue_from: nil,
|
|
@@ -241,10 +240,21 @@ module Datadog
|
|
|
241
240
|
trace.to_correlation
|
|
242
241
|
end
|
|
243
242
|
|
|
244
|
-
# Setup a new trace to continue from where another
|
|
243
|
+
# Setup a new trace execution context to continue from where another
|
|
245
244
|
# trace left off.
|
|
245
|
+
# This is useful to continue distributed or async traces.
|
|
246
246
|
#
|
|
247
|
-
#
|
|
247
|
+
# The first span created in the restored context is a direct child of the
|
|
248
|
+
# active span from when the {Datadog::Tracing::TraceDigest} was created.
|
|
249
|
+
#
|
|
250
|
+
# When no block is given, the trace context is restored in the current thread.
|
|
251
|
+
# It remains active until the first span created in this restored context is finished.
|
|
252
|
+
# After that, if a new span is created, it start a new, unrelated trace.
|
|
253
|
+
#
|
|
254
|
+
# When a block is given, the trace context is restored inside the block execution.
|
|
255
|
+
# It remains active until the block ends, even when the first span created inside
|
|
256
|
+
# the block finishes. This means that multiple spans can be direct children of the
|
|
257
|
+
# active span from when the {Datadog::Tracing::TraceDigest} was created.
|
|
248
258
|
#
|
|
249
259
|
# @param [Datadog::Tracing::TraceDigest] digest continue from the {Datadog::Tracing::TraceDigest}.
|
|
250
260
|
# @param [Thread] key Thread to retrieve trace from. Defaults to current thread. For internal use only.
|
|
@@ -260,13 +270,32 @@ module Datadog
|
|
|
260
270
|
# Start a new trace from the digest
|
|
261
271
|
context = call_context(key)
|
|
262
272
|
original_trace = active_trace(key)
|
|
263
|
-
trace
|
|
273
|
+
# When we want the trace to be bound to a block, we cannot let
|
|
274
|
+
# it auto finish when the local root span finishes. This would
|
|
275
|
+
# create mutiple traces inside the block. Instead, we'll
|
|
276
|
+
# expliclity finish the trace after the block finishes.
|
|
277
|
+
auto_finish = !block
|
|
278
|
+
|
|
279
|
+
trace = start_trace(continue_from: digest, auto_finish: auto_finish)
|
|
264
280
|
|
|
265
281
|
# If block hasn't been given; we need to manually deactivate
|
|
266
282
|
# this trace. Subscribe to the trace finished event to do this.
|
|
267
283
|
subscribe_trace_deactivation!(context, trace, original_trace) unless block
|
|
268
284
|
|
|
269
|
-
|
|
285
|
+
if block
|
|
286
|
+
# When a block is given, the trace will be active until the block finishes.
|
|
287
|
+
context.activate!(trace) do
|
|
288
|
+
yield
|
|
289
|
+
ensure # We have to flush even when an error occurs
|
|
290
|
+
# On block completion, force the trace to finish and flush its finished spans.
|
|
291
|
+
# Unfinished spans are lost as the {TraceOperation} has ended.
|
|
292
|
+
trace.finish!
|
|
293
|
+
flush_trace(trace)
|
|
294
|
+
end
|
|
295
|
+
else
|
|
296
|
+
# Otherwise, the trace will be bound to the current thread after this point
|
|
297
|
+
context.activate!(trace)
|
|
298
|
+
end
|
|
270
299
|
end
|
|
271
300
|
|
|
272
301
|
# Sample a span, tagging the trace as appropriate.
|
|
@@ -329,7 +358,7 @@ module Datadog
|
|
|
329
358
|
@provider.context(key)
|
|
330
359
|
end
|
|
331
360
|
|
|
332
|
-
def build_trace(digest
|
|
361
|
+
def build_trace(digest, auto_finish)
|
|
333
362
|
# Resolve hostname if configured
|
|
334
363
|
hostname = Core::Environment::Socket.hostname if Datadog.configuration.tracing.report_hostname
|
|
335
364
|
hostname = (hostname && !hostname.empty?) ? hostname : nil
|
|
@@ -353,7 +382,8 @@ module Datadog
|
|
|
353
382
|
trace_state_unknown_fields: digest.trace_state_unknown_fields,
|
|
354
383
|
remote_parent: digest.span_remote,
|
|
355
384
|
tracer: self,
|
|
356
|
-
baggage: digest.baggage
|
|
385
|
+
baggage: digest.baggage,
|
|
386
|
+
auto_finish: auto_finish
|
|
357
387
|
)
|
|
358
388
|
else
|
|
359
389
|
TraceOperation.new(
|
|
@@ -362,13 +392,12 @@ module Datadog
|
|
|
362
392
|
profiling_enabled: profiling_enabled,
|
|
363
393
|
apm_tracing_enabled: apm_tracing_enabled,
|
|
364
394
|
remote_parent: false,
|
|
365
|
-
tracer: self
|
|
395
|
+
tracer: self,
|
|
396
|
+
auto_finish: auto_finish
|
|
366
397
|
)
|
|
367
398
|
end
|
|
368
399
|
end
|
|
369
|
-
# rubocop:enable Metrics/MethodLength
|
|
370
400
|
|
|
371
|
-
# rubocop:disable Metrics/MethodLength
|
|
372
401
|
def bind_trace_events!(trace_op)
|
|
373
402
|
events = trace_op.send(:events)
|
|
374
403
|
|
|
@@ -387,13 +416,12 @@ module Datadog
|
|
|
387
416
|
flush_trace(event_trace_op)
|
|
388
417
|
end
|
|
389
418
|
end
|
|
390
|
-
# rubocop:enable Metrics/MethodLength
|
|
391
419
|
|
|
392
420
|
# Creates a new TraceOperation, with events bounds to this Tracer instance.
|
|
393
421
|
# @return [TraceOperation]
|
|
394
|
-
def start_trace(continue_from: nil)
|
|
422
|
+
def start_trace(continue_from: nil, auto_finish: true)
|
|
395
423
|
# Build a new trace using digest if provided.
|
|
396
|
-
trace = build_trace(continue_from)
|
|
424
|
+
trace = build_trace(continue_from, auto_finish)
|
|
397
425
|
|
|
398
426
|
# Bind trace events: sample trace, set default service, flush spans.
|
|
399
427
|
bind_trace_events!(trace)
|
|
@@ -402,7 +430,6 @@ module Datadog
|
|
|
402
430
|
end
|
|
403
431
|
|
|
404
432
|
# rubocop:disable Lint/UnderscorePrefixedVariableName
|
|
405
|
-
# rubocop:disable Metrics/MethodLength
|
|
406
433
|
def start_span(
|
|
407
434
|
name,
|
|
408
435
|
continue_from: nil,
|
|
@@ -454,9 +481,8 @@ module Datadog
|
|
|
454
481
|
span
|
|
455
482
|
end
|
|
456
483
|
end
|
|
457
|
-
# rubocop:enable Lint/UnderscorePrefixedVariableName
|
|
458
|
-
# rubocop:enable Metrics/MethodLength
|
|
459
484
|
|
|
485
|
+
# rubocop:enable Lint/UnderscorePrefixedVariableName
|
|
460
486
|
def resolve_tags(tags, service)
|
|
461
487
|
merged_tags = if @tags.any? && tags
|
|
462
488
|
# Combine default tags with provided tags,
|
|
@@ -2,12 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
require 'json'
|
|
4
4
|
|
|
5
|
-
require_relative '../traces'
|
|
6
|
-
require_relative 'client'
|
|
7
5
|
require_relative '../../../core/transport/http/response'
|
|
8
6
|
require_relative '../../../core/transport/http/api/endpoint'
|
|
9
|
-
require_relative '../../../core/transport/http/api/spec'
|
|
10
7
|
require_relative '../../../core/transport/http/api/instance'
|
|
8
|
+
require_relative '../traces'
|
|
11
9
|
|
|
12
10
|
module Datadog
|
|
13
11
|
module Tracing
|
|
@@ -27,58 +25,15 @@ module Datadog
|
|
|
27
25
|
end
|
|
28
26
|
end
|
|
29
27
|
|
|
30
|
-
# Extensions for HTTP client
|
|
31
|
-
module Client
|
|
32
|
-
def send_traces_payload(request)
|
|
33
|
-
send_request(request) do |api, env|
|
|
34
|
-
api.send_traces(env)
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
|
|
39
28
|
module API
|
|
40
|
-
# HTTP API Spec
|
|
41
|
-
class Spec < Core::Transport::HTTP::API::Spec
|
|
42
|
-
attr_accessor :traces
|
|
43
|
-
|
|
44
|
-
def send_traces(env, &block)
|
|
45
|
-
raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('traces', self) if traces.nil?
|
|
46
|
-
|
|
47
|
-
traces.call(env, &block)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def encoder
|
|
51
|
-
traces.encoder
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# HTTP API Instance
|
|
56
|
-
class Instance < Core::Transport::HTTP::API::Instance
|
|
57
|
-
def send_traces(env)
|
|
58
|
-
unless spec.is_a?(Traces::API::Spec)
|
|
59
|
-
raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new(
|
|
60
|
-
'traces', self
|
|
61
|
-
)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
spec.send_traces(env) do |request_env|
|
|
65
|
-
call(request_env)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
29
|
# Endpoint for submitting trace data
|
|
71
30
|
class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
|
|
72
31
|
HEADER_CONTENT_TYPE = 'Content-Type'
|
|
73
32
|
HEADER_TRACE_COUNT = 'X-Datadog-Trace-Count'
|
|
74
33
|
SERVICE_RATE_KEY = 'rate_by_service'
|
|
75
34
|
|
|
76
|
-
attr_reader \
|
|
77
|
-
:encoder
|
|
78
|
-
|
|
79
35
|
def initialize(path, encoder, options = {})
|
|
80
|
-
super(:post, path)
|
|
81
|
-
@encoder = encoder
|
|
36
|
+
super(:post, path, encoder: encoder)
|
|
82
37
|
@service_rates = options.fetch(:service_rates, false)
|
|
83
38
|
end
|
|
84
39
|
|
|
@@ -111,9 +66,6 @@ module Datadog
|
|
|
111
66
|
end
|
|
112
67
|
end
|
|
113
68
|
end
|
|
114
|
-
|
|
115
|
-
# Add traces behavior to transport components
|
|
116
|
-
HTTP::Client.include(Traces::Client)
|
|
117
69
|
end
|
|
118
70
|
end
|
|
119
71
|
end
|
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative '../../core/encoding'
|
|
3
4
|
require_relative '../../core/environment/container'
|
|
4
5
|
require_relative '../../core/environment/ext'
|
|
5
6
|
require_relative '../../core/transport/ext'
|
|
6
7
|
require_relative '../../core/transport/http'
|
|
7
|
-
require_relative 'http/
|
|
8
|
-
require_relative '../../../datadog/version'
|
|
8
|
+
require_relative 'http/traces'
|
|
9
9
|
|
|
10
10
|
module Datadog
|
|
11
11
|
module Tracing
|
|
12
12
|
module Transport
|
|
13
13
|
# Namespace for HTTP transport components
|
|
14
14
|
module HTTP
|
|
15
|
+
V4 = Traces::API::Endpoint.new(
|
|
16
|
+
'/v0.4/traces',
|
|
17
|
+
Core::Encoding::MsgpackEncoder,
|
|
18
|
+
service_rates: true
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
V3 = Traces::API::Endpoint.new(
|
|
22
|
+
'/v0.3/traces',
|
|
23
|
+
Core::Encoding::MsgpackEncoder,
|
|
24
|
+
)
|
|
25
|
+
|
|
15
26
|
module_function
|
|
16
27
|
|
|
17
28
|
# Builds a new Transport::HTTP::Client with default settings
|
|
@@ -19,20 +30,15 @@ module Datadog
|
|
|
19
30
|
def default(
|
|
20
31
|
agent_settings:,
|
|
21
32
|
logger: Datadog.logger,
|
|
22
|
-
api_version: nil,
|
|
23
33
|
headers: nil
|
|
24
34
|
)
|
|
25
35
|
Core::Transport::HTTP.build(
|
|
26
|
-
api_instance_class: Traces::API::Instance,
|
|
27
36
|
agent_settings: agent_settings,
|
|
28
37
|
logger: logger,
|
|
29
|
-
api_version: api_version,
|
|
30
38
|
headers: headers
|
|
31
39
|
) do |transport|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
transport.api API::V4, apis[API::V4], fallback: API::V3, default: true
|
|
35
|
-
transport.api API::V3, apis[API::V3]
|
|
40
|
+
transport.api 'v0.4', V4, fallback: 'v0.3', default: true
|
|
41
|
+
transport.api 'v0.3', V3
|
|
36
42
|
|
|
37
43
|
# Call block to apply any customization, if provided
|
|
38
44
|
yield(transport) if block_given?
|
|
@@ -42,7 +42,7 @@ module Datadog
|
|
|
42
42
|
response
|
|
43
43
|
rescue => e
|
|
44
44
|
message =
|
|
45
|
-
"Internal error during IO transport request. Cause: #{e.class.name} #{e.message} " \
|
|
45
|
+
"Internal error during IO transport request. Cause: #{e.class.name}: #{e.message} " \
|
|
46
46
|
"Location: #{Array(e.backtrace).first}"
|
|
47
47
|
|
|
48
48
|
# Log error
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
require_relative '../../core/chunker'
|
|
4
4
|
require_relative '../../core/transport/parcel'
|
|
5
5
|
require_relative '../../core/transport/request'
|
|
6
|
+
require_relative '../../core/transport/transport'
|
|
6
7
|
require_relative '../../core/utils/array'
|
|
8
|
+
require_relative 'http/client'
|
|
7
9
|
require_relative 'serializable_trace'
|
|
8
10
|
require_relative 'trace_formatter'
|
|
9
11
|
|
|
@@ -121,16 +123,8 @@ module Datadog
|
|
|
121
123
|
# This class initializes the HTTP client, breaks down large
|
|
122
124
|
# batches of traces into smaller chunks and handles
|
|
123
125
|
# API version downgrade handshake.
|
|
124
|
-
class Transport
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
def initialize(apis, default_api, logger: Datadog.logger)
|
|
128
|
-
@apis = apis
|
|
129
|
-
@default_api = default_api
|
|
130
|
-
@logger = logger
|
|
131
|
-
|
|
132
|
-
change_api!(default_api)
|
|
133
|
-
end
|
|
126
|
+
class Transport < Core::Transport::Transport
|
|
127
|
+
self.http_client_class = Tracing::Transport::HTTP::Client
|
|
134
128
|
|
|
135
129
|
def send_traces(traces)
|
|
136
130
|
encoder = current_api.encoder
|
|
@@ -143,7 +137,7 @@ module Datadog
|
|
|
143
137
|
responses = chunker.encode_in_chunks(traces.lazy).map do |encoded_traces, trace_count|
|
|
144
138
|
request = Request.new(EncodedParcel.new(encoded_traces, trace_count))
|
|
145
139
|
|
|
146
|
-
client.
|
|
140
|
+
client.send_request(:traces, request).tap do |response|
|
|
147
141
|
if downgrade?(response)
|
|
148
142
|
downgrade!
|
|
149
143
|
return send_traces(traces)
|
|
@@ -171,35 +165,11 @@ module Datadog
|
|
|
171
165
|
end
|
|
172
166
|
|
|
173
167
|
def stats
|
|
174
|
-
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
def current_api
|
|
178
|
-
apis[@current_api_id]
|
|
168
|
+
client.stats
|
|
179
169
|
end
|
|
180
170
|
|
|
181
171
|
private
|
|
182
172
|
|
|
183
|
-
def downgrade?(response)
|
|
184
|
-
return false unless apis.fallbacks.key?(@current_api_id)
|
|
185
|
-
|
|
186
|
-
response.not_found? || response.unsupported?
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
def downgrade!
|
|
190
|
-
downgrade_api_id = apis.fallbacks[@current_api_id]
|
|
191
|
-
raise NoDowngradeAvailableError, @current_api_id if downgrade_api_id.nil?
|
|
192
|
-
|
|
193
|
-
change_api!(downgrade_api_id)
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def change_api!(api_id)
|
|
197
|
-
raise UnknownApiVersionError, api_id unless apis.key?(api_id)
|
|
198
|
-
|
|
199
|
-
@current_api_id = api_id
|
|
200
|
-
@client = HTTP::Client.new(current_api, logger: logger)
|
|
201
|
-
end
|
|
202
|
-
|
|
203
173
|
# Queries the agent for native span events serialization support.
|
|
204
174
|
# This changes how the serialization of span events performed.
|
|
205
175
|
def native_events_supported?
|
|
@@ -219,36 +189,6 @@ module Datadog
|
|
|
219
189
|
false
|
|
220
190
|
end
|
|
221
191
|
end
|
|
222
|
-
|
|
223
|
-
# Raised when configured with an unknown API version
|
|
224
|
-
class UnknownApiVersionError < StandardError
|
|
225
|
-
attr_reader :version
|
|
226
|
-
|
|
227
|
-
def initialize(version)
|
|
228
|
-
super
|
|
229
|
-
|
|
230
|
-
@version = version
|
|
231
|
-
end
|
|
232
|
-
|
|
233
|
-
def message
|
|
234
|
-
"No matching transport API for version #{version}!"
|
|
235
|
-
end
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
# Raised when configured with an unknown API version
|
|
239
|
-
class NoDowngradeAvailableError < StandardError
|
|
240
|
-
attr_reader :version
|
|
241
|
-
|
|
242
|
-
def initialize(version)
|
|
243
|
-
super
|
|
244
|
-
|
|
245
|
-
@version = version
|
|
246
|
-
end
|
|
247
|
-
|
|
248
|
-
def message
|
|
249
|
-
"No downgrade from transport API version #{version} is available!"
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
192
|
end
|
|
253
193
|
end
|
|
254
194
|
end
|
|
@@ -21,6 +21,8 @@ module Datadog
|
|
|
21
21
|
:transport,
|
|
22
22
|
:agent_settings
|
|
23
23
|
|
|
24
|
+
# DEV-3.0: change to keyword arguments
|
|
25
|
+
#
|
|
24
26
|
# rubocop:disable Lint/MissingSuper
|
|
25
27
|
def initialize(options = {})
|
|
26
28
|
@logger = options[:logger] || Datadog.logger
|
|
@@ -143,6 +145,9 @@ module Datadog
|
|
|
143
145
|
|
|
144
146
|
# Are there more traces to be processed next?
|
|
145
147
|
def work_pending?
|
|
148
|
+
# This is the same implementation as in Queue, but it was
|
|
149
|
+
# overwritten by IntervalLoop on its way to this worker class.
|
|
150
|
+
# See the comments in those two methods for more info.
|
|
146
151
|
!buffer.empty?
|
|
147
152
|
end
|
|
148
153
|
|
data/lib/datadog/version.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Datadog
|
|
4
4
|
module VERSION
|
|
5
5
|
MAJOR = 2
|
|
6
|
-
MINOR =
|
|
6
|
+
MINOR = 24
|
|
7
7
|
PATCH = 0
|
|
8
8
|
PRE = nil
|
|
9
9
|
BUILD = nil
|
|
@@ -21,6 +21,6 @@ module Datadog
|
|
|
21
21
|
# To allow testing with the next unreleased version of Ruby, the version check is performed
|
|
22
22
|
# as `< #{MAXIMUM_RUBY_VERSION}`, meaning prereleases of MAXIMUM_RUBY_VERSION are allowed
|
|
23
23
|
# but not stable MAXIMUM_RUBY_VERSION releases.
|
|
24
|
-
MAXIMUM_RUBY_VERSION = '4.
|
|
24
|
+
MAXIMUM_RUBY_VERSION = '4.1'
|
|
25
25
|
end
|
|
26
26
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: datadog
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.24.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Datadog, Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2026-01-08 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: msgpack
|
|
@@ -139,6 +139,7 @@ files:
|
|
|
139
139
|
- ext/datadog_profiling_native_extension/collectors_stack.h
|
|
140
140
|
- ext/datadog_profiling_native_extension/collectors_thread_context.c
|
|
141
141
|
- ext/datadog_profiling_native_extension/collectors_thread_context.h
|
|
142
|
+
- ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c
|
|
142
143
|
- ext/datadog_profiling_native_extension/datadog_ruby_common.c
|
|
143
144
|
- ext/datadog_profiling_native_extension/datadog_ruby_common.h
|
|
144
145
|
- ext/datadog_profiling_native_extension/encoded_profile.c
|
|
@@ -374,7 +375,6 @@ files:
|
|
|
374
375
|
- lib/datadog/core/remote/tie/tracing.rb
|
|
375
376
|
- lib/datadog/core/remote/transport/config.rb
|
|
376
377
|
- lib/datadog/core/remote/transport/http.rb
|
|
377
|
-
- lib/datadog/core/remote/transport/http/api.rb
|
|
378
378
|
- lib/datadog/core/remote/transport/http/config.rb
|
|
379
379
|
- lib/datadog/core/remote/transport/http/negotiation.rb
|
|
380
380
|
- lib/datadog/core/remote/transport/negotiation.rb
|
|
@@ -409,7 +409,6 @@ files:
|
|
|
409
409
|
- lib/datadog/core/telemetry/metrics_manager.rb
|
|
410
410
|
- lib/datadog/core/telemetry/request.rb
|
|
411
411
|
- lib/datadog/core/telemetry/transport/http.rb
|
|
412
|
-
- lib/datadog/core/telemetry/transport/http/api.rb
|
|
413
412
|
- lib/datadog/core/telemetry/transport/http/telemetry.rb
|
|
414
413
|
- lib/datadog/core/telemetry/transport/telemetry.rb
|
|
415
414
|
- lib/datadog/core/telemetry/worker.rb
|
|
@@ -423,7 +422,6 @@ files:
|
|
|
423
422
|
- lib/datadog/core/transport/http/api/fallbacks.rb
|
|
424
423
|
- lib/datadog/core/transport/http/api/instance.rb
|
|
425
424
|
- lib/datadog/core/transport/http/api/map.rb
|
|
426
|
-
- lib/datadog/core/transport/http/api/spec.rb
|
|
427
425
|
- lib/datadog/core/transport/http/builder.rb
|
|
428
426
|
- lib/datadog/core/transport/http/client.rb
|
|
429
427
|
- lib/datadog/core/transport/http/env.rb
|
|
@@ -431,6 +429,7 @@ files:
|
|
|
431
429
|
- lib/datadog/core/transport/parcel.rb
|
|
432
430
|
- lib/datadog/core/transport/request.rb
|
|
433
431
|
- lib/datadog/core/transport/response.rb
|
|
432
|
+
- lib/datadog/core/transport/transport.rb
|
|
434
433
|
- lib/datadog/core/utils.rb
|
|
435
434
|
- lib/datadog/core/utils/array.rb
|
|
436
435
|
- lib/datadog/core/utils/at_fork_monkey_patch.rb
|
|
@@ -469,8 +468,6 @@ files:
|
|
|
469
468
|
- lib/datadog/data_streams/pathway_context.rb
|
|
470
469
|
- lib/datadog/data_streams/processor.rb
|
|
471
470
|
- lib/datadog/data_streams/transport/http.rb
|
|
472
|
-
- lib/datadog/data_streams/transport/http/api.rb
|
|
473
|
-
- lib/datadog/data_streams/transport/http/client.rb
|
|
474
471
|
- lib/datadog/data_streams/transport/http/stats.rb
|
|
475
472
|
- lib/datadog/data_streams/transport/stats.rb
|
|
476
473
|
- lib/datadog/di.rb
|
|
@@ -506,7 +503,6 @@ files:
|
|
|
506
503
|
- lib/datadog/di/serializer.rb
|
|
507
504
|
- lib/datadog/di/transport/diagnostics.rb
|
|
508
505
|
- lib/datadog/di/transport/http.rb
|
|
509
|
-
- lib/datadog/di/transport/http/api.rb
|
|
510
506
|
- lib/datadog/di/transport/http/diagnostics.rb
|
|
511
507
|
- lib/datadog/di/transport/http/input.rb
|
|
512
508
|
- lib/datadog/di/transport/input.rb
|
|
@@ -543,7 +539,6 @@ files:
|
|
|
543
539
|
- lib/datadog/open_feature/transport.rb
|
|
544
540
|
- lib/datadog/opentelemetry.rb
|
|
545
541
|
- lib/datadog/opentelemetry/api/baggage.rb
|
|
546
|
-
- lib/datadog/opentelemetry/api/baggage.rbs
|
|
547
542
|
- lib/datadog/opentelemetry/api/context.rb
|
|
548
543
|
- lib/datadog/opentelemetry/api/trace/span.rb
|
|
549
544
|
- lib/datadog/opentelemetry/configuration/settings.rb
|
|
@@ -1060,7 +1055,6 @@ files:
|
|
|
1060
1055
|
- lib/datadog/tracing/trace_segment.rb
|
|
1061
1056
|
- lib/datadog/tracing/tracer.rb
|
|
1062
1057
|
- lib/datadog/tracing/transport/http.rb
|
|
1063
|
-
- lib/datadog/tracing/transport/http/api.rb
|
|
1064
1058
|
- lib/datadog/tracing/transport/http/client.rb
|
|
1065
1059
|
- lib/datadog/tracing/transport/http/statistics.rb
|
|
1066
1060
|
- lib/datadog/tracing/transport/http/traces.rb
|
|
@@ -1083,8 +1077,8 @@ licenses:
|
|
|
1083
1077
|
- Apache-2.0
|
|
1084
1078
|
metadata:
|
|
1085
1079
|
allowed_push_host: https://rubygems.org
|
|
1086
|
-
changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.
|
|
1087
|
-
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.
|
|
1080
|
+
changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.24.0/CHANGELOG.md
|
|
1081
|
+
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.24.0
|
|
1088
1082
|
post_install_message:
|
|
1089
1083
|
rdoc_options: []
|
|
1090
1084
|
require_paths:
|
|
@@ -1096,7 +1090,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
1096
1090
|
version: 2.5.0
|
|
1097
1091
|
- - "<"
|
|
1098
1092
|
- !ruby/object:Gem::Version
|
|
1099
|
-
version: '4.
|
|
1093
|
+
version: '4.1'
|
|
1100
1094
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1101
1095
|
requirements:
|
|
1102
1096
|
- - ">="
|