datadog 2.44.0 → 2.46.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 +50 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +114 -141
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -5
- data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +0 -2
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +13 -13
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +5 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +1 -0
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +106 -103
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +3 -3
- data/ext/datadog_profiling_native_extension/extconf.rb +2 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +2 -2
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +102 -54
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +7 -2
- data/ext/datadog_profiling_native_extension/profiling.c +27 -23
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +3 -1
- data/ext/datadog_profiling_native_extension/ruby_helpers.h +4 -0
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +0 -2
- data/ext/datadog_profiling_native_extension/stack_recorder.c +6 -24
- data/ext/datadog_profiling_native_extension/stack_recorder.h +0 -1
- data/ext/datadog_profiling_native_extension/time_helpers.c +2 -4
- data/ext/datadog_profiling_native_extension/time_helpers.h +10 -11
- data/ext/libdatadog_api/di.c +30 -5
- data/ext/libdatadog_api/extconf.rb +2 -0
- data/ext/libdatadog_api/otel_thread_context.c +20 -14
- data/ext/libdatadog_api/process_discovery.c +15 -1
- data/ext/libdatadog_api/trace_exporter.c +182 -36
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/core/configuration/components.rb +29 -8
- data/lib/datadog/core/configuration/supported_configurations.rb +5 -2
- data/lib/datadog/core/process_discovery.rb +5 -1
- data/lib/datadog/core/remote/client/capabilities.rb +34 -29
- data/lib/datadog/core/remote/component.rb +28 -12
- data/lib/datadog/core/remote/dispatcher.rb +13 -3
- data/lib/datadog/di/boot.rb +1 -0
- data/lib/datadog/di/capture_expression_evaluator/result.rb +30 -0
- data/lib/datadog/di/capture_expression_evaluator.rb +39 -9
- data/lib/datadog/di/component.rb +38 -3
- data/lib/datadog/di/configuration.rb +53 -2
- data/lib/datadog/di/context.rb +7 -2
- data/lib/datadog/di/contrib/active_record.rb +8 -2
- data/lib/datadog/di/evaluation_failure.rb +28 -0
- data/lib/datadog/di/guardrails_telemetry/reason.rb +87 -0
- data/lib/datadog/di/guardrails_telemetry.rb +203 -0
- data/lib/datadog/di/instrumenter.rb +65 -15
- data/lib/datadog/di/logger.rb +30 -8
- data/lib/datadog/di/probe_manager.rb +48 -5
- data/lib/datadog/di/probe_notification_builder.rb +28 -26
- data/lib/datadog/di/probe_notifier_worker.rb +56 -6
- data/lib/datadog/di/serializer.rb +130 -54
- data/lib/datadog/di/snapshot_event.rb +38 -0
- data/lib/datadog/di/transport/http.rb +13 -3
- data/lib/datadog/di/transport/input.rb +32 -7
- data/lib/datadog/open_feature/activation.rb +268 -0
- data/lib/datadog/open_feature/component.rb +31 -15
- data/lib/datadog/open_feature/provider.rb +282 -5
- data/lib/datadog/open_feature.rb +31 -1
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +5 -0
- data/lib/datadog/profiling/component.rb +2 -3
- data/lib/datadog/profiling/exporter.rb +7 -5
- data/lib/datadog/tracing/component.rb +15 -1
- data/lib/datadog/tracing/configuration/settings.rb +6 -3
- data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -3
- data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -0
- data/lib/datadog/tracing/otel_thread_context.rb +3 -5
- data/lib/datadog/tracing/transport/http/telemetry.rb +94 -0
- data/lib/datadog/tracing/transport/http/traces.rb +2 -0
- data/lib/datadog/tracing/transport/native/telemetry.rb +17 -0
- data/lib/datadog/tracing/transport/native.rb +38 -22
- data/lib/datadog/tracing/transport/telemetry.rb +62 -0
- data/lib/datadog/tracing/transport/traces.rb +82 -15
- data/lib/datadog/version.rb +1 -1
- metadata +16 -7
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "net/http"
|
|
4
|
+
require_relative "../telemetry"
|
|
5
|
+
|
|
6
|
+
module Datadog
|
|
7
|
+
module Tracing
|
|
8
|
+
module Transport
|
|
9
|
+
module HTTP
|
|
10
|
+
class Telemetry < Datadog::Tracing::Transport::Telemetry
|
|
11
|
+
def initialize(client)
|
|
12
|
+
super(client, source: "ruby")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def batch(traces)
|
|
16
|
+
return unless @client.enabled? && @client.metrics_manager.enabled
|
|
17
|
+
|
|
18
|
+
Batch.new(self, traces)
|
|
19
|
+
rescue
|
|
20
|
+
nil
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class Batch
|
|
24
|
+
def initialize(reporter, traces)
|
|
25
|
+
@reporter = reporter
|
|
26
|
+
@remaining_chunks = traces.length
|
|
27
|
+
@remaining_spans = traces.sum(&:length)
|
|
28
|
+
@reporter.record(spans_enqueued_for_serialization: @remaining_spans)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def record_oversized_drop(span_count)
|
|
32
|
+
@remaining_chunks -= 1
|
|
33
|
+
@remaining_spans -= span_count
|
|
34
|
+
@reporter.record(chunks_dropped_payload_too_large: 1, spans_dropped_payload_too_large: span_count)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def serialization_failed
|
|
38
|
+
@reporter.record(chunks_dropped_serialization_error: @remaining_chunks,
|
|
39
|
+
spans_dropped_serialization_error: @remaining_spans,)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def sent(request, response, chunks, spans, bytes, fallback:)
|
|
43
|
+
@reporter.record(requests_count: 1)
|
|
44
|
+
return if fallback
|
|
45
|
+
|
|
46
|
+
@remaining_chunks -= chunks
|
|
47
|
+
@remaining_spans -= spans
|
|
48
|
+
observations = {} #: Hash[Symbol, Integer]
|
|
49
|
+
if (status = request.http_status)
|
|
50
|
+
observations[:responses_count] = 1
|
|
51
|
+
observations[:status_code] = status
|
|
52
|
+
end
|
|
53
|
+
success = status ? status.between?(200, 299) : request.http_success
|
|
54
|
+
if success
|
|
55
|
+
observations[:chunks_sent] = chunks
|
|
56
|
+
observations[:bytes_sent] = bytes
|
|
57
|
+
elsif status || success == false
|
|
58
|
+
observations[:errors_status_code] = 1 if status
|
|
59
|
+
observations[:chunks_dropped_send_failure] = chunks
|
|
60
|
+
observations[:spans_dropped_api_error] = spans
|
|
61
|
+
elsif response.is_a?(Core::Transport::InternalErrorResponse)
|
|
62
|
+
error = response.error
|
|
63
|
+
if error.is_a?(ArgumentError) || error.is_a?(TypeError)
|
|
64
|
+
observations[:chunks_dropped_serialization_error] = chunks
|
|
65
|
+
observations[:spans_dropped_serialization_error] = spans
|
|
66
|
+
else
|
|
67
|
+
observations[:chunks_dropped_send_failure] = chunks
|
|
68
|
+
observations[:spans_dropped_api_error] = spans
|
|
69
|
+
if error.is_a?(::Timeout::Error) || error.is_a?(Errno::ETIMEDOUT)
|
|
70
|
+
observations[:errors_timeout] = 1
|
|
71
|
+
elsif network_error?(error)
|
|
72
|
+
observations[:errors_network] = 1
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
@reporter.record(observations)
|
|
77
|
+
rescue
|
|
78
|
+
nil
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
private
|
|
82
|
+
|
|
83
|
+
def network_error?(error)
|
|
84
|
+
error.is_a?(SystemCallError) || error.is_a?(IOError) || error.is_a?(SocketError) ||
|
|
85
|
+
error.is_a?(::Net::ProtocolError) || error.is_a?(::Net::HTTPBadResponse) ||
|
|
86
|
+
error.is_a?(::Net::HTTPHeaderSyntaxError) ||
|
|
87
|
+
(defined?(::OpenSSL::SSL::SSLError) && error.is_a?(::OpenSSL::SSL::SSLError))
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -51,6 +51,8 @@ module Datadog
|
|
|
51
51
|
|
|
52
52
|
# Query for response
|
|
53
53
|
http_response = super
|
|
54
|
+
# Delivery succeeded or failed before service-rate parsing can raise.
|
|
55
|
+
env.request.capture_status(http_response)
|
|
54
56
|
|
|
55
57
|
# Process the response
|
|
56
58
|
response_options = {trace_count: env.request.parcel.trace_count}.tap do |options|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../telemetry"
|
|
4
|
+
|
|
5
|
+
module Datadog
|
|
6
|
+
module Tracing
|
|
7
|
+
module Transport
|
|
8
|
+
module Native
|
|
9
|
+
class Telemetry < Datadog::Tracing::Transport::Telemetry
|
|
10
|
+
def initialize(client)
|
|
11
|
+
super(client, source: "libdatadog")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -4,6 +4,7 @@ require "json"
|
|
|
4
4
|
require_relative "trace_formatter"
|
|
5
5
|
require_relative "statistics"
|
|
6
6
|
require_relative "span_events_negotiation"
|
|
7
|
+
require_relative "native/telemetry"
|
|
7
8
|
|
|
8
9
|
module Datadog
|
|
9
10
|
module Tracing
|
|
@@ -47,10 +48,20 @@ module Datadog
|
|
|
47
48
|
include Statistics
|
|
48
49
|
include SpanEventsNegotiation
|
|
49
50
|
|
|
50
|
-
attr_reader :logger
|
|
51
|
+
attr_reader :logger, :url
|
|
52
|
+
|
|
53
|
+
def telemetry=(client)
|
|
54
|
+
@send_mutex.synchronize do
|
|
55
|
+
if (reporter = @telemetry)
|
|
56
|
+
reporter.client = client
|
|
57
|
+
elsif @exporter
|
|
58
|
+
@telemetry = Telemetry.new(client)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
51
62
|
|
|
52
63
|
# @param agent_settings [Datadog::Core::Configuration::AgentSettingsResolver::AgentSettings]
|
|
53
|
-
# Agent connection settings
|
|
64
|
+
# Agent connection settings, including the request timeout.
|
|
54
65
|
# @param logger [Logger]
|
|
55
66
|
def initialize(agent_settings:, logger:)
|
|
56
67
|
unless Native.supported?
|
|
@@ -58,6 +69,7 @@ module Datadog
|
|
|
58
69
|
end
|
|
59
70
|
|
|
60
71
|
@logger = logger
|
|
72
|
+
@telemetry = nil
|
|
61
73
|
|
|
62
74
|
# Serializes native sends and is held across a fork. See the
|
|
63
75
|
# fork-safety note below.
|
|
@@ -67,7 +79,7 @@ module Datadog
|
|
|
67
79
|
# this is held across the fork through the matching completion hook.
|
|
68
80
|
@fork_mutex = Mutex.new
|
|
69
81
|
|
|
70
|
-
url = agent_settings.url
|
|
82
|
+
@url = agent_settings.url
|
|
71
83
|
tracer_version = tracer_version_string
|
|
72
84
|
language = Core::Environment::Ext::LANG
|
|
73
85
|
language_version = Core::Environment::Ext::LANG_VERSION
|
|
@@ -83,6 +95,7 @@ module Datadog
|
|
|
83
95
|
|
|
84
96
|
exporter = Native::TraceExporter._native_new(
|
|
85
97
|
url: url,
|
|
98
|
+
timeout_milliseconds: agent_settings.timeout_seconds * 1000,
|
|
86
99
|
tracer_version: tracer_version,
|
|
87
100
|
language: language,
|
|
88
101
|
language_version: language_version,
|
|
@@ -90,7 +103,8 @@ module Datadog
|
|
|
90
103
|
hostname: hostname,
|
|
91
104
|
env: env,
|
|
92
105
|
service: service,
|
|
93
|
-
version: version
|
|
106
|
+
version: version,
|
|
107
|
+
client_computed_stats: !Datadog.configuration.apm.tracing.enabled
|
|
94
108
|
)
|
|
95
109
|
@exporter = exporter
|
|
96
110
|
|
|
@@ -215,25 +229,25 @@ module Datadog
|
|
|
215
229
|
# native exporter so its runtime can shut down. Idempotent: safe to
|
|
216
230
|
# call multiple times and safe to call after the finalizer has run.
|
|
217
231
|
def close
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
232
|
+
@fork_mutex.synchronize do
|
|
233
|
+
@send_mutex.synchronize do
|
|
234
|
+
hooks = @fork_hooks
|
|
235
|
+
return if hooks.nil?
|
|
236
|
+
|
|
237
|
+
begin
|
|
238
|
+
@exporter&._native_close
|
|
239
|
+
ensure
|
|
240
|
+
@fork_hooks = nil
|
|
241
|
+
@telemetry = nil
|
|
242
|
+
@exporter = nil
|
|
243
|
+
hooks.each do |stage, block|
|
|
244
|
+
Core::Utils::AtForkMonkeyPatch.remove_at_fork(stage, block)
|
|
245
|
+
end
|
|
246
|
+
ObjectSpace.undefine_finalizer(self)
|
|
247
|
+
end
|
|
248
|
+
end
|
|
229
249
|
end
|
|
230
250
|
|
|
231
|
-
# The finalizer only exists to deregister the hooks for a transport
|
|
232
|
-
# dropped without #close. We have just done that, so remove it;
|
|
233
|
-
# otherwise its closed-over hook blocks keep the exporter alive until
|
|
234
|
-
# this transport is itself collected.
|
|
235
|
-
ObjectSpace.undefine_finalizer(self)
|
|
236
|
-
|
|
237
251
|
nil
|
|
238
252
|
end
|
|
239
253
|
|
|
@@ -284,7 +298,9 @@ module Datadog
|
|
|
284
298
|
exporter = @exporter
|
|
285
299
|
raise "Native transport has been closed" if exporter.nil?
|
|
286
300
|
|
|
287
|
-
exporter._native_send_traces(chunks, native_events_supported)
|
|
301
|
+
exporter._native_send_traces(chunks, native_events_supported) do |observations|
|
|
302
|
+
@telemetry&.record(observations)
|
|
303
|
+
end
|
|
288
304
|
end
|
|
289
305
|
|
|
290
306
|
# Update statistics from the response
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Datadog
|
|
4
|
+
module Tracing
|
|
5
|
+
module Transport
|
|
6
|
+
class Telemetry
|
|
7
|
+
# Observation schema: Symbol keys with non-negative Integer values.
|
|
8
|
+
# COUNTS maps per-send count deltas to [metric name, additional tags].
|
|
9
|
+
# :bytes_sent is one successful payload's byte-size distribution sample;
|
|
10
|
+
# record each payload separately rather than summing its samples.
|
|
11
|
+
# :responses_count requires :status_code; omit both when the code is unknown.
|
|
12
|
+
# Missing and zero measurements emit nothing. All metrics use namespace
|
|
13
|
+
# "tracers" and common: true; trace_* metrics gain src_library:<source>, while
|
|
14
|
+
# span metrics keep their source-free tags.
|
|
15
|
+
COUNTS = {
|
|
16
|
+
requests_count: ["trace_api.requests", []],
|
|
17
|
+
errors_network: ["trace_api.errors", ["type:network"]],
|
|
18
|
+
errors_timeout: ["trace_api.errors", ["type:timeout"]],
|
|
19
|
+
errors_status_code: ["trace_api.errors", ["type:status_code"]],
|
|
20
|
+
chunks_sent: ["trace_chunks_sent", []],
|
|
21
|
+
chunks_dropped_serialization_error: ["trace_chunks_dropped", ["reason:serialization_error"]],
|
|
22
|
+
chunks_dropped_send_failure: ["trace_chunks_dropped", ["reason:send_failure"]],
|
|
23
|
+
chunks_dropped_payload_too_large: ["trace_chunks_dropped", ["reason:payload_too_large"]],
|
|
24
|
+
spans_enqueued_for_serialization: ["spans_enqueued_for_serialization", []],
|
|
25
|
+
spans_dropped_serialization_error: ["spans_dropped", ["reason:serialization_error"]],
|
|
26
|
+
spans_dropped_api_error: ["spans_dropped", ["reason:api_error"]],
|
|
27
|
+
spans_dropped_payload_too_large: ["spans_dropped", ["reason:payload_too_large"]],
|
|
28
|
+
}.freeze #: Hash[Symbol, [String, Array[String]]]
|
|
29
|
+
|
|
30
|
+
attr_writer :client
|
|
31
|
+
|
|
32
|
+
def initialize(client, source:)
|
|
33
|
+
@client = client
|
|
34
|
+
@source_tags = ["src_library:#{source}"]
|
|
35
|
+
@counts = COUNTS.map do |key, (name, tags)|
|
|
36
|
+
[key, name, name.start_with?("trace_") ? @source_tags + tags : tags]
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def record(observations)
|
|
41
|
+
client = @client
|
|
42
|
+
return unless client.enabled?
|
|
43
|
+
|
|
44
|
+
@counts.each do |key, name, tags|
|
|
45
|
+
value = observations.fetch(key, 0)
|
|
46
|
+
client.inc("tracers", name, value, tags: tags) if value > 0
|
|
47
|
+
end
|
|
48
|
+
bytes = observations.fetch(:bytes_sent, 0)
|
|
49
|
+
client.distribution("tracers", "trace_api.bytes", bytes, tags: @source_tags) if bytes > 0
|
|
50
|
+
responses = observations.fetch(:responses_count, 0)
|
|
51
|
+
if responses > 0
|
|
52
|
+
client.inc("tracers", "trace_api.responses", responses,
|
|
53
|
+
tags: @source_tags + ["status_code:#{observations.fetch(:status_code)}"],)
|
|
54
|
+
end
|
|
55
|
+
nil
|
|
56
|
+
rescue
|
|
57
|
+
nil
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -6,6 +6,7 @@ require_relative "../../core/transport/request"
|
|
|
6
6
|
require_relative "../../core/transport/transport"
|
|
7
7
|
require_relative "../../core/utils/enumerable_compat"
|
|
8
8
|
require_relative "http/client"
|
|
9
|
+
require_relative "http/telemetry"
|
|
9
10
|
require_relative "serializable_trace"
|
|
10
11
|
require_relative "span_events_negotiation"
|
|
11
12
|
require_relative "trace_formatter"
|
|
@@ -26,6 +27,30 @@ module Datadog
|
|
|
26
27
|
|
|
27
28
|
# Traces request
|
|
28
29
|
class Request < Datadog::Core::Transport::Request
|
|
30
|
+
attr_reader :http_status, :http_success
|
|
31
|
+
attr_writer :capture_telemetry
|
|
32
|
+
|
|
33
|
+
def initialize(parcel = nil)
|
|
34
|
+
super
|
|
35
|
+
@http_status = nil
|
|
36
|
+
@http_success = nil
|
|
37
|
+
@capture_telemetry = false
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Built-in adapters return integer codes. Custom status inspection is
|
|
41
|
+
# best-effort: telemetry must not change trace delivery.
|
|
42
|
+
def capture_status(response)
|
|
43
|
+
return unless @capture_telemetry
|
|
44
|
+
|
|
45
|
+
if response.respond_to?(:code)
|
|
46
|
+
code = response.code
|
|
47
|
+
@http_status = code if code.is_a?(Integer) && code.between?(100, 999)
|
|
48
|
+
end
|
|
49
|
+
@http_success = response.ok? if @http_status.nil? && response.respond_to?(:ok?)
|
|
50
|
+
nil
|
|
51
|
+
rescue
|
|
52
|
+
nil
|
|
53
|
+
end
|
|
29
54
|
end
|
|
30
55
|
|
|
31
56
|
# Traces response
|
|
@@ -48,44 +73,65 @@ module Datadog
|
|
|
48
73
|
#
|
|
49
74
|
# @param encoder [Datadog::Core::Encoding::Encoder]
|
|
50
75
|
# @param logger [Datadog::Core::Logger]
|
|
51
|
-
# @param
|
|
52
|
-
|
|
76
|
+
# @param native_events_supported [Boolean] whether to encode native span events
|
|
77
|
+
# @param max_size [Integer] maximum acceptable payload size in bytes
|
|
78
|
+
# @param telemetry [HTTP::Telemetry::Batch, nil] optional per-send accounting batch
|
|
79
|
+
def initialize(encoder, logger:, native_events_supported:, max_size: DEFAULT_MAX_PAYLOAD_SIZE, telemetry: nil)
|
|
53
80
|
@encoder = encoder
|
|
54
81
|
@logger = logger
|
|
55
82
|
@native_events_supported = native_events_supported
|
|
56
83
|
@max_size = max_size
|
|
84
|
+
@batch = telemetry
|
|
57
85
|
end
|
|
58
86
|
|
|
59
87
|
# Encodes a list of traces in chunks.
|
|
60
88
|
# Before serializing, all traces are normalized. Trace nesting is not changed.
|
|
61
89
|
#
|
|
62
90
|
# @param traces [Enumerable<Trace>] list of traces
|
|
63
|
-
# @return [Enumerable
|
|
64
|
-
#
|
|
91
|
+
# @return [Enumerable<Array>] tuples of encoded bytes and trace count,
|
|
92
|
+
# plus span count when telemetry accounting is enabled
|
|
65
93
|
def encode_in_chunks(traces)
|
|
94
|
+
span_counts = [] if @batch
|
|
66
95
|
encoded_traces = Core::Utils::EnumerableCompat.filter_map(traces) do |trace|
|
|
67
|
-
encode_one(trace)
|
|
96
|
+
encoded = encode_one(trace)
|
|
97
|
+
span_counts << trace.length if encoded && span_counts
|
|
98
|
+
encoded
|
|
68
99
|
end
|
|
69
100
|
|
|
70
101
|
Datadog::Core::Chunker.chunk_by_size(encoded_traces, max_size).map do |chunk|
|
|
71
|
-
[
|
|
102
|
+
payload = [join(chunk), chunk.size]
|
|
103
|
+
payload << span_counts.shift(chunk.size).sum if span_counts
|
|
104
|
+
payload
|
|
72
105
|
end
|
|
73
106
|
end
|
|
74
107
|
|
|
75
108
|
private
|
|
76
109
|
|
|
110
|
+
def join(chunk)
|
|
111
|
+
encoder.join(chunk)
|
|
112
|
+
rescue
|
|
113
|
+
@batch&.serialization_failed
|
|
114
|
+
raise
|
|
115
|
+
end
|
|
116
|
+
|
|
77
117
|
def encode_one(trace)
|
|
78
|
-
encoded =
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
118
|
+
encoded = begin
|
|
119
|
+
Encoder.encode_trace(
|
|
120
|
+
encoder,
|
|
121
|
+
trace,
|
|
122
|
+
logger: logger,
|
|
123
|
+
native_events_supported: @native_events_supported
|
|
124
|
+
)
|
|
125
|
+
rescue
|
|
126
|
+
@batch&.serialization_failed
|
|
127
|
+
raise
|
|
128
|
+
end
|
|
84
129
|
|
|
85
130
|
if encoded.size > max_size
|
|
86
131
|
# This single trace is too large, we can't flush it
|
|
87
132
|
logger.debug { "Dropping trace. Payload too large: '#{trace.inspect}'" }
|
|
88
133
|
Datadog.health_metrics.transport_trace_too_large(1)
|
|
134
|
+
@batch&.record_oversized_drop(trace.length)
|
|
89
135
|
|
|
90
136
|
return nil
|
|
91
137
|
end
|
|
@@ -122,19 +168,40 @@ module Datadog
|
|
|
122
168
|
include SpanEventsNegotiation
|
|
123
169
|
self.http_client_class = Tracing::Transport::HTTP::Client
|
|
124
170
|
|
|
171
|
+
def initialize(apis, default_api, logger:)
|
|
172
|
+
super
|
|
173
|
+
@reporter = nil
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Reconfiguration can retain this transport, so rebind its reporter to
|
|
177
|
+
# the new telemetry client. Each later send creates its own accounting batch.
|
|
178
|
+
def telemetry=(telemetry_client)
|
|
179
|
+
if (reporter = @reporter)
|
|
180
|
+
reporter.client = telemetry_client
|
|
181
|
+
else
|
|
182
|
+
@reporter = HTTP::Telemetry.new(telemetry_client)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
125
186
|
def send_traces(traces)
|
|
126
187
|
encoder = current_api.encoder
|
|
188
|
+
native_events_supported = native_events_supported?
|
|
189
|
+
batch = @reporter&.batch(traces)
|
|
127
190
|
chunker = Datadog::Tracing::Transport::Traces::Chunker.new(
|
|
128
191
|
encoder,
|
|
129
192
|
logger: logger,
|
|
130
|
-
native_events_supported: native_events_supported
|
|
193
|
+
native_events_supported: native_events_supported,
|
|
194
|
+
telemetry: batch,
|
|
131
195
|
)
|
|
132
196
|
|
|
133
|
-
responses = chunker.encode_in_chunks(traces.lazy).map do |encoded_traces, trace_count|
|
|
197
|
+
responses = chunker.encode_in_chunks(traces.lazy).map do |encoded_traces, trace_count, span_count|
|
|
134
198
|
request = Request.new(Parcel.new(encoded_traces, trace_count: trace_count))
|
|
199
|
+
request.capture_telemetry = true if batch
|
|
135
200
|
|
|
136
201
|
client.send_request(:traces, request).tap do |response|
|
|
137
|
-
|
|
202
|
+
fallback = downgrade?(response)
|
|
203
|
+
batch&.sent(request, response, trace_count, span_count, encoded_traces.bytesize, fallback: fallback)
|
|
204
|
+
if fallback
|
|
138
205
|
downgrade!
|
|
139
206
|
return send_traces(traces)
|
|
140
207
|
end
|
data/lib/datadog/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: datadog
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.46.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Datadog, Inc.
|
|
@@ -32,7 +32,7 @@ dependencies:
|
|
|
32
32
|
version: '3.5'
|
|
33
33
|
- - ">="
|
|
34
34
|
- !ruby/object:Gem::Version
|
|
35
|
-
version: 3.5.
|
|
35
|
+
version: 3.5.6
|
|
36
36
|
type: :runtime
|
|
37
37
|
prerelease: false
|
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -42,7 +42,7 @@ dependencies:
|
|
|
42
42
|
version: '3.5'
|
|
43
43
|
- - ">="
|
|
44
44
|
- !ruby/object:Gem::Version
|
|
45
|
-
version: 3.5.
|
|
45
|
+
version: 3.5.6
|
|
46
46
|
- !ruby/object:Gem::Dependency
|
|
47
47
|
name: libddwaf
|
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -63,14 +63,14 @@ dependencies:
|
|
|
63
63
|
requirements:
|
|
64
64
|
- - "~>"
|
|
65
65
|
- !ruby/object:Gem::Version
|
|
66
|
-
version:
|
|
66
|
+
version: 46.0.0.1.1
|
|
67
67
|
type: :runtime
|
|
68
68
|
prerelease: false
|
|
69
69
|
version_requirements: !ruby/object:Gem::Requirement
|
|
70
70
|
requirements:
|
|
71
71
|
- - "~>"
|
|
72
72
|
- !ruby/object:Gem::Version
|
|
73
|
-
version:
|
|
73
|
+
version: 46.0.0.1.1
|
|
74
74
|
- !ruby/object:Gem::Dependency
|
|
75
75
|
name: logger
|
|
76
76
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -536,6 +536,7 @@ files:
|
|
|
536
536
|
- lib/datadog/di/boot.rb
|
|
537
537
|
- lib/datadog/di/capture_expression.rb
|
|
538
538
|
- lib/datadog/di/capture_expression_evaluator.rb
|
|
539
|
+
- lib/datadog/di/capture_expression_evaluator/result.rb
|
|
539
540
|
- lib/datadog/di/capture_limits.rb
|
|
540
541
|
- lib/datadog/di/code_tracker.rb
|
|
541
542
|
- lib/datadog/di/component.rb
|
|
@@ -549,8 +550,11 @@ files:
|
|
|
549
550
|
- lib/datadog/di/el/evaluator.rb
|
|
550
551
|
- lib/datadog/di/el/expression.rb
|
|
551
552
|
- lib/datadog/di/error.rb
|
|
553
|
+
- lib/datadog/di/evaluation_failure.rb
|
|
552
554
|
- lib/datadog/di/extensions.rb
|
|
553
555
|
- lib/datadog/di/fatal_exceptions.rb
|
|
556
|
+
- lib/datadog/di/guardrails_telemetry.rb
|
|
557
|
+
- lib/datadog/di/guardrails_telemetry/reason.rb
|
|
554
558
|
- lib/datadog/di/instrumenter.rb
|
|
555
559
|
- lib/datadog/di/logger.rb
|
|
556
560
|
- lib/datadog/di/preload.rb
|
|
@@ -566,6 +570,7 @@ files:
|
|
|
566
570
|
- lib/datadog/di/redactor.rb
|
|
567
571
|
- lib/datadog/di/remote.rb
|
|
568
572
|
- lib/datadog/di/serializer.rb
|
|
573
|
+
- lib/datadog/di/snapshot_event.rb
|
|
569
574
|
- lib/datadog/di/transport/diagnostics.rb
|
|
570
575
|
- lib/datadog/di/transport/http.rb
|
|
571
576
|
- lib/datadog/di/transport/http/diagnostics.rb
|
|
@@ -586,6 +591,7 @@ files:
|
|
|
586
591
|
- lib/datadog/kit/identity.rb
|
|
587
592
|
- lib/datadog/kit/tracing/method_tracer.rb
|
|
588
593
|
- lib/datadog/open_feature.rb
|
|
594
|
+
- lib/datadog/open_feature/activation.rb
|
|
589
595
|
- lib/datadog/open_feature/agentless/configuration_source.rb
|
|
590
596
|
- lib/datadog/open_feature/agentless/parser.rb
|
|
591
597
|
- lib/datadog/open_feature/agentless/response.rb
|
|
@@ -1168,6 +1174,7 @@ files:
|
|
|
1168
1174
|
- lib/datadog/tracing/transport/http.rb
|
|
1169
1175
|
- lib/datadog/tracing/transport/http/client.rb
|
|
1170
1176
|
- lib/datadog/tracing/transport/http/statistics.rb
|
|
1177
|
+
- lib/datadog/tracing/transport/http/telemetry.rb
|
|
1171
1178
|
- lib/datadog/tracing/transport/http/traces.rb
|
|
1172
1179
|
- lib/datadog/tracing/transport/io.rb
|
|
1173
1180
|
- lib/datadog/tracing/transport/io/client.rb
|
|
@@ -1175,9 +1182,11 @@ files:
|
|
|
1175
1182
|
- lib/datadog/tracing/transport/io/traces.rb
|
|
1176
1183
|
- lib/datadog/tracing/transport/native.rb
|
|
1177
1184
|
- lib/datadog/tracing/transport/native/response.rb
|
|
1185
|
+
- lib/datadog/tracing/transport/native/telemetry.rb
|
|
1178
1186
|
- lib/datadog/tracing/transport/serializable_trace.rb
|
|
1179
1187
|
- lib/datadog/tracing/transport/span_events_negotiation.rb
|
|
1180
1188
|
- lib/datadog/tracing/transport/statistics.rb
|
|
1189
|
+
- lib/datadog/tracing/transport/telemetry.rb
|
|
1181
1190
|
- lib/datadog/tracing/transport/trace_formatter.rb
|
|
1182
1191
|
- lib/datadog/tracing/transport/traces.rb
|
|
1183
1192
|
- lib/datadog/tracing/utils.rb
|
|
@@ -1190,8 +1199,8 @@ licenses:
|
|
|
1190
1199
|
- Apache-2.0
|
|
1191
1200
|
metadata:
|
|
1192
1201
|
allowed_push_host: https://rubygems.org
|
|
1193
|
-
changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.
|
|
1194
|
-
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.
|
|
1202
|
+
changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.46.0/CHANGELOG.md
|
|
1203
|
+
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.46.0
|
|
1195
1204
|
post_install_message: 'JRuby support in the datadog gem is deprecated. Details: https://dtdg.co/jruby-deprecation'
|
|
1196
1205
|
rdoc_options: []
|
|
1197
1206
|
require_paths:
|