diff --git a/components-rs/live-debugger.h b/components-rs/live-debugger.h index 550a6093f4d..9c6f404b9fa 100644 --- a/components-rs/live-debugger.h +++ b/components-rs/live-debugger.h @@ -58,7 +58,8 @@ struct ddog_DebuggerPayload *ddog_create_log_probe_snapshot(const struct ddog_Pr const ddog_CharSlice *message, ddog_CharSlice service, ddog_CharSlice language, - uint64_t timestamp); + uint64_t timestamp, + ddog_CharSlice process_tags); void ddog_update_payload_message(struct ddog_DebuggerPayload *payload, ddog_CharSlice message); diff --git a/ext/live_debugger.c b/ext/live_debugger.c index 72907c49a44..e408a7a1f10 100644 --- a/ext/live_debugger.c +++ b/ext/live_debugger.c @@ -13,6 +13,7 @@ #include "zend_hrtime.h" #include "components-rs/common.h" #include "zend_generators.h" +#include "process_tags.h" ZEND_EXTERN_MODULE_GLOBALS(ddtrace); @@ -390,8 +391,16 @@ static void dd_log_probe_ensure_payload(dd_log_probe_dyn *dyn, dd_log_probe_def if (dyn->payload) { ddog_update_payload_message(dyn->payload, *msg); } else { + zend_string *process_tags = ddtrace_process_tags_get_serialized(); + dyn->service = ddtrace_active_service_name(); - dyn->payload = ddog_create_log_probe_snapshot(&def->parent.probe, msg, dd_zend_string_to_CharSlice(dyn->service), DDOG_CHARSLICE_C("php"), ddtrace_nanoseconds_realtime() / 1000000); + dyn->payload = ddog_create_log_probe_snapshot( + &def->parent.probe, + msg, + dd_zend_string_to_CharSlice(dyn->service), + DDOG_CHARSLICE_C("php"), + ddtrace_nanoseconds_realtime() / 1000000, + process_tags ? dd_zend_string_to_CharSlice(process_tags) : DDOG_CHARSLICE_C("")); } } diff --git a/ext/span.c b/ext/span.c index 7ee7708a033..ed37b155c51 100644 --- a/ext/span.c +++ b/ext/span.c @@ -25,6 +25,7 @@ #include "standalone_limiter.h" #include "code_origins.h" #include "endpoint_guessing.h" +#include "process_tags.h" #define USE_REALTIME_CLOCK 0 #define USE_MONOTONIC_CLOCK 1 @@ -1113,7 +1114,14 @@ void ddtrace_serialize_closed_spans(ddog_TracesBytes *traces, bool fast_shutdown do { ddtrace_span_data *tmp = span; span = tmp->next; - ddtrace_serialize_span_to_rust_span(tmp, trace); + bool is_first_span = (ddog_get_trace_size(trace) == 0); + ddog_SpanBytes *rust_span = ddtrace_serialize_span_to_rust_span(tmp, trace); + if (is_first_span) { + zend_string *process_tags = ddtrace_process_tags_get_serialized(); + if (process_tags) { + ddog_add_str_span_meta_zstr(rust_span, "_dd.process_tags", process_tags); + } + } #if PHP_VERSION_ID < 70400 // remove the artificially increased RC while closing again GC_SET_REFCOUNT(&tmp->std, GC_REFCOUNT(&tmp->std) - DD_RC_CLOSED_MARKER); diff --git a/libdatadog b/libdatadog index 1caf15157a8..e5c143e27e3 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 1caf15157a8251d398715349a75d5607cb5545c2 +Subproject commit e5c143e27e3bcfef1dbdafb8ce321c347034d632 diff --git a/tests/ext/live-debugger/debugger_log_probe.phpt b/tests/ext/live-debugger/debugger_log_probe.phpt index 3e7aece3c3a..7edb7199ba9 100644 --- a/tests/ext/live-debugger/debugger_log_probe.phpt +++ b/tests/ext/live-debugger/debugger_log_probe.phpt @@ -62,7 +62,7 @@ reset_request_replayer(); ?> --EXPECTF-- int(30) -array(5) { +array(6) { ["service"]=> string(22) "debugger_log_probe.php" ["ddsource"]=> @@ -247,4 +247,6 @@ array(5) { [true] [true] " + ["process_tags"]=> + NULL } diff --git a/tests/ext/live-debugger/debugger_log_probe_process_tags.phpt b/tests/ext/live-debugger/debugger_log_probe_process_tags.phpt new file mode 100644 index 00000000000..0ed61760f9f --- /dev/null +++ b/tests/ext/live-debugger/debugger_log_probe_process_tags.phpt @@ -0,0 +1,61 @@ +--TEST-- +Live debugger log probe includes process_tags +--SKIPIF-- + +--ENV-- +DD_AGENT_HOST=request-replayer +DD_TRACE_AGENT_PORT=80 +DD_TRACE_GENERATE_ROOT_SPAN=0 +DD_DYNAMIC_INSTRUMENTATION_ENABLED=1 +DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS=0.01 +DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=1 +--INI-- +datadog.trace.agent_test_session_token=live-debugger/log_probe_process_tags +--FILE-- + ["methodName" => "simple_function"], + "captureSnapshot" => true, + "segments" => [ + ["str" => "Simple message"], + ], + ]); + + \DDTrace\start_span(); // submit span data +}); + +simple_function(); + +$dlr = new DebuggerLogReplayer; +$log = $dlr->waitForDebuggerDataAndReplay(); +$payload = json_decode($log["body"], true)[0]; + +if (isset($payload["process_tags"])) { + echo "Process tags found in payload\n"; + $processTags = $payload["process_tags"]; + + var_dump($processTags); +} else { + echo "ERROR: process_tags not found in payload\n"; +} + +?> +--CLEAN-- + +--EXPECTF-- +Process tags found in payload +string(%d) "entrypoint.basedir:live-debugger,entrypoint.name:debugger_log_probe_process_tags,entrypoint.type:script,entrypoint.workdir:%s,runtime.sapi:cli" + diff --git a/tests/ext/live-debugger/debugger_span_decoration_probe.phpt b/tests/ext/live-debugger/debugger_span_decoration_probe.phpt index 9320df9cb9c..9716393f6d7 100644 --- a/tests/ext/live-debugger/debugger_span_decoration_probe.phpt +++ b/tests/ext/live-debugger/debugger_span_decoration_probe.phpt @@ -101,7 +101,7 @@ array(2) { string(%d) "/debugger/v1/input?ddtags=debugger_version:1.%s,env:none,version:,runtime_id:%s-%s-%s-%s-%s,host_name:%s" array(1) { [0]=> - array(5) { + array(6) { ["service"]=> string(34) "debugger_span_decoration_probe.php" ["ddsource"]=> @@ -142,5 +142,7 @@ array(1) { } ["message"]=> string(32) "Evaluation errors for probe id 2" + ["process_tags"]=> + NULL } } diff --git a/tests/ext/live-debugger/exception-replay_001.phpt b/tests/ext/live-debugger/exception-replay_001.phpt index ef1888464a3..4b23b4cccae 100644 --- a/tests/ext/live-debugger/exception-replay_001.phpt +++ b/tests/ext/live-debugger/exception-replay_001.phpt @@ -47,7 +47,7 @@ reset_request_replayer(); --EXPECTF-- array(2) { [0]=> - array(5) { + array(6) { ["service"]=> string(24) "exception-replay_001.php" ["ddsource"]=> @@ -126,9 +126,11 @@ array(2) { } ["message"]=> NULL + ["process_tags"]=> + NULL } [1]=> - array(5) { + array(6) { ["service"]=> string(24) "exception-replay_001.php" ["ddsource"]=> @@ -231,5 +233,7 @@ array(2) { } ["message"]=> NULL + ["process_tags"]=> + NULL } } \ No newline at end of file diff --git a/tests/ext/live-debugger/exception-replay_002.phpt b/tests/ext/live-debugger/exception-replay_002.phpt index 1880a57a5b7..80f7d247faf 100644 --- a/tests/ext/live-debugger/exception-replay_002.phpt +++ b/tests/ext/live-debugger/exception-replay_002.phpt @@ -76,7 +76,7 @@ require __DIR__ . "/live_debugger.inc"; reset_request_replayer(); ?> --EXPECTF-- -array(5) { +array(6) { ["service"]=> string(24) "exception-replay_002.php" ["ddsource"]=> @@ -1029,4 +1029,6 @@ array(5) { } ["message"]=> NULL + ["process_tags"]=> + NULL } diff --git a/tests/ext/live-debugger/exception-replay_non_regression_2989_mysqli.phpt b/tests/ext/live-debugger/exception-replay_non_regression_2989_mysqli.phpt index a684465fab3..524bac94f28 100644 --- a/tests/ext/live-debugger/exception-replay_non_regression_2989_mysqli.phpt +++ b/tests/ext/live-debugger/exception-replay_non_regression_2989_mysqli.phpt @@ -49,7 +49,7 @@ reset_request_replayer(); ?> --EXPECTF-- Warning: mysqli::__construct(): php_network_getaddresses: getaddrinfo %s -%Aarray(5) { +%Aarray(6) { ["service"]=> string(47) "exception-replay_non_regression_2989_mysqli.php" ["ddsource"]=> @@ -124,4 +124,6 @@ Warning: mysqli::__construct(): php_network_getaddresses: getaddrinfo %s } ["message"]=> NULL + ["process_tags"]=> + NULL }