Skip to content

Commit 4b10ad2

Browse files
committed
Use a webserver-wide session id instead of per fork
1 parent b7eb412 commit 4b10ad2

7 files changed

Lines changed: 49 additions & 12 deletions

File tree

Cargo.lock

Lines changed: 9 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
2 Bytes
Binary file not shown.

components-rs/ddtrace.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ struct _zend_string;
1111

1212
extern ddog_Uuid ddtrace_runtime_id;
1313

14+
extern ddog_Uuid ddtrace_session_id;
15+
16+
extern uint8_t ddtrace_formatted_session_id[36];
17+
1418
extern void (*ddog_log_callback)(ddog_CharSlice);
1519

1620
extern ddog_VecRemoteConfigProduct DDTRACE_REMOTE_CONFIG_PRODUCTS;
@@ -25,6 +29,12 @@ extern const uint8_t *DDOG_PHP_FUNCTION;
2529
*/
2630
void ddtrace_generate_runtime_id(void);
2731

32+
/**
33+
* # Safety
34+
* Must be called from a single-threaded context, such as MINIT.
35+
*/
36+
void ddtrace_generate_session_id(void);
37+
2838
void ddtrace_format_runtime_id(uint8_t (*buf)[36]);
2939

3040
ddog_CharSlice ddtrace_get_container_id(void);

components-rs/lib.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,29 @@ pub use libdd_telemetry_ffi::*;
3232
#[allow(non_upper_case_globals)]
3333
pub static mut ddtrace_runtime_id: Uuid = Uuid::nil();
3434

35+
#[no_mangle]
36+
#[allow(non_upper_case_globals)]
37+
pub static mut ddtrace_session_id: Uuid = Uuid::nil();
38+
39+
#[no_mangle]
40+
#[allow(non_upper_case_globals)]
41+
pub static mut ddtrace_formatted_session_id: [u8; 36] = [0u8; 36];
42+
3543
/// # Safety
3644
/// Must be called from a single-threaded context, such as MINIT.
3745
#[no_mangle]
3846
pub unsafe extern "C" fn ddtrace_generate_runtime_id() {
3947
ddtrace_runtime_id = Uuid::new_v4();
4048
}
4149

50+
/// # Safety
51+
/// Must be called from a single-threaded context, such as MINIT.
52+
#[no_mangle]
53+
pub unsafe extern "C" fn ddtrace_generate_session_id() {
54+
ddtrace_session_id = Uuid::new_v4();
55+
ddtrace_session_id.as_hyphenated().encode_lower(&mut ddtrace_formatted_session_id);
56+
}
57+
4258
#[no_mangle]
4359
pub extern "C" fn ddtrace_format_runtime_id(buf: &mut [u8; 36]) {
4460
// Safety: ddtrace_runtime_id is only supposed to be mutated from single-

ext/ddtrace.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ TSRM_TLS void *TSRMLS_CACHE = NULL;
148148
#endif
149149
#endif
150150

151+
static int dd_main_pid;
152+
151153
int ddtrace_disable = 0; // 0 = enabled, 1 = disabled via INI, 2 = disabled, but MINIT was fully executed
152154
static ZEND_INI_MH(dd_OnUpdateDisabled) {
153155
UNUSED(entry, mh_arg1, mh_arg2, mh_arg3, stage);
@@ -430,7 +432,9 @@ bool ddtrace_alter_dd_version(zval *old_value, zval *new_value, zend_string *new
430432

431433
static void dd_activate_once(void) {
432434
ddtrace_config_first_rinit();
433-
ddtrace_generate_runtime_id();
435+
if (dd_main_pid != getpid()) { // equal to session id if not a fork
436+
ddtrace_generate_runtime_id();
437+
}
434438

435439
// must run before the first zai_hook_activate as ddtrace_telemetry_setup installs a global hook
436440
if (!ddtrace_disable) {
@@ -1466,6 +1470,9 @@ static PHP_MINIT_FUNCTION(ddtrace) {
14661470
ddtrace_module = Z_PTR_P(ddtrace_module_zv);
14671471
}
14681472

1473+
dd_main_pid = getpid();
1474+
ddtrace_generate_session_id();
1475+
14691476
// Make sure it's available for appsec, before any early returns
14701477
dd_ip_extraction_startup();
14711478

ext/sidecar.c

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ ZEND_EXTERN_MODULE_GLOBALS(ddtrace);
2727
ddog_Endpoint *ddtrace_endpoint;
2828
ddog_Endpoint *dogstatsd_endpoint; // always set when ddtrace_endpoint is set
2929
struct ddog_InstanceId *ddtrace_sidecar_instance_id;
30-
static uint8_t dd_sidecar_formatted_session_id[36];
3130

3231
// Best-effort pointer for the signal handler (SIGTERM/SIGINT). Set to the first
3332
// per-thread connection; never cleared until MSHUTDOWN. Not atomic: concurrent
@@ -51,7 +50,6 @@ static inline void dd_set_endpoint_test_token(ddog_Endpoint *endpoint) {
5150

5251
// Set the globals that stay unchanged in case of fork
5352
static void ddtrace_set_non_resettable_sidecar_globals(void) {
54-
ddtrace_format_runtime_id(&dd_sidecar_formatted_session_id);
5553
ddtrace_endpoint = ddtrace_sidecar_agent_endpoint();
5654

5755
if (get_global_DD_TRACE_AGENTLESS() && ZSTR_LEN(get_global_DD_API_KEY())) {
@@ -68,7 +66,7 @@ static void ddtrace_set_resettable_sidecar_globals(void) {
6866
uint8_t formatted_run_time_id[36];
6967
ddtrace_format_runtime_id(&formatted_run_time_id);
7068
ddog_CharSlice runtime_id = (ddog_CharSlice) {.ptr = (char *) formatted_run_time_id, .len = sizeof(formatted_run_time_id)};
71-
ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)};
69+
ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) ddtrace_formatted_session_id, .len = sizeof(ddtrace_formatted_session_id)};
7270
ddtrace_sidecar_instance_id = ddog_sidecar_instanceId_build(session_id, runtime_id);
7371
}
7472

@@ -80,10 +78,10 @@ static void dd_free_endpoints(void) {
8078
}
8179

8280
DDTRACE_PUBLIC const uint8_t *ddtrace_get_formatted_session_id(void) {
83-
if (memcmp(dd_sidecar_formatted_session_id, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 36) == 0) {
81+
if (memcmp(ddtrace_formatted_session_id, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 36) == 0) {
8482
return NULL;
8583
}
86-
return dd_sidecar_formatted_session_id;
84+
return ddtrace_formatted_session_id;
8785
}
8886

8987
DDTRACE_PUBLIC struct telemetry_rc_info ddtrace_get_telemetry_rc_info(void) {
@@ -103,7 +101,7 @@ DDTRACE_PUBLIC uint64_t ddtrace_get_sidecar_queue_id(void) {
103101
}
104102

105103
static void dd_sidecar_post_connect(ddog_SidecarTransport **transport, bool is_fork, const char *logpath) {
106-
ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)};
104+
ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) ddtrace_formatted_session_id, .len = sizeof(ddtrace_formatted_session_id)};
107105
const ddog_Vec_Tag *process_tags = ddtrace_process_tags_get_vec();
108106
ddog_sidecar_session_set_config(transport, session_id, ddtrace_endpoint, dogstatsd_endpoint,
109107
DDOG_CHARSLICE_C("php"),
@@ -912,7 +910,7 @@ ddog_crasht_Metadata ddtrace_setup_crashtracking_metadata(ddog_Vec_Tag *tags) {
912910
ddtrace_sidecar_push_tag(tags, DDOG_CHARSLICE_C("library_version"), DDOG_CHARSLICE_C(PHP_DDTRACE_VERSION));
913911
ddtrace_sidecar_push_tag(tags, DDOG_CHARSLICE_C("language"), DDOG_CHARSLICE_C("php"));
914912
ddtrace_sidecar_push_tag(tags, DDOG_CHARSLICE_C("runtime"), DDOG_CHARSLICE_C("php"));
915-
ddtrace_sidecar_push_tag(tags, DDOG_CHARSLICE_C("runtime-id"), (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)});
913+
ddtrace_sidecar_push_tag(tags, DDOG_CHARSLICE_C("runtime-id"), (ddog_CharSlice) {.ptr = (char *) ddtrace_formatted_session_id, .len = sizeof(ddtrace_formatted_session_id)});
916914

917915
const char *runtime_version = zend_get_module_version("Reflection");
918916
ddtrace_sidecar_push_tag(tags, DDOG_CHARSLICE_C("runtime_version"), (ddog_CharSlice) {.ptr = (char *) runtime_version, .len = strlen(runtime_version)});

0 commit comments

Comments
 (0)