Skip to content

Commit 5075b3c

Browse files
committed
Gracefully handle sidecar broken pipes
This now reconnects immediately, gracefully restoring telemetry and remote config state (i.e. resending service / env etc. tags), making sure the queue_id exists on the sidecar side. This should avoid significant data loss scenarios and infinite broken pipe loops. Signed-off-by: Bob Weinand <bob.weinand@datadoghq.com>
1 parent dc8ab47 commit 5075b3c

9 files changed

Lines changed: 234 additions & 82 deletions

File tree

components-rs/ddtrace.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ void ddog_sidecar_enable_appsec(ddog_CharSlice shared_lib_path,
228228
ddog_MaybeError ddog_sidecar_connect_php(struct ddog_SidecarTransport **connection,
229229
const char *error_path,
230230
ddog_CharSlice log_level,
231-
bool enable_telemetry);
231+
bool enable_telemetry,
232+
void (*on_reconnect)(struct ddog_SidecarTransport*));
232233

233234
void ddtrace_sidecar_reconnect(struct ddog_SidecarTransport **transport,
234235
struct ddog_SidecarTransport *(*factory)(void));

components-rs/sidecar.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,8 @@ void ddog_send_traces_to_sidecar(ddog_TracesBytes *traces,
354354
*/
355355
void ddog_drop_agent_info_reader(struct ddog_AgentInfoReader*);
356356

357+
void ddog_sidecar_send_garbage(struct ddog_SidecarTransport **transport);
358+
357359
ddog_TracesBytes *ddog_get_traces(void);
358360

359361
void ddog_free_traces(ddog_TracesBytes *_traces);

components-rs/sidecar.rs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,22 @@ pub extern "C" fn ddog_sidecar_enable_appsec(
101101
});
102102
}
103103

104+
fn sidecar_connect(cfg: config::Config) -> anyhow::Result<Box<SidecarTransport>> {
105+
let mut stream = Box::new(run_sidecar(cfg)?);
106+
// Generally the Send buffer ought to be big enough for instantaneous transmission
107+
_ = stream.set_write_timeout(Some(Duration::from_millis(100)));
108+
_ = stream.set_read_timeout(Some(Duration::from_secs(10)));
109+
// We do not put reconnect_fn into sidecar_connect, as the reconnect shall not reconnect again on error to prevent recursion
110+
Ok(stream)
111+
}
112+
104113
#[no_mangle]
105114
pub extern "C" fn ddog_sidecar_connect_php(
106115
connection: &mut *mut SidecarTransport,
107116
error_path: *const c_char,
108117
log_level: CharSlice,
109118
enable_telemetry: bool,
119+
on_reconnect: Option<extern "C" fn(*mut SidecarTransport)>,
110120
) -> MaybeError {
111121
let mut cfg = config::FromEnv::config();
112122
cfg.self_telemetry = enable_telemetry;
@@ -137,10 +147,18 @@ pub extern "C" fn ddog_sidecar_connect_php(
137147
let log_level = OsStr::from_bytes(log_level.as_bytes()).into();
138148
cfg.child_env.insert(OsStr::new("DD_TRACE_LOG_LEVEL").into(), log_level);
139149
}
140-
let mut stream = Box::new(try_c!(run_sidecar(cfg)));
141-
// Generally the Send buffer ought to be big enough for instantaneous transmission
142-
_ = stream.set_write_timeout(Some(Duration::from_millis(100)));
143-
_ = stream.set_read_timeout(Some(Duration::from_secs(10)));
150+
151+
let reconnect_fn = on_reconnect.map(|on_reconnect| {
152+
let cfg = cfg.clone();
153+
Box::new(move || {
154+
let mut transport = sidecar_connect(cfg.clone()).ok()?;
155+
on_reconnect(transport.as_mut() as *mut _);
156+
Some(transport)
157+
}) as Box<dyn Fn() -> _>
158+
});
159+
160+
let mut stream = try_c!(sidecar_connect(cfg));
161+
stream.reconnect_fn = reconnect_fn;
144162
*connection = Box::into_raw(stream);
145163

146164
MaybeError::None

ext/ddtrace.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -405,21 +405,21 @@ static inline void dd_alter_prop(size_t prop_offset, zval *old_value, zval *new_
405405
bool ddtrace_alter_dd_service(zval *old_value, zval *new_value, zend_string *new_str) {
406406
dd_alter_prop(XtOffsetOf(ddtrace_span_properties, property_service), old_value, new_value, new_str);
407407
if (DDTRACE_G(request_initialized)) {
408-
ddtrace_sidecar_submit_root_span_data_direct(NULL, new_str, get_DD_ENV(), get_DD_VERSION());
408+
ddtrace_sidecar_submit_root_span_data_direct(&ddtrace_sidecar, NULL, new_str, get_DD_ENV(), get_DD_VERSION());
409409
}
410410
return true;
411411
}
412412
bool ddtrace_alter_dd_env(zval *old_value, zval *new_value, zend_string *new_str) {
413413
dd_alter_prop(XtOffsetOf(ddtrace_span_properties, property_env), old_value, new_value, new_str);
414414
if (DDTRACE_G(request_initialized)) {
415-
ddtrace_sidecar_submit_root_span_data_direct(NULL, get_DD_SERVICE(), new_str, get_DD_VERSION());
415+
ddtrace_sidecar_submit_root_span_data_direct(&ddtrace_sidecar, NULL, get_DD_SERVICE(), new_str, get_DD_VERSION());
416416
}
417417
return true;
418418
}
419419
bool ddtrace_alter_dd_version(zval *old_value, zval *new_value, zend_string *new_str) {
420420
dd_alter_prop(XtOffsetOf(ddtrace_span_properties, property_version), old_value, new_value, new_str);
421421
if (DDTRACE_G(request_initialized)) {
422-
ddtrace_sidecar_submit_root_span_data_direct(NULL, get_DD_SERVICE(), get_DD_ENV(), new_str);
422+
ddtrace_sidecar_submit_root_span_data_direct(&ddtrace_sidecar, NULL, get_DD_SERVICE(), get_DD_ENV(), new_str);
423423
}
424424
return true;
425425
}
@@ -2820,6 +2820,14 @@ PHP_FUNCTION(dd_trace_internal_fn) {
28202820
ddog_CharSlice slice = ddog_sidecar_stats(&ddtrace_sidecar);
28212821
RETVAL_STRINGL(slice.ptr, slice.len);
28222822
free((void *) slice.ptr);
2823+
} else if (FUNCTION_NAME_MATCHES("break_sidecar_connection")) {
2824+
if (!ddtrace_sidecar) {
2825+
RETURN_FALSE;
2826+
}
2827+
ddog_sidecar_send_garbage(&ddtrace_sidecar);
2828+
ddtrace_generate_runtime_id();
2829+
ddtrace_force_new_instance_id();
2830+
RETURN_TRUE;
28232831
} else if (FUNCTION_NAME_MATCHES("synchronous_flush")) {
28242832
uint32_t timeout = 100;
28252833
if (params_count == 1) {

ext/sidecar.c

Lines changed: 88 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,32 @@
1919
ZEND_EXTERN_MODULE_GLOBALS(ddtrace);
2020

2121
ddog_Endpoint *ddtrace_endpoint;
22+
ddog_Endpoint *dogstatsd_endpoint;
2223
struct ddog_InstanceId *ddtrace_sidecar_instance_id;
2324
static uint8_t dd_sidecar_formatted_session_id[36];
2425

26+
static inline void dd_set_endpoint_test_token(ddog_Endpoint *endpoint) {
27+
if (zai_config_is_initialized()) {
28+
if (ZSTR_LEN(get_DD_TRACE_AGENT_TEST_SESSION_TOKEN())) {
29+
ddog_endpoint_set_test_token(endpoint, dd_zend_string_to_CharSlice(get_DD_TRACE_AGENT_TEST_SESSION_TOKEN()));
30+
}
31+
} else if (ZSTR_LEN(get_global_DD_TRACE_AGENT_TEST_SESSION_TOKEN())) {
32+
ddog_endpoint_set_test_token(endpoint, dd_zend_string_to_CharSlice(get_global_DD_TRACE_AGENT_TEST_SESSION_TOKEN()));
33+
}
34+
}
35+
2536
// Set the globals that stay unchanged in case of fork
2637
static void ddtrace_set_non_resettable_sidecar_globals(void) {
2738
ddtrace_format_runtime_id(&dd_sidecar_formatted_session_id);
2839
ddtrace_endpoint = ddtrace_sidecar_agent_endpoint();
40+
41+
if (get_global_DD_TRACE_AGENTLESS() && ZSTR_LEN(get_global_DD_API_KEY())) {
42+
dogstatsd_endpoint = ddog_endpoint_from_api_key(dd_zend_string_to_CharSlice(get_global_DD_API_KEY()));
43+
} else {
44+
char *dogstatsd_url = ddtrace_dogstatsd_url();
45+
dogstatsd_endpoint = ddog_endpoint_from_url((ddog_CharSlice) {.ptr = dogstatsd_url, .len = strlen(dogstatsd_url)});
46+
free(dogstatsd_url);
47+
}
2948
}
3049

3150
// Set the globals that must be updated in case of fork
@@ -48,13 +67,55 @@ DDTRACE_PUBLIC uint64_t ddtrace_get_sidecar_queue_id(void) {
4867
return DDTRACE_G(sidecar_queue_id);
4968
}
5069

51-
static inline void dd_set_endpoint_test_token(ddog_Endpoint *endpoint) {
52-
if (zai_config_is_initialized()) {
53-
if (ZSTR_LEN(get_DD_TRACE_AGENT_TEST_SESSION_TOKEN())) {
54-
ddog_endpoint_set_test_token(endpoint, dd_zend_string_to_CharSlice(get_DD_TRACE_AGENT_TEST_SESSION_TOKEN()));
70+
static void dd_sidecar_post_connect(ddog_SidecarTransport **transport, bool is_fork, const char *logpath) {
71+
ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)};
72+
ddog_sidecar_session_set_config(transport, session_id, ddtrace_endpoint, dogstatsd_endpoint,
73+
DDOG_CHARSLICE_C("php"),
74+
dd_zend_string_to_CharSlice(Z_STR_P(zend_get_constant_str(ZEND_STRL("PHP_VERSION")))),
75+
DDOG_CHARSLICE_C(PHP_DDTRACE_VERSION),
76+
get_global_DD_TRACE_AGENT_FLUSH_INTERVAL(),
77+
(int)(get_global_DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS() * 1000),
78+
// for historical reasons in seconds
79+
get_global_DD_TELEMETRY_HEARTBEAT_INTERVAL() * 1000,
80+
get_global_DD_TRACE_BUFFER_SIZE(),
81+
get_global_DD_TRACE_AGENT_STACK_BACKLOG() * get_global_DD_TRACE_AGENT_MAX_PAYLOAD_SIZE(),
82+
get_global_DD_TRACE_DEBUG() ? DDOG_CHARSLICE_C("debug") : dd_zend_string_to_CharSlice(get_global_DD_TRACE_LOG_LEVEL()),
83+
(ddog_CharSlice){ .ptr = logpath, .len = strlen(logpath) },
84+
ddtrace_set_all_thread_vm_interrupt,
85+
DDTRACE_REMOTE_CONFIG_PRODUCTS.ptr,
86+
DDTRACE_REMOTE_CONFIG_PRODUCTS.len,
87+
DDTRACE_REMOTE_CONFIG_CAPABILITIES.ptr,
88+
DDTRACE_REMOTE_CONFIG_CAPABILITIES.len,
89+
get_global_DD_REMOTE_CONFIG_ENABLED(),
90+
is_fork);
91+
92+
if (get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()) {
93+
ddtrace_telemetry_register_services(transport);
94+
}
95+
}
96+
97+
static void dd_sidecar_on_reconnect(ddog_SidecarTransport *transport) {
98+
char logpath[MAXPATHLEN];
99+
int error_fd = atomic_load(&ddtrace_error_log_fd);
100+
if (error_fd == -1 || ddtrace_get_fd_path(error_fd, logpath) < 0) {
101+
*logpath = 0;
102+
}
103+
104+
dd_sidecar_post_connect(&transport, false, logpath);
105+
106+
if (DDTRACE_G(active_stack) && DDTRACE_G(active_stack)->root_span) {
107+
ddtrace_sidecar_submit_root_span_data_direct_defaults(&transport, DDTRACE_G(active_stack)->root_span);
108+
} else {
109+
// when we get disconnected during shutdown
110+
zend_string *free_string = NULL;
111+
ddog_CharSlice service_name, env_name;
112+
ddtrace_telemetry_current_names(&service_name, &env_name, &free_string);
113+
114+
ddtrace_ffi_try("Failed sending config data", ddog_sidecar_set_universal_service_tags(&transport, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), service_name, env_name, dd_zend_string_to_CharSlice(get_DD_VERSION()), &DDTRACE_G(active_global_tags)));
115+
116+
if (free_string) {
117+
zend_string_release(free_string);
55118
}
56-
} else if (ZSTR_LEN(get_global_DD_TRACE_AGENT_TEST_SESSION_TOKEN())) {
57-
ddog_endpoint_set_test_token(endpoint, dd_zend_string_to_CharSlice(get_global_DD_TRACE_AGENT_TEST_SESSION_TOKEN()));
58119
}
59120
}
60121

@@ -64,15 +125,6 @@ static ddog_SidecarTransport *dd_sidecar_connection_factory_ex(bool is_fork) {
64125
return NULL;
65126
}
66127

67-
ddog_Endpoint *dogstatsd_endpoint;
68-
if (get_global_DD_TRACE_AGENTLESS() && ZSTR_LEN(get_global_DD_API_KEY())) {
69-
dogstatsd_endpoint = ddog_endpoint_from_api_key(dd_zend_string_to_CharSlice(get_global_DD_API_KEY()));;
70-
} else {
71-
char *dogstatsd_url = ddtrace_dogstatsd_url();
72-
dogstatsd_endpoint = ddog_endpoint_from_url((ddog_CharSlice) {.ptr = dogstatsd_url, .len = strlen(dogstatsd_url)});
73-
free(dogstatsd_url);
74-
}
75-
76128
dd_set_endpoint_test_token(dogstatsd_endpoint);
77129

78130
#ifdef _WIN32
@@ -86,37 +138,12 @@ static ddog_SidecarTransport *dd_sidecar_connection_factory_ex(bool is_fork) {
86138
}
87139

88140
ddog_SidecarTransport *sidecar_transport;
89-
if (!ddtrace_ffi_try("Failed connecting to the sidecar", ddog_sidecar_connect_php(&sidecar_transport, logpath, dd_zend_string_to_CharSlice(get_global_DD_TRACE_LOG_LEVEL()), get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()))) {
141+
if (!ddtrace_ffi_try("Failed connecting to the sidecar", ddog_sidecar_connect_php(&sidecar_transport, logpath, dd_zend_string_to_CharSlice(get_global_DD_TRACE_LOG_LEVEL()), get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED(), dd_sidecar_on_reconnect))) {
90142
ddog_endpoint_drop(dogstatsd_endpoint);
91143
return NULL;
92144
}
93145

94-
ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)};
95-
ddog_sidecar_session_set_config(&sidecar_transport, session_id, ddtrace_endpoint, dogstatsd_endpoint,
96-
DDOG_CHARSLICE_C("php"),
97-
dd_zend_string_to_CharSlice(Z_STR_P(zend_get_constant_str(ZEND_STRL("PHP_VERSION")))),
98-
DDOG_CHARSLICE_C(PHP_DDTRACE_VERSION),
99-
get_global_DD_TRACE_AGENT_FLUSH_INTERVAL(),
100-
(int)(get_global_DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS() * 1000),
101-
// for historical reasons in seconds
102-
get_global_DD_TELEMETRY_HEARTBEAT_INTERVAL() * 1000,
103-
get_global_DD_TRACE_BUFFER_SIZE(),
104-
get_global_DD_TRACE_AGENT_STACK_BACKLOG() * get_global_DD_TRACE_AGENT_MAX_PAYLOAD_SIZE(),
105-
get_global_DD_TRACE_DEBUG() ? DDOG_CHARSLICE_C("debug") : dd_zend_string_to_CharSlice(get_global_DD_TRACE_LOG_LEVEL()),
106-
(ddog_CharSlice){ .ptr = logpath, .len = strlen(logpath) },
107-
ddtrace_set_all_thread_vm_interrupt,
108-
DDTRACE_REMOTE_CONFIG_PRODUCTS.ptr,
109-
DDTRACE_REMOTE_CONFIG_PRODUCTS.len,
110-
DDTRACE_REMOTE_CONFIG_CAPABILITIES.ptr,
111-
DDTRACE_REMOTE_CONFIG_CAPABILITIES.len,
112-
get_global_DD_REMOTE_CONFIG_ENABLED(),
113-
is_fork);
114-
115-
ddog_endpoint_drop(dogstatsd_endpoint);
116-
117-
if (get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()) {
118-
ddtrace_telemetry_register_services(sidecar_transport);
119-
}
146+
dd_sidecar_post_connect(&sidecar_transport, is_fork, logpath);
120147

121148
return sidecar_transport;
122149
}
@@ -158,6 +185,7 @@ void ddtrace_sidecar_setup(bool appsec_activation, bool appsec_config) {
158185
ddtrace_sidecar = dd_sidecar_connection_factory();
159186
if (!ddtrace_sidecar && ddtrace_endpoint) { // Something went wrong
160187
ddog_endpoint_drop(ddtrace_endpoint);
188+
ddog_endpoint_drop(dogstatsd_endpoint);
161189
ddtrace_endpoint = NULL;
162190
}
163191

@@ -178,23 +206,29 @@ void ddtrace_sidecar_shutdown(void) {
178206
}
179207
if (ddtrace_endpoint) {
180208
ddog_endpoint_drop(ddtrace_endpoint);
209+
ddog_endpoint_drop(dogstatsd_endpoint);
181210
}
182211
if (ddtrace_sidecar) {
183212
ddog_sidecar_transport_drop(ddtrace_sidecar);
184213
}
185214
}
186215

187-
void ddtrace_reset_sidecar(void) {
216+
void ddtrace_force_new_instance_id(void) {
188217
if (ddtrace_sidecar_instance_id) {
189218
ddog_sidecar_instanceId_drop(ddtrace_sidecar_instance_id);
190219
ddtrace_set_resettable_sidecar_globals();
191220
}
221+
}
222+
223+
void ddtrace_reset_sidecar(void) {
224+
ddtrace_force_new_instance_id();
192225

193226
if (ddtrace_sidecar) {
194227
ddog_sidecar_transport_drop(ddtrace_sidecar);
195228
ddtrace_sidecar = dd_sidecar_connection_factory_ex(true);
196229
if (!ddtrace_sidecar && ddtrace_endpoint) { // Something went wrong
197230
ddog_endpoint_drop(ddtrace_endpoint);
231+
ddog_endpoint_drop(dogstatsd_endpoint);
198232
ddtrace_endpoint = NULL;
199233
} else {
200234
ddtrace_sidecar_submit_root_span_data();
@@ -345,12 +379,12 @@ void ddtrace_sidecar_dogstatsd_set(zend_string *metric, zend_long value, zval *t
345379
ddog_Vec_Tag_drop(vec);
346380
}
347381

348-
void ddtrace_sidecar_submit_root_span_data_direct_defaults(ddtrace_root_span_data *root) {
349-
ddtrace_sidecar_submit_root_span_data_direct(root, get_DD_SERVICE(), get_DD_ENV(), get_DD_VERSION());
382+
void ddtrace_sidecar_submit_root_span_data_direct_defaults(ddog_SidecarTransport **transport, ddtrace_root_span_data *root) {
383+
ddtrace_sidecar_submit_root_span_data_direct(transport, root, get_DD_SERVICE(), get_DD_ENV(), get_DD_VERSION());
350384
}
351385

352-
void ddtrace_sidecar_submit_root_span_data_direct(ddtrace_root_span_data *root, zend_string *cfg_service, zend_string *cfg_env, zend_string *cfg_version) {
353-
if (!ddtrace_sidecar) {
386+
void ddtrace_sidecar_submit_root_span_data_direct(ddog_SidecarTransport **transport, ddtrace_root_span_data *root, zend_string *cfg_service, zend_string *cfg_env, zend_string *cfg_version) {
387+
if (!transport) {
354388
return;
355389
}
356390

@@ -404,13 +438,14 @@ void ddtrace_sidecar_submit_root_span_data_direct(ddtrace_root_span_data *root,
404438
}
405439
}
406440

407-
if (changed || !root) {
408-
ddtrace_ffi_try("Failed sending config data", ddog_sidecar_set_universal_service_tags(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), service_slice, env_slice, version_slice, &DDTRACE_G(active_global_tags)));
441+
// Force resend on reconnect
442+
if (changed || !root || *transport != ddtrace_sidecar) {
443+
ddtrace_ffi_try("Failed sending config data", ddog_sidecar_set_universal_service_tags(transport, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), service_slice, env_slice, version_slice, &DDTRACE_G(active_global_tags)));
409444
}
410445

411-
if (DDTRACE_G(telemetry_buffer)) {
446+
if ((changed || !root) && DDTRACE_G(telemetry_buffer)) {
412447
ddtrace_ffi_try("Failed flushing filtered telemetry buffer",
413-
ddog_sidecar_telemetry_filter_flush(&ddtrace_sidecar, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), ddtrace_telemetry_buffer(), ddtrace_telemetry_cache(), service_slice, env_slice));
448+
ddog_sidecar_telemetry_filter_flush(transport, ddtrace_sidecar_instance_id, &DDTRACE_G(sidecar_queue_id), ddtrace_telemetry_buffer(), ddtrace_telemetry_cache(), service_slice, env_slice));
414449
}
415450

416451
if (free_string) {
@@ -422,7 +457,7 @@ void ddtrace_sidecar_submit_root_span_data(void) {
422457
if (DDTRACE_G(active_stack)) {
423458
ddtrace_root_span_data *root = DDTRACE_G(active_stack)->root_span;
424459
if (root) {
425-
ddtrace_sidecar_submit_root_span_data_direct_defaults(root);
460+
ddtrace_sidecar_submit_root_span_data_direct_defaults(&ddtrace_sidecar, root);
426461
}
427462
}
428463
}
@@ -469,7 +504,7 @@ void ddtrace_sidecar_rinit(void) {
469504
}
470505
}
471506

472-
ddtrace_sidecar_submit_root_span_data_direct_defaults(NULL);
507+
ddtrace_sidecar_submit_root_span_data_direct_defaults(&ddtrace_sidecar, NULL);
473508
}
474509

475510
void ddtrace_sidecar_rshutdown(void) {

ext/sidecar.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ bool ddtrace_sidecar_maybe_enable_appsec(bool *appsec_activation, bool *appsec_c
1818
void ddtrace_sidecar_ensure_active(void);
1919
void ddtrace_sidecar_shutdown(void);
2020
void ddtrace_reset_sidecar(void);
21+
void ddtrace_force_new_instance_id(void);
2122
void ddtrace_sidecar_submit_root_span_data(void);
2223
void ddtrace_sidecar_push_tag(ddog_Vec_Tag *vec, ddog_CharSlice key, ddog_CharSlice value);
2324
void ddtrace_sidecar_push_tags(ddog_Vec_Tag *vec, zval *tags);
2425
ddog_Endpoint *ddtrace_sidecar_agent_endpoint(void);
25-
void ddtrace_sidecar_submit_root_span_data_direct_defaults(ddtrace_root_span_data *root);
26-
void ddtrace_sidecar_submit_root_span_data_direct(ddtrace_root_span_data *root, zend_string *cfg_service, zend_string *cfg_env, zend_string *cfg_version);
26+
void ddtrace_sidecar_submit_root_span_data_direct_defaults(ddog_SidecarTransport **transport, ddtrace_root_span_data *root);
27+
void ddtrace_sidecar_submit_root_span_data_direct(ddog_SidecarTransport **transport, ddtrace_root_span_data *root, zend_string *cfg_service, zend_string *cfg_env, zend_string *cfg_version);
2728

2829
void ddtrace_sidecar_send_debugger_data(ddog_Vec_DebuggerPayload payloads);
2930
void ddtrace_sidecar_send_debugger_datum(ddog_DebuggerPayload *payload);

0 commit comments

Comments
 (0)