@@ -50,8 +50,9 @@ class Chunker
50
50
#
51
51
# @param encoder [Datadog::Core::Encoding::Encoder]
52
52
# @param max_size [String] maximum acceptable payload size
53
- def initialize ( encoder , max_size : DEFAULT_MAX_PAYLOAD_SIZE )
53
+ def initialize ( encoder , native_events_supported : , max_size : DEFAULT_MAX_PAYLOAD_SIZE )
54
54
@encoder = encoder
55
+ @native_events_supported = native_events_supported
55
56
@max_size = max_size
56
57
end
57
58
@@ -77,7 +78,7 @@ def encode_in_chunks(traces)
77
78
private
78
79
79
80
def encode_one ( trace )
80
- encoded = Encoder . encode_trace ( encoder , trace )
81
+ encoded = Encoder . encode_trace ( encoder , trace , native_events_supported : @native_events_supported )
81
82
82
83
if encoded . size > max_size
83
84
# This single trace is too large, we can't flush it
@@ -95,17 +96,18 @@ def encode_one(trace)
95
96
module Encoder
96
97
module_function
97
98
98
- def encode_trace ( encoder , trace )
99
+ def encode_trace ( encoder , trace , native_events_supported : )
99
100
# Format the trace for transport
100
101
TraceFormatter . format! ( trace )
101
102
102
103
# Make the trace serializable
103
- serializable_trace = SerializableTrace . new ( trace )
104
-
105
- Datadog . logger . debug { "Flushing trace: #{ JSON . dump ( serializable_trace ) } " }
104
+ serializable_trace = SerializableTrace . new ( trace , native_events_supported : native_events_supported )
106
105
107
106
# Encode the trace
108
- encoder . encode ( serializable_trace )
107
+ encoder . encode ( serializable_trace ) . tap do |encoded |
108
+ # Print the actual serialized trace, since the encoder can change make non-trivial changes
109
+ Datadog . logger . debug { "Flushing trace: #{ encoder . decode ( encoded ) } " }
110
+ end
109
111
end
110
112
end
111
113
@@ -126,7 +128,10 @@ def initialize(apis, default_api)
126
128
127
129
def send_traces ( traces )
128
130
encoder = current_api . encoder
129
- chunker = Datadog ::Tracing ::Transport ::Traces ::Chunker . new ( encoder )
131
+ chunker = Datadog ::Tracing ::Transport ::Traces ::Chunker . new (
132
+ encoder ,
133
+ native_events_supported : native_events_supported?
134
+ )
130
135
131
136
responses = chunker . encode_in_chunks ( traces . lazy ) . map do |encoded_traces , trace_count |
132
137
request = Request . new ( EncodedParcel . new ( encoded_traces , trace_count ) )
@@ -188,6 +193,18 @@ def change_api!(api_id)
188
193
@client = HTTP ::Client . new ( current_api )
189
194
end
190
195
196
+ # Queries the agent for native span events serialization support.
197
+ # This changes how the serialization of span events performed.
198
+ def native_events_supported?
199
+ return @native_events_supported if defined? ( @native_events_supported )
200
+
201
+ if ( res = Datadog . send ( :components ) . agent_info . fetch )
202
+ @native_events_supported = res . span_events == true
203
+ else
204
+ false
205
+ end
206
+ end
207
+
191
208
# Raised when configured with an unknown API version
192
209
class UnknownApiVersionError < StandardError
193
210
attr_reader :version
0 commit comments