Skip to content

Commit 211d162

Browse files
committed
feat(sidecar): support threaded connection for windows
Signed-off-by: Alexandre Rulleau <alexandre.rulleau@datadoghq.com>
1 parent c31f9aa commit 211d162

4 files changed

Lines changed: 20 additions & 31 deletions

File tree

components-rs/ddtrace.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ ddog_Configurator *ddog_library_configurator_new_dummy(bool debug_logs, ddog_Cha
4343

4444
int posix_spawn_file_actions_addchdir_np(void *file_actions, const char *path);
4545

46+
const char *ddog_normalize_process_tag_value(ddog_CharSlice tag_value);
47+
48+
void ddog_free_normalized_tag_value(const char *ptr);
49+
4650
bool ddog_shall_log(enum ddog_Log category);
4751

4852
void ddog_set_error_log_level(bool once);
@@ -239,8 +243,4 @@ void ddog_add_zstr_span_meta_struct_CharSlice(ddog_SpanBytes *ptr,
239243
struct _zend_string *key,
240244
ddog_CharSlice val);
241245

242-
const char *ddog_normalize_process_tag_value(ddog_CharSlice val);
243-
244-
void ddog_free_normalized_tag_value(const char* normalized_val);
245-
246246
#endif /* DDTRACE_PHP_H */

ext/sidecar.c

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -122,10 +122,8 @@ static void dd_sidecar_post_connect(ddog_SidecarTransport **transport, bool is_f
122122
}
123123

124124
static ddog_SidecarTransport *dd_sidecar_connection_factory_ex(bool is_fork);
125-
#ifndef _WIN32
126125
static ddog_SidecarTransport *dd_sidecar_connection_factory_thread(void);
127126
static void ddtrace_sidecar_setup_thread_mode(bool appsec_activation, bool appsec_config);
128-
#endif
129127

130128
static void dd_sidecar_on_reconnect(ddog_SidecarTransport *transport) {
131129
if (!ddtrace_endpoint || !dogstatsd_endpoint) {
@@ -205,7 +203,6 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_subprocess(void) {
205203
return sidecar_transport;
206204
}
207205

208-
#ifndef _WIN32
209206
static ddog_SidecarTransport *ddtrace_sidecar_connect_as_worker(bool is_fork) {
210207
if (!ddtrace_endpoint) {
211208
return NULL;
@@ -214,7 +211,11 @@ static ddog_SidecarTransport *ddtrace_sidecar_connect_as_worker(bool is_fork) {
214211

215212
dd_set_endpoint_test_token(dogstatsd_endpoint);
216213

214+
#ifdef _WIN32
215+
char logpath[MAX_PATH];
216+
#else
217217
char logpath[MAXPATHLEN];
218+
#endif
218219
int error_fd = atomic_load(&ddtrace_error_log_fd);
219220
if (error_fd == -1 || ddtrace_get_fd_path(error_fd, logpath) < 0) {
220221
*logpath = 0;
@@ -240,12 +241,14 @@ static ddog_SidecarTransport *ddtrace_sidecar_connect_as_worker(bool is_fork) {
240241
static ddog_SidecarTransport *dd_sidecar_connection_factory_thread(void) {
241242
return ddtrace_sidecar_connect_as_worker(false);
242243
}
243-
#endif
244244

245245
static void ddtrace_sidecar_setup_thread_mode(bool appsec_activation, bool appsec_config) {
246-
#ifndef _WIN32
247-
pid_t current_pid = getpid();
248-
bool is_child_process = (ddtrace_sidecar_master_pid != 0 && (int32_t)current_pid != ddtrace_sidecar_master_pid);
246+
#ifdef _WIN32
247+
int32_t current_pid = (int32_t)GetCurrentProcessId();
248+
#else
249+
int32_t current_pid = (int32_t)getpid();
250+
#endif
251+
bool is_child_process = (ddtrace_sidecar_master_pid != 0 && current_pid != ddtrace_sidecar_master_pid);
249252

250253
bool listener_available = ddog_sidecar_is_master_listener_active(ddtrace_sidecar_master_pid);
251254

@@ -268,7 +271,6 @@ static void ddtrace_sidecar_setup_thread_mode(bool appsec_activation, bool appse
268271
}
269272
return;
270273
}
271-
#endif
272274

273275
ddtrace_set_non_resettable_sidecar_globals();
274276
ddtrace_set_resettable_sidecar_globals();
@@ -296,21 +298,16 @@ static void ddtrace_sidecar_setup_thread_mode(bool appsec_activation, bool appse
296298
}
297299
}
298300

299-
#ifndef _WIN32
300301
ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void) {
301302
return ddtrace_sidecar_connect_as_worker(false);
302303
}
303-
#endif
304304

305305
ddog_SidecarTransport *ddtrace_sidecar_connect(bool is_fork) {
306306
if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_SUBPROCESS) {
307307
return ddtrace_sidecar_connect_subprocess();
308-
}
309-
#ifndef _WIN32
310-
else if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD) {
308+
} else if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD) {
311309
return ddtrace_sidecar_connect_thread();
312310
}
313-
#endif
314311

315312
zend_long mode = get_global_DD_TRACE_SIDECAR_CONNECTION_MODE();
316313
ddog_SidecarTransport *transport = NULL;
@@ -324,15 +321,13 @@ ddog_SidecarTransport *ddtrace_sidecar_connect(bool is_fork) {
324321
}
325322
break;
326323

327-
#ifndef _WIN32
328324
case DD_TRACE_SIDECAR_CONNECTION_MODE_THREAD:
329325
// Force thread only
330326
transport = ddtrace_sidecar_connect_thread();
331327
if (!transport) {
332328
LOG(ERROR, "Thread connection failed (mode=thread, no fallback)");
333329
}
334330
break;
335-
#endif
336331

337332
case DD_TRACE_SIDECAR_CONNECTION_MODE_AUTO:
338333
default:
@@ -341,7 +336,6 @@ ddog_SidecarTransport *ddtrace_sidecar_connect(bool is_fork) {
341336

342337
if (!transport) {
343338
if (ddtrace_endpoint) {
344-
#ifndef _WIN32
345339
// Subprocess failed but endpoint is valid - try thread mode fallback
346340
LOG(WARN, "Subprocess connection failed, falling back to thread mode");
347341
transport = ddtrace_sidecar_connect_thread();
@@ -351,7 +345,6 @@ ddog_SidecarTransport *ddtrace_sidecar_connect(bool is_fork) {
351345
} else {
352346
LOG(ERROR, "Both subprocess and thread connections failed, sidecar unavailable");
353347
}
354-
#endif
355348
}
356349
}
357350
break;
@@ -400,12 +393,10 @@ bool ddtrace_sidecar_should_enable(bool *appsec_activation, bool *appsec_config)
400393
void ddtrace_sidecar_setup(bool appsec_activation, bool appsec_config) {
401394
zend_long mode = get_global_DD_TRACE_SIDECAR_CONNECTION_MODE();
402395

403-
#ifndef _WIN32
404396
if (mode == DD_TRACE_SIDECAR_CONNECTION_MODE_THREAD) {
405397
ddtrace_sidecar_setup_thread_mode(appsec_activation, appsec_config);
406398
return;
407399
}
408-
#endif
409400

410401
ddtrace_set_non_resettable_sidecar_globals();
411402
ddtrace_set_resettable_sidecar_globals();
@@ -415,13 +406,11 @@ void ddtrace_sidecar_setup(bool appsec_activation, bool appsec_config) {
415406
ddtrace_sidecar = ddtrace_sidecar_connect_subprocess();
416407

417408
if (!ddtrace_sidecar) {
418-
#ifndef _WIN32
419409
if (mode == DD_TRACE_SIDECAR_CONNECTION_MODE_AUTO && ddtrace_endpoint) {
420410
LOG(WARN, "Subprocess connection failed, falling back to thread mode");
421411
ddtrace_sidecar_setup_thread_mode(appsec_activation, appsec_config);
422412
return;
423413
}
424-
#endif
425414

426415
if (ddtrace_endpoint) {
427416
dd_free_endpoints();
@@ -432,16 +421,18 @@ void ddtrace_sidecar_setup(bool appsec_activation, bool appsec_config) {
432421
}
433422

434423
void ddtrace_sidecar_minit(void) {
435-
#ifndef _WIN32
424+
#ifdef _WIN32
425+
ddtrace_sidecar_master_pid = (int32_t)GetCurrentProcessId();
426+
#else
436427
ddtrace_sidecar_master_pid = (int32_t)getpid();
428+
#endif
437429

438430
zend_long mode = get_global_DD_TRACE_SIDECAR_CONNECTION_MODE();
439431

440432
if (mode == DD_TRACE_SIDECAR_CONNECTION_MODE_THREAD) {
441433
ddtrace_ffi_try("Starting sidecar master listener in MINIT",
442434
ddog_sidecar_connect_master(ddtrace_sidecar_master_pid));
443435
}
444-
#endif
445436
}
446437

447438
void ddtrace_sidecar_handle_fork(void) {

ext/sidecar.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ DDTRACE_PUBLIC struct telemetry_rc_info ddtrace_get_telemetry_rc_info(void);
3131

3232
// Connection functions
3333
ddog_SidecarTransport *ddtrace_sidecar_connect_subprocess(void);
34-
#ifndef _WIN32
3534
ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void);
36-
#endif
3735
ddog_SidecarTransport *ddtrace_sidecar_connect(bool is_fork);
3836

3937
// Lifecycle functions

0 commit comments

Comments
 (0)