1919ZEND_EXTERN_MODULE_GLOBALS (ddtrace );
2020
2121ddog_Endpoint * ddtrace_endpoint ;
22+ ddog_Endpoint * dogstatsd_endpoint ;
2223struct ddog_InstanceId * ddtrace_sidecar_instance_id ;
2324static 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
2637static 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
475510void ddtrace_sidecar_rshutdown (void ) {
0 commit comments