From 93c4b08b210d4d946a299711a6b584b99f99dd9e Mon Sep 17 00:00:00 2001 From: Louis Tricot Date: Mon, 12 Jan 2026 14:19:59 +0100 Subject: [PATCH 1/8] bump libdatadog to main --- Cargo.lock | 394 +++++++++++++++------ Makefile | 2 +- components-rs/telemetry.rs | 1 + libdatadog | 2 +- profiling/Cargo.toml | 6 +- profiling/src/profiling/uploader.rs | 1 + tests/ext/appsec/sca_flag_is_sent_01.phpt | 4 +- tests/ext/appsec/sca_flag_is_sent_02.phpt | 4 +- tests/ext/appsec/sca_flag_is_sent_03.phpt | 4 +- tests/ext/appsec/sca_flag_is_sent_04.phpt | 4 +- tests/ext/appsec/sca_flag_is_sent_05.phpt | 4 +- tests/ext/library_config/fleet_config.phpt | 20 +- tests/ext/library_config/local_config.phpt | 20 +- tests/ext/telemetry/config.phpt | 6 + 14 files changed, 343 insertions(+), 129 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2ab8bec9268..58e82355890 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -122,6 +122,15 @@ version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arc-swap" version = "1.7.1" @@ -156,6 +165,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "assert_no_alloc" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ca83137a482d61d916ceb1eba52a684f98004f18e0cafea230fe5579c178a3" + [[package]] name = "async-lock" version = "3.4.0" @@ -177,28 +192,6 @@ dependencies = [ "event-listener", ] -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.96", -] - [[package]] name = "async-trait" version = "0.1.85" @@ -264,11 +257,10 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ - "async-trait", "axum-core", "bytes", "futures-util", @@ -281,29 +273,26 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "sync_wrapper", - "tower 0.5.2", + "tower", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.4.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ - "async-trait", "bytes", - "futures-util", + "futures-core", "http", "http-body", "http-body-util", "mime", "pin-project-lite", - "rustversion", "sync_wrapper", "tower-layer", "tower-service", @@ -676,7 +665,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -766,6 +755,17 @@ dependencies = [ "cc", ] +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + [[package]] name = "colorchoice" version = "1.0.3" @@ -799,22 +799,23 @@ dependencies = [ [[package]] name = "console-api" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8030735ecb0d128428b64cd379809817e620a40e5001c54465b99ec5feec2857" +checksum = "e8599749b6667e2f0c910c1d0dff6901163ff698a52d5a39720f61b5be4b20d3" dependencies = [ "futures-core", - "prost", + "prost 0.14.3", "prost-types", "tonic", + "tonic-prost", "tracing-core", ] [[package]] name = "console-subscriber" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6539aa9c6a4cd31f4b1c040f860a1eac9aa80e7df6b05d506a6e7179936d6a01" +checksum = "fb4915b7d8dd960457a1b6c380114c2944f728e7c65294ab247ae6b6f1f37592" dependencies = [ "console-api", "crossbeam-channel", @@ -823,7 +824,7 @@ dependencies = [ "hdrhistogram", "humantime", "hyper-util", - "prost", + "prost 0.14.3", "prost-types", "serde", "serde_json", @@ -1053,6 +1054,68 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a74858bcfe44b22016cb49337d7b6f04618c58e5dbfdef61b06b8c434324a0bc" +[[package]] +name = "cxx" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbda285ba6e5866529faf76352bdf73801d9b44a6308d7cd58ca2379f378e994" +dependencies = [ + "cc", + "cxx-build", + "cxxbridge-cmd", + "cxxbridge-flags", + "cxxbridge-macro", + "foldhash 0.2.0", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9efde466c5d532d57efd92f861da3bdb7f61e369128ce8b4c3fe0c9de4fa4d" +dependencies = [ + "cc", + "codespan-reporting", + "indexmap 2.12.0", + "proc-macro2", + "quote", + "scratch", + "syn 2.0.96", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3efb93799095bccd4f763ca07997dc39a69e5e61ab52d2c407d4988d21ce144d" +dependencies = [ + "clap", + "codespan-reporting", + "indexmap 2.12.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3092010228026e143b32a4463ed9fa8f86dca266af4bf5f3b2a26e113dbe4e45" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.192" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31d72ebfcd351ae404fb00ff378dfc9571827a00722c9e735c9181aec320ba0a" +dependencies = [ + "indexmap 2.12.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "darling" version = "0.20.10" @@ -1186,7 +1249,7 @@ dependencies = [ "lazy_static", "libc 0.2.177", "libdd-alloc", - "libdd-common 1.0.0 (git+https://github.com/DataDog/libdatadog?tag=v24.0.2)", + "libdd-common 1.0.0 (git+https://github.com/DataDog/libdatadog?tag=v25.0.0)", "libdd-library-config-ffi", "libdd-profiling", "log", @@ -1383,6 +1446,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derive_arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "diff" version = "0.1.13" @@ -1546,9 +1620,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fixedbitset" -version = "0.4.2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" @@ -1581,6 +1655,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1869,7 +1949,7 @@ checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -2121,7 +2201,7 @@ dependencies = [ "hyper", "libc 0.2.177", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -2441,7 +2521,7 @@ checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libdd-alloc" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" +source = "git+https://github.com/DataDog/libdatadog?tag=v25.0.0#5974f2e7b7453992aadda817e2bb36eb2555ce2c" dependencies = [ "allocator-api2", "libc 0.2.177", @@ -2486,7 +2566,7 @@ dependencies = [ [[package]] name = "libdd-common" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" +source = "git+https://github.com/DataDog/libdatadog?tag=v25.0.0#5974f2e7b7453992aadda817e2bb36eb2555ce2c" dependencies = [ "anyhow", "cc", @@ -2521,10 +2601,12 @@ name = "libdd-common-ffi" version = "0.0.1" dependencies = [ "anyhow", + "assert_no_alloc", "bolero", "build_common", "chrono", "crossbeam-queue", + "function_name", "hyper", "libdd-common 1.0.0", "serde", @@ -2540,6 +2622,8 @@ dependencies = [ "cc", "chrono", "criterion", + "cxx", + "cxx-build", "goblin", "http", "libc 0.2.177", @@ -2624,7 +2708,7 @@ dependencies = [ name = "libdd-ddsketch" version = "1.0.0" dependencies = [ - "prost", + "prost 0.14.3", "prost-build", "protoc-bin-vendored", ] @@ -2683,29 +2767,34 @@ dependencies = [ [[package]] name = "libdd-profiling" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" +source = "git+https://github.com/DataDog/libdatadog?tag=v25.0.0#5974f2e7b7453992aadda817e2bb36eb2555ce2c" dependencies = [ + "allocator-api2", "anyhow", "bitmaps", "byteorder", "bytes", "chrono", + "crossbeam-utils", "futures", + "hashbrown 0.16.0", "http", "http-body-util", "hyper", "hyper-multipart-rfc7578", "indexmap 2.12.0", "libdd-alloc", - "libdd-common 1.0.0 (git+https://github.com/DataDog/libdatadog?tag=v24.0.2)", + "libdd-common 1.0.0 (git+https://github.com/DataDog/libdatadog?tag=v25.0.0)", "libdd-profiling-protobuf", "lz4_flex", "mime", - "prost", + "parking_lot", + "prost 0.13.5", "rustc-hash", "serde", "serde_json", "target-triple", + "thiserror 2.0.12", "tokio", "tokio-util", "zstd", @@ -2714,9 +2803,9 @@ dependencies = [ [[package]] name = "libdd-profiling-protobuf" version = "1.0.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v24.0.2#d0393310c6e86ed7eb120c6cb6255f4f6eab1b9b" +source = "git+https://github.com/DataDog/libdatadog?tag=v25.0.0#5974f2e7b7453992aadda817e2bb36eb2555ce2c" dependencies = [ - "prost", + "prost 0.13.5", ] [[package]] @@ -2778,6 +2867,7 @@ name = "libdd-trace-normalization" version = "1.0.0" dependencies = [ "anyhow", + "arbitrary", "criterion", "duplicate", "libdd-trace-protobuf", @@ -2788,7 +2878,7 @@ dependencies = [ name = "libdd-trace-protobuf" version = "1.0.0" dependencies = [ - "prost", + "prost 0.14.3", "prost-build", "protoc-bin-vendored", "serde", @@ -2821,6 +2911,7 @@ dependencies = [ "criterion", "flate2", "futures", + "http", "http-body-util", "httpmock", "hyper", @@ -2830,7 +2921,7 @@ dependencies = [ "libdd-trace-normalization", "libdd-trace-protobuf", "libdd-trace-utils", - "prost", + "prost 0.14.3", "rand 0.8.5", "rmp", "rmp-serde", @@ -2860,12 +2951,27 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "link-cplusplus" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82" +dependencies = [ + "cc", +] + [[package]] name = "linux-raw-sys" version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + [[package]] name = "litemap" version = "0.7.4" @@ -2923,9 +3029,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "memchr" @@ -2939,7 +3045,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix", + "rustix 0.38.43", ] [[package]] @@ -3332,11 +3438,12 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.5" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", + "hashbrown 0.15.2", "indexmap 2.12.0", ] @@ -3595,23 +3702,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.13.5", +] + +[[package]] +name = "prost" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +dependencies = [ + "bytes", + "prost-derive 0.14.3", ] [[package]] name = "prost-build" -version = "0.13.5" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ "heck 0.5.0", "itertools 0.12.1", "log", "multimap", - "once_cell", "petgraph", "prettyplease", - "prost", + "prost 0.14.3", "prost-types", "regex", "syn 2.0.96", @@ -3631,13 +3747,26 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "prost-derive" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +dependencies = [ + "anyhow", + "itertools 0.12.1", + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "prost-types" -version = "0.13.5" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" dependencies = [ - "prost", + "prost 0.14.3", ] [[package]] @@ -4033,7 +4162,20 @@ dependencies = [ "bitflags 2.8.0", "errno", "libc 0.2.177", - "linux-raw-sys", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +dependencies = [ + "bitflags 2.8.0", + "errno", + "libc 0.2.177", + "linux-raw-sys 0.11.0", "windows-sys 0.59.0", ] @@ -4153,6 +4295,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "scratch" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2" + [[package]] name = "scroll" version = "0.12.0" @@ -4456,6 +4604,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc 0.2.177", + "windows-sys 0.60.2", +] + [[package]] name = "spawn_worker" version = "0.0.1" @@ -4649,15 +4807,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.15.0" +version = "3.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" +checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" dependencies = [ - "cfg-if", "fastrand", - "getrandom 0.2.15", + "getrandom 0.3.2", "once_cell", - "rustix", + "rustix 1.1.3", "windows-sys 0.59.0", ] @@ -4817,28 +4974,27 @@ dependencies = [ [[package]] name = "tokio" -version = "1.43.0" +version = "1.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" dependencies = [ - "backtrace", "bytes", "libc 0.2.177", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.6.1", "tokio-macros", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", @@ -4945,11 +5101,10 @@ dependencies = [ [[package]] name = "tonic" -version = "0.12.3" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" dependencies = [ - "async-stream", "async-trait", "axum", "base64 0.22.1", @@ -4963,34 +5118,25 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "prost", - "socket2", + "socket2 0.6.1", + "sync_wrapper", "tokio", "tokio-stream", - "tower 0.4.13", + "tower", "tower-layer", "tower-service", "tracing", ] [[package]] -name = "tower" -version = "0.4.13" +name = "tonic-prost" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", + "bytes", + "prost 0.14.3", + "tonic", ] [[package]] @@ -5001,10 +5147,15 @@ checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", + "indexmap 2.12.0", "pin-project-lite", + "slab", "sync_wrapper", + "tokio", + "tokio-util", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -5393,7 +5544,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix", + "rustix 0.38.43", ] [[package]] @@ -5465,7 +5616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" dependencies = [ "windows-core 0.59.0", - "windows-targets 0.53.0", + "windows-targets 0.53.5", ] [[package]] @@ -5496,7 +5647,7 @@ dependencies = [ "windows-interface", "windows-result", "windows-strings", - "windows-targets 0.53.0", + "windows-targets 0.53.5", ] [[package]] @@ -5527,13 +5678,19 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-result" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -5542,7 +5699,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" dependencies = [ - "windows-link", + "windows-link 0.1.1", ] [[package]] @@ -5587,6 +5744,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -5620,10 +5795,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ + "windows-link 0.2.1", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", diff --git a/Makefile b/Makefile index d1c80341eba..8725e961fae 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ RUN_TESTS_CMD := DD_SERVICE= DD_ENV= REPORT_EXIT_STATUS=1 TEST_PHP_SRCDIR=$(PROJ C_FILES = $(shell find components components-rs ext src/dogstatsd zend_abstract_interface -name '*.c' -o -name '*.h' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) TEST_FILES = $(shell find tests/ext -name '*.php*' -o -name '*.inc' -o -name '*.json' -o -name '*.yaml' -o -name 'CONFLICTS' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) -RUST_FILES = $(BUILD_DIR)/Cargo.toml $(BUILD_DIR)/Cargo.lock $(shell find components-rs -name '*.c' -o -name '*.rs' -o -name 'Cargo.toml' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) $(shell find libdatadog/{build-common,datadog-ipc,datadog-ipc-macros,datadog-live-debugger,datadog-live-debugger-ffi,datadog-remote-config,datadog-sidecar,datadog-sidecar-ffi,datadog-sidecar-macros,libdd-alloc,libdd-common,libdd-common-ffi,libdd-crashtracker,libdd-crashtracker-ffi,libdd-data-pipeline,libdd-ddsketch,libdd-dogstatsd-client,libdd-library-config,libdd-library-config-ffi,libdd-log,libdd-telemetry,libdd-telemetry-ffi,libdd-tinybytes,libdd-trace-*,spawn_worker,tools/{cc_utils,sidecar_mockgen},datadog-trace-*,Cargo.toml} \( -type l -o -type f \) \( -path "*/src*" -o -path "*/examples*" -o -path "*Cargo.toml" -o -path "*/build.rs" -o -path "*/tests/dataservice.rs" -o -path "*/tests/service_functional.rs" \) -not -path "*/datadog-ipc/build.rs" -not -path "*/datadog-sidecar-ffi/build.rs") +RUST_FILES = $(BUILD_DIR)/Cargo.toml $(BUILD_DIR)/Cargo.lock $(shell find components-rs -name '*.c' -o -name '*.rs' -o -name 'Cargo.toml' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) $(shell find libdatadog/{build-common,datadog-ipc,datadog-ipc-macros,datadog-live-debugger,datadog-live-debugger-ffi,datadog-remote-config,datadog-sidecar,datadog-sidecar-ffi,datadog-sidecar-macros,libdd-alloc,libdd-common,libdd-common-ffi,libdd-crashtracker,libdd-crashtracker-ffi,libdd-data-pipeline,libdd-ddsketch,libdd-dogstatsd-client,libdd-library-config,libdd-library-config-ffi,libdd-log,libdd-telemetry,libdd-telemetry-ffi,libdd-tinybytes,libdd-trace-*,spawn_worker,tools/{cc_utils,sidecar_mockgen},libdd-trace-*,Cargo.toml} \( -type l -o -type f \) \( -path "*/src*" -o -path "*/examples*" -o -path "*Cargo.toml" -o -path "*/build.rs" -o -path "*/tests/dataservice.rs" -o -path "*/tests/service_functional.rs" \) -not -path "*/datadog-ipc/build.rs" -not -path "*/datadog-sidecar-ffi/build.rs") ALL_OBJECT_FILES = $(C_FILES) $(RUST_FILES) $(BUILD_DIR)/Makefile TEST_OPCACHE_FILES = $(shell find tests/opcache -name '*.php*' -o -name '.gitkeep' | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) TEST_STUB_FILES = $(shell find tests/ext -type d -name 'stubs' -exec find '{}' -type f \; | awk '{ printf "$(BUILD_DIR)/%s\n", $$1 }' ) diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index c572bceea84..899a0efa45b 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -143,6 +143,7 @@ pub unsafe extern "C" fn ddog_sidecar_telemetry_enqueueConfig_buffer( value: config_value.to_utf8_lossy().into_owned(), origin, config_id, + seq_id: None, }); buffer.buffer.push(SidecarAction::Telemetry(action)); } diff --git a/libdatadog b/libdatadog index 629bce09547..77838bbd064 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 629bce09547abc77d7bbda623921f97eb5611949 +Subproject commit 77838bbd064988647e0588f6c9984388086e7dff diff --git a/profiling/Cargo.toml b/profiling/Cargo.toml index 364867b2fa1..a2d182de4ba 100644 --- a/profiling/Cargo.toml +++ b/profiling/Cargo.toml @@ -22,9 +22,9 @@ cfg-if = { version = "1.0" } cpu-time = { version = "1.0" } chrono = { version = "0.4" } crossbeam-channel = { version = "0.5", default-features = false, features = ["std"] } -libdd-alloc = { git = "https://github.com/DataDog/libdatadog", tag = "v24.0.2" } -libdd-profiling = { git = "https://github.com/DataDog/libdatadog", tag = "v24.0.2" } -libdd-common = { git = "https://github.com/DataDog/libdatadog", tag = "v24.0.2" } +libdd-alloc = { git = "https://github.com/DataDog/libdatadog", tag = "v25.0.0" } +libdd-profiling = { git = "https://github.com/DataDog/libdatadog", tag = "v25.0.0" } +libdd-common = { git = "https://github.com/DataDog/libdatadog", tag = "v25.0.0" } libdd-library-config-ffi = { path = "../libdatadog/libdd-library-config-ffi" } env_logger = { version = "0.11", default-features = false } lazy_static = { version = "1.4" } diff --git a/profiling/src/profiling/uploader.rs b/profiling/src/profiling/uploader.rs index e175d778739..4ba6da2e2be 100644 --- a/profiling/src/profiling/uploader.rs +++ b/profiling/src/profiling/uploader.rs @@ -88,6 +88,7 @@ impl Uploader { &[], &[], None, + None, #[cfg(feature = "debug_stats")] Self::create_internal_metadata(), #[cfg(not(feature = "debug_stats"))] diff --git a/tests/ext/appsec/sca_flag_is_sent_01.phpt b/tests/ext/appsec/sca_flag_is_sent_01.phpt index caf86587535..81c0435fd08 100644 --- a/tests/ext/appsec/sca_flag_is_sent_01.phpt +++ b/tests/ext/appsec/sca_flag_is_sent_01.phpt @@ -17,7 +17,7 @@ datadog.trace.agent_url="file://{PWD}/sca_flag_is_sent_01-telemetry.out" --FILE_EXTERNAL-- sca_test.inc --EXPECT-- -array(4) { +array(5) { ["name"]=> string(18) "appsec.sca_enabled" ["value"]=> @@ -26,6 +26,8 @@ array(4) { string(7) "default" ["config_id"]=> NULL + ["seq_id"]=> + NULL } string(4) "Sent" --CLEAN-- diff --git a/tests/ext/appsec/sca_flag_is_sent_02.phpt b/tests/ext/appsec/sca_flag_is_sent_02.phpt index e513fed5217..8de04fd4f85 100644 --- a/tests/ext/appsec/sca_flag_is_sent_02.phpt +++ b/tests/ext/appsec/sca_flag_is_sent_02.phpt @@ -18,7 +18,7 @@ datadog.trace.agent_url="file://{PWD}/sca_flag_is_sent_02-telemetry.out" --FILE_EXTERNAL-- sca_test.inc --EXPECT-- -array(4) { +array(5) { ["name"]=> string(18) "appsec.sca_enabled" ["value"]=> @@ -27,6 +27,8 @@ array(4) { string(7) "env_var" ["config_id"]=> NULL + ["seq_id"]=> + NULL } string(4) "Sent" --CLEAN-- diff --git a/tests/ext/appsec/sca_flag_is_sent_03.phpt b/tests/ext/appsec/sca_flag_is_sent_03.phpt index 16a87179696..da0cde87036 100644 --- a/tests/ext/appsec/sca_flag_is_sent_03.phpt +++ b/tests/ext/appsec/sca_flag_is_sent_03.phpt @@ -18,7 +18,7 @@ datadog.trace.agent_url="file://{PWD}/sca_flag_is_sent_03-telemetry.out" --FILE_EXTERNAL-- sca_test.inc --EXPECT-- -array(4) { +array(5) { ["name"]=> string(18) "appsec.sca_enabled" ["value"]=> @@ -27,6 +27,8 @@ array(4) { string(7) "env_var" ["config_id"]=> NULL + ["seq_id"]=> + NULL } string(4) "Sent" --CLEAN-- diff --git a/tests/ext/appsec/sca_flag_is_sent_04.phpt b/tests/ext/appsec/sca_flag_is_sent_04.phpt index c70843f91d3..f2d0abb4944 100644 --- a/tests/ext/appsec/sca_flag_is_sent_04.phpt +++ b/tests/ext/appsec/sca_flag_is_sent_04.phpt @@ -18,7 +18,7 @@ datadog.appsec.sca_enabled=1 --FILE_EXTERNAL-- sca_test.inc --EXPECT-- -array(4) { +array(5) { ["name"]=> string(18) "appsec.sca_enabled" ["value"]=> @@ -27,6 +27,8 @@ array(4) { string(7) "env_var" ["config_id"]=> NULL + ["seq_id"]=> + NULL } string(4) "Sent" --CLEAN-- diff --git a/tests/ext/appsec/sca_flag_is_sent_05.phpt b/tests/ext/appsec/sca_flag_is_sent_05.phpt index 76f4ee0c4a9..a51dfa6b76e 100644 --- a/tests/ext/appsec/sca_flag_is_sent_05.phpt +++ b/tests/ext/appsec/sca_flag_is_sent_05.phpt @@ -18,7 +18,7 @@ datadog.appsec.sca_enabled=0 --FILE_EXTERNAL-- sca_test.inc --EXPECT-- -array(4) { +array(5) { ["name"]=> string(18) "appsec.sca_enabled" ["value"]=> @@ -27,6 +27,8 @@ array(4) { string(7) "env_var" ["config_id"]=> NULL + ["seq_id"]=> + NULL } string(4) "Sent" --CLEAN-- diff --git a/tests/ext/library_config/fleet_config.phpt b/tests/ext/library_config/fleet_config.phpt index fa92ae20739..314803fcea8 100644 --- a/tests/ext/library_config/fleet_config.phpt +++ b/tests/ext/library_config/fleet_config.phpt @@ -76,7 +76,7 @@ DD_DYNAMIC_INSTRUMENTATION_ENABLED: true ------ Telemetry ------ array(5) { [0]=> - array(4) { + array(5) { ["name"]=> string(3) "env" ["value"]=> @@ -85,9 +85,11 @@ array(5) { string(19) "fleet_stable_config" ["config_id"]=> string(15) "42_fleet_config" + ["seq_id"]=> + NULL } [1]=> - array(4) { + array(5) { ["name"]=> string(7) "service" ["value"]=> @@ -96,9 +98,11 @@ array(5) { string(19) "fleet_stable_config" ["config_id"]=> string(15) "42_fleet_config" + ["seq_id"]=> + NULL } [2]=> - array(4) { + array(5) { ["name"]=> string(24) "trace.generate_root_span" ["value"]=> @@ -107,9 +111,11 @@ array(5) { string(7) "default" ["config_id"]=> NULL + ["seq_id"]=> + NULL } [3]=> - array(4) { + array(5) { ["name"]=> string(17) "trace.spans_limit" ["value"]=> @@ -118,9 +124,11 @@ array(5) { string(7) "env_var" ["config_id"]=> NULL + ["seq_id"]=> + NULL } [4]=> - array(4) { + array(5) { ["name"]=> string(31) "dynamic_instrumentation.enabled" ["value"]=> @@ -129,6 +137,8 @@ array(5) { string(19) "fleet_stable_config" ["config_id"]=> string(15) "42_fleet_config" + ["seq_id"]=> + NULL } } --CLEAN-- diff --git a/tests/ext/library_config/local_config.phpt b/tests/ext/library_config/local_config.phpt index fdcae9887a2..a632d91c390 100644 --- a/tests/ext/library_config/local_config.phpt +++ b/tests/ext/library_config/local_config.phpt @@ -76,7 +76,7 @@ DD_DYNAMIC_INSTRUMENTATION_ENABLED: true ------ Telemetry ------ array(5) { [0]=> - array(4) { + array(5) { ["name"]=> string(3) "env" ["value"]=> @@ -85,9 +85,11 @@ array(5) { string(19) "local_stable_config" ["config_id"]=> string(15) "42_local_config" + ["seq_id"]=> + NULL } [1]=> - array(4) { + array(5) { ["name"]=> string(7) "service" ["value"]=> @@ -96,9 +98,11 @@ array(5) { string(19) "local_stable_config" ["config_id"]=> string(15) "42_local_config" + ["seq_id"]=> + NULL } [2]=> - array(4) { + array(5) { ["name"]=> string(24) "trace.generate_root_span" ["value"]=> @@ -107,9 +111,11 @@ array(5) { string(7) "default" ["config_id"]=> NULL + ["seq_id"]=> + NULL } [3]=> - array(4) { + array(5) { ["name"]=> string(17) "trace.spans_limit" ["value"]=> @@ -118,9 +124,11 @@ array(5) { string(7) "env_var" ["config_id"]=> NULL + ["seq_id"]=> + NULL } [4]=> - array(4) { + array(5) { ["name"]=> string(31) "dynamic_instrumentation.enabled" ["value"]=> @@ -129,6 +137,8 @@ array(5) { string(19) "local_stable_config" ["config_id"]=> string(15) "42_local_config" + ["seq_id"]=> + NULL } } --CLEAN-- diff --git a/tests/ext/telemetry/config.phpt b/tests/ext/telemetry/config.phpt index 73bb684554f..5987426ca13 100644 --- a/tests/ext/telemetry/config.phpt +++ b/tests/ext/telemetry/config.phpt @@ -74,6 +74,7 @@ Array [value] => file://%s/config-telemetry.out [origin] => env_var [config_id] => + [seq_id] => ) [1] => Array @@ -82,6 +83,7 @@ Array [value] => 1 [origin] => env_var [config_id] => + [seq_id] => ) [2] => Array @@ -90,6 +92,7 @@ Array [value] => 1 [origin] => env_var [config_id] => + [seq_id] => ) [3] => Array @@ -98,6 +101,7 @@ Array [value] => 0 [origin] => env_var [config_id] => + [seq_id] => ) [4] => Array @@ -106,6 +110,7 @@ Array [value] => 0 [origin] => env_var [config_id] => + [seq_id] => ) [5] => Array @@ -114,6 +119,7 @@ Array [value] => False [origin] => env_var [config_id] => + [seq_id] => ) ) From b83716e8ed05922dfa9391c96abda8d09aed464d Mon Sep 17 00:00:00 2001 From: Louis Tricot Date: Tue, 13 Jan 2026 15:07:53 +0100 Subject: [PATCH 2/8] fix ci --- compile_rust.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/compile_rust.sh b/compile_rust.sh index 8e88267ea72..fe62f8c304e 100755 --- a/compile_rust.sh +++ b/compile_rust.sh @@ -2,9 +2,7 @@ cd components-rs RUSTFLAGS="${RUSTFLAGS:-} --cfg tokio_unstable" -if if test -z "${host_os:-}"; then case "${host_os}" in linux*) true;; *) false; esac else test "$(uname -s)" = "Linux"; fi then - RUSTFLAGS="$RUSTFLAGS --cfg tokio_taskdump" -fi + if test -n "$SHARED"; then RUSTFLAGS="$RUSTFLAGS --cfg php_shared_build" fi From bd9d03808504ab7d7e40c87b5e07cad5e2f49bc2 Mon Sep 17 00:00:00 2001 From: Louis Tricot Date: Tue, 13 Jan 2026 15:58:16 +0100 Subject: [PATCH 3/8] fix loader test --- loader/tests/functional/test_configuration_telemetry.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/loader/tests/functional/test_configuration_telemetry.php b/loader/tests/functional/test_configuration_telemetry.php index fe77c965d12..6a15c892a45 100644 --- a/loader/tests/functional/test_configuration_telemetry.php +++ b/loader/tests/functional/test_configuration_telemetry.php @@ -19,6 +19,6 @@ usleep(10000); $content = file_get_contents($telemetryLogPath); -assertContains($content, '{"name":"instrumentation_source","value":"ssi","origin":"default","config_id":null}'); -assertContains($content, '{"name":"ssi_injection_enabled","value":"tracer","origin":"env_var","config_id":null}'); -assertContains($content, '{"name":"ssi_forced_injection_enabled","value":"True","origin":"env_var","config_id":null}'); +assertContains($content, '{"name":"instrumentation_source","value":"ssi","origin":"default","config_id":null,"seq_id":null}'); +assertContains($content, '{"name":"ssi_injection_enabled","value":"tracer","origin":"env_var","config_id":null,"seq_id":null}'); +assertContains($content, '{"name":"ssi_forced_injection_enabled","value":"True","origin":"env_var","config_id":null,"seq_id":null}'); From fc8378e772eb83a4ce0ffdadc7611fb81c953968 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 13 Jan 2026 20:13:34 +0100 Subject: [PATCH 4/8] Downgrade tempfile Signed-off-by: Bob Weinand --- Cargo.lock | 34 ++++++++-------------------------- Makefile | 4 +--- libdatadog | 2 +- tooling/bin/pecl-build | 2 +- 4 files changed, 11 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 58e82355890..23b31325ab2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2966,12 +2966,6 @@ version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - [[package]] name = "litemap" version = "0.7.4" @@ -3045,7 +3039,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" dependencies = [ - "rustix 0.38.43", + "rustix", ] [[package]] @@ -4162,20 +4156,7 @@ dependencies = [ "bitflags 2.8.0", "errno", "libc 0.2.177", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" -dependencies = [ - "bitflags 2.8.0", - "errno", - "libc 0.2.177", - "linux-raw-sys 0.11.0", + "linux-raw-sys", "windows-sys 0.59.0", ] @@ -4807,14 +4788,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.24.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c" +checksum = "9a8a559c81686f576e8cd0290cd2a24a2a9ad80c98b3478856500fcbd7acd704" dependencies = [ + "cfg-if", "fastrand", - "getrandom 0.3.2", + "getrandom 0.2.15", "once_cell", - "rustix 1.1.3", + "rustix", "windows-sys 0.59.0", ] @@ -5544,7 +5526,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.43", + "rustix", ] [[package]] diff --git a/Makefile b/Makefile index 8725e961fae..25618a0b35c 100644 --- a/Makefile +++ b/Makefile @@ -500,9 +500,7 @@ $(PACKAGES_BUILD_DIR)/datadog-setup.php: $(PACKAGES_BUILD_DIR) $(PACKAGES_BUILD_DIR) build_pecl_package: - BUILD_DIR='$(BUILD_DIR)/'; \ - FILES="$(C_FILES) $(RUST_FILES) $(TEST_FILES) $(TEST_STUB_FILES) $(M4_FILES) Cargo.lock"; \ - tooling/bin/pecl-build $${FILES//$${BUILD_DIR}/} + echo $(subst $(BUILD_DIR)/,,$(C_FILES) $(RUST_FILES) $(TEST_FILES) $(TEST_STUB_FILES) $(M4_FILES) Cargo.lock) | tooling/bin/pecl-build dbgsym.tar.gz: $(PACKAGES_BUILD_DIR) $(if $(DDTRACE_MAKE_PACKAGES_ASAN), , tar -zcf $(PACKAGES_BUILD_DIR)/dd-library-php-$(VERSION)_windows_debugsymbols.tar.gz ./extensions_x86_64_debugsymbols --owner=0 --group=0) diff --git a/libdatadog b/libdatadog index 77838bbd064..65a5d9af8c9 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 77838bbd064988647e0588f6c9984388086e7dff +Subproject commit 65a5d9af8c9931f8ecbf2db8729fabbc3881fb07 diff --git a/tooling/bin/pecl-build b/tooling/bin/pecl-build index a68275832ea..4c82e6ec4ac 100755 --- a/tooling/bin/pecl-build +++ b/tooling/bin/pecl-build @@ -19,7 +19,7 @@ configuration_placeholder=' ' codefiles="" -for file in "$@"; do +for file in $(cat); do # cat to read from STDIN codefiles="${codefiles}"$'\n $configuration_placeholder" || echo "/>")" done From b4cbab012f14d5aed175203cfc5db85cae500361 Mon Sep 17 00:00:00 2001 From: Alexandre Rulleau Date: Tue, 13 Jan 2026 11:34:58 +0100 Subject: [PATCH 5/8] feat(tracer): add configuration for connection mode Signed-off-by: Alexandre Rulleau --- ext/configuration.c | 15 +++++++++++++++ ext/configuration.h | 7 +++++++ ext/ddtrace_arginfo.h | 3 +++ 3 files changed, 25 insertions(+) diff --git a/ext/configuration.c b/ext/configuration.c index 5e6e0bfca77..71fa4c0951a 100644 --- a/ext/configuration.c +++ b/ext/configuration.c @@ -96,6 +96,21 @@ static bool dd_parse_sampling_rules_format(zai_str value, zval *decoded_value, b return true; } +static bool dd_parse_sidecar_connection_mode(zai_str value, zval *decoded_value, bool persistent) { + UNUSED(persistent); + if (zai_str_eq_ci_cstr(value, "auto")) { + ZVAL_LONG(decoded_value, DD_TRACE_SIDECAR_CONNECTION_MODE_AUTO); + } else if (zai_str_eq_ci_cstr(value, "subprocess")) { + ZVAL_LONG(decoded_value, DD_TRACE_SIDECAR_CONNECTION_MODE_SUBPROCESS); + } else if (zai_str_eq_ci_cstr(value, "thread")) { + ZVAL_LONG(decoded_value, DD_TRACE_SIDECAR_CONNECTION_MODE_THREAD); + } else { + return false; + } + + return true; +} + static bool dd_parse_tags(zai_str value, zval *decoded_value, bool persistent) { ZVAL_ARR(decoded_value, pemalloc(sizeof(HashTable), persistent)); zend_hash_init(Z_ARR_P(decoded_value), 8, NULL, persistent ? ZVAL_INTERNAL_PTR_DTOR : ZVAL_PTR_DTOR, persistent); diff --git a/ext/configuration.h b/ext/configuration.h index 362591df462..49e1a46f737 100644 --- a/ext/configuration.h +++ b/ext/configuration.h @@ -30,6 +30,12 @@ enum ddtrace_sampling_rules_format { DD_TRACE_SAMPLING_RULES_FORMAT_GLOB }; +enum ddtrace_sidecar_connection_mode { + DD_TRACE_SIDECAR_CONNECTION_MODE_AUTO = 0, // Default: try subprocess, fallback to thread + DD_TRACE_SIDECAR_CONNECTION_MODE_SUBPROCESS = 1, // Force subprocess only + DD_TRACE_SIDECAR_CONNECTION_MODE_THREAD = 2, // Force thread only +}; + /* From the curl docs on CONNECT_TIMEOUT_MS: * If libcurl is built to use the standard system name resolver, that * portion of the transfer will still use full-second resolution for @@ -225,6 +231,7 @@ enum ddtrace_sampling_rules_format { CONFIG(STRING, DD_TRACE_AGENT_TEST_SESSION_TOKEN, "", .ini_change = ddtrace_alter_test_session_token) \ CONFIG(BOOL, DD_TRACE_PROPAGATE_USER_ID_DEFAULT, "false") \ CONFIG(CUSTOM(INT), DD_DBM_PROPAGATION_MODE, "disabled", .parser = dd_parse_dbm_mode) \ + CONFIG(CUSTOM(INT), DD_TRACE_SIDECAR_CONNECTION_MODE, "auto", .parser = dd_parse_sidecar_connection_mode) \ CONFIG(SET, DD_TRACE_WORDPRESS_ADDITIONAL_ACTIONS, "") \ CONFIG(BOOL, DD_TRACE_WORDPRESS_CALLBACKS, "true") \ CONFIG(BOOL, DD_INTEGRATION_METRICS_ENABLED, "true", \ diff --git a/ext/ddtrace_arginfo.h b/ext/ddtrace_arginfo.h index 9c005f69d09..a782ea94b39 100644 --- a/ext/ddtrace_arginfo.h +++ b/ext/ddtrace_arginfo.h @@ -541,6 +541,9 @@ static void register_ddtrace_symbols(int module_number) REGISTER_LONG_CONSTANT("DDTrace\\DBM_PROPAGATION_DISABLED", DD_TRACE_DBM_PROPAGATION_DISABLED, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DDTrace\\DBM_PROPAGATION_SERVICE", DD_TRACE_DBM_PROPAGATION_SERVICE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DDTrace\\DBM_PROPAGATION_FULL", DD_TRACE_DBM_PROPAGATION_FULL, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("DDTrace\\SIDECAR_CONNECTION_MODE_AUTO", DD_TRACE_SIDECAR_CONNECTION_MODE_AUTO, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("DDTrace\\SIDECAR_CONNECTION_MODE_SUBPROCESS", DD_TRACE_SIDECAR_CONNECTION_MODE_SUBPROCESS, CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("DDTrace\\SIDECAR_CONNECTION_MODE_THREAD", DD_TRACE_SIDECAR_CONNECTION_MODE_THREAD, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DDTrace\\Internal\\SPAN_FLAG_OPENTELEMETRY", DDTRACE_SPAN_FLAG_OPENTELEMETRY, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("DDTrace\\Internal\\SPAN_FLAG_OPENTRACING", DDTRACE_SPAN_FLAG_OPENTRACING, CONST_PERSISTENT); REGISTER_STRING_CONSTANT("DD_TRACE_VERSION", PHP_DDTRACE_VERSION, CONST_PERSISTENT); From 1169cf270a7df6380ab763757704477244fe3d71 Mon Sep 17 00:00:00 2001 From: Alexandre Rulleau Date: Tue, 13 Jan 2026 11:35:17 +0100 Subject: [PATCH 6/8] feat(tracer): add sidecar thread listener module Signed-off-by: Alexandre Rulleau --- components-rs/ddtrace.h | 10 ++++++++++ components-rs/sidecar.h | 38 ++++++++++++++++++++++++++++++++++++++ libdatadog | 2 +- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index 35d06a61820..6fe1ee39216 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -116,6 +116,16 @@ ddog_MaybeError ddog_sidecar_connect_php(struct ddog_SidecarTransport **connecti void ddtrace_sidecar_reconnect(struct ddog_SidecarTransport **transport, struct ddog_SidecarTransport *(*factory)(void)); +// Thread-based sidecar connection (Unix only) +#if !defined(_WIN32) +ddog_MaybeError ddog_sidecar_connect_master(int32_t pid); +ddog_MaybeError ddog_sidecar_connect_worker(int32_t pid, + struct ddog_SidecarTransport **connection); +ddog_MaybeError ddog_sidecar_shutdown_master_listener(void); +bool ddog_sidecar_is_master_listener_active(int32_t pid); +ddog_MaybeError ddog_sidecar_clear_inherited_listener(void); +#endif + bool ddog_shm_limiter_inc(const struct ddog_MaybeShmLimiter *limiter, uint32_t limit); bool ddog_exception_hash_limiter_inc(struct ddog_SidecarTransport *connection, diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 4746e0d2163..2701a73cd8e 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -92,6 +92,44 @@ void ddog_sidecar_transport_drop(struct ddog_SidecarTransport*); */ ddog_MaybeError ddog_sidecar_connect(struct ddog_SidecarTransport **connection); +/** + * Start master listener thread for thread-based connections (Unix only). + * + * This spawns a listener thread that accepts worker connections. + */ +#if !defined(_WIN32) +ddog_MaybeError ddog_sidecar_connect_master(int32_t pid); +#endif + +/** + * Connect as worker to master listener thread (Unix only). + */ +#if !defined(_WIN32) +ddog_MaybeError ddog_sidecar_connect_worker(int32_t pid, + struct ddog_SidecarTransport **connection); +#endif + +/** + * Shutdown the master listener thread (Unix only). + */ +#if !defined(_WIN32) +ddog_MaybeError ddog_sidecar_shutdown_master_listener(void); +#endif + +/** + * Check if master listener is active for the given PID (Unix only). + */ +#if !defined(_WIN32) +bool ddog_sidecar_is_master_listener_active(int32_t pid); +#endif + +/** + * Clear inherited master listener state in child after fork (Unix only). + */ +#if !defined(_WIN32) +ddog_MaybeError ddog_sidecar_clear_inherited_listener(void); +#endif + ddog_MaybeError ddog_sidecar_ping(struct ddog_SidecarTransport **transport); ddog_MaybeError ddog_sidecar_flush_traces(struct ddog_SidecarTransport **transport); diff --git a/libdatadog b/libdatadog index 65a5d9af8c9..917aceb6f89 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 65a5d9af8c9931f8ecbf2db8729fabbc3881fb07 +Subproject commit 917aceb6f89db35e6a4f50f1f35c17747a07d6fc From ab050fe821898f379a5f37764ef2d9de727f98a0 Mon Sep 17 00:00:00 2001 From: Alexandre Rulleau Date: Tue, 13 Jan 2026 12:10:00 +0100 Subject: [PATCH 7/8] feat(tracer): implement threaded connection fallback Signed-off-by: Alexandre Rulleau --- ext/ddtrace.c | 22 ++++- ext/handlers_pcntl.c | 9 ++ ext/sidecar.c | 216 ++++++++++++++++++++++++++++++++++++++++++- ext/sidecar.h | 16 ++++ 4 files changed, 260 insertions(+), 3 deletions(-) diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 251da2bc3a6..5b4b7ed62ac 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -1529,6 +1529,7 @@ static PHP_MINIT_FUNCTION(ddtrace) { #endif ddshared_minit(); ddtrace_autoload_minit(); + ddtrace_sidecar_minit(); dd_register_span_data_ce(); dd_register_fatal_error_ce(); @@ -1612,7 +1613,11 @@ static PHP_MSHUTDOWN_FUNCTION(ddtrace) { ddtrace_user_req_shutdown(); - ddtrace_sidecar_shutdown(); + // Only shutdown sidecar in MSHUTDOWN for non-CLI SAPIs + // CLI SAPI shuts down in RSHUTDOWN to allow thread joins before ASAN checks + if (strcmp(sapi_module.name, "cli") != 0) { + ddtrace_sidecar_shutdown(); + } ddtrace_live_debugger_mshutdown(); @@ -2632,6 +2637,21 @@ void dd_internal_handle_fork(void) { ddtrace_coms_curl_shutdown(); ddtrace_coms_clean_background_sender_after_fork(); } + + // Handle thread mode after fork + int32_t current_pid = (int32_t)getpid(); + bool is_child_process = (ddtrace_sidecar_master_pid != 0 && + current_pid != ddtrace_sidecar_master_pid); + + if (is_child_process && ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD) { + // Clear inherited master listener state (child doesn't own it) + ddtrace_ffi_try("Failed clearing inherited listener state", + ddog_sidecar_clear_inherited_listener()); + + // Don't try to reconnect in thread mode after fork + // Let sidecar stay unavailable + LOG(WARN, "Child process after fork with thread mode: sidecar unavailable"); + } #endif if (DDTRACE_G(agent_config_reader)) { ddog_agent_remote_config_reader_drop(DDTRACE_G(agent_config_reader)); diff --git a/ext/handlers_pcntl.c b/ext/handlers_pcntl.c index acff140cfe4..22b5b31d32a 100644 --- a/ext/handlers_pcntl.c +++ b/ext/handlers_pcntl.c @@ -37,6 +37,15 @@ static void dd_prefork() { static void dd_handle_fork(zval *return_value) { if (Z_LVAL_P(return_value) == 0) { + // CHILD PROCESS + + // Warn if thread mode is active + if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD) { + LOG(WARN, "pcntl_fork() detected with thread-based sidecar connection. " + "Thread mode is incompatible with fork and may cause instability. " + "Consider using subprocess mode (DD_TRACE_SIDECAR_CONNECTION_MODE=subprocess)."); + } + dd_internal_handle_fork(); } else { #if JOIN_BGS_BEFORE_FORK diff --git a/ext/sidecar.c b/ext/sidecar.c index 9732879acc5..cddd5645375 100644 --- a/ext/sidecar.c +++ b/ext/sidecar.c @@ -25,6 +25,10 @@ ddog_Endpoint *dogstatsd_endpoint; // always set when ddtrace_endpoint is set struct ddog_InstanceId *ddtrace_sidecar_instance_id; static uint8_t dd_sidecar_formatted_session_id[36]; +// Connection mode tracking +dd_sidecar_active_mode_t ddtrace_sidecar_active_mode = DD_SIDECAR_CONNECTION_NONE; +int32_t ddtrace_sidecar_master_pid = 0; + static inline void dd_set_endpoint_test_token(ddog_Endpoint *endpoint) { if (zai_config_is_initialized()) { if (ZSTR_LEN(get_DD_TRACE_AGENT_TEST_SESSION_TOKEN())) { @@ -158,6 +162,148 @@ static void dd_sidecar_on_reconnect(ddog_SidecarTransport *transport) { } +// Subprocess connection mode - current default behavior +ddog_SidecarTransport *ddtrace_sidecar_connect_subprocess(void) { + if (!ddtrace_endpoint) { + return NULL; + } + ZEND_ASSERT(dogstatsd_endpoint != NULL); + + dd_set_endpoint_test_token(dogstatsd_endpoint); + +#ifdef _WIN32 + DDOG_PHP_FUNCTION = (const uint8_t *)zend_hash_func; +#endif + + char logpath[MAXPATHLEN]; + int error_fd = atomic_load(&ddtrace_error_log_fd); + if (error_fd == -1 || ddtrace_get_fd_path(error_fd, logpath) < 0) { + *logpath = 0; + } + + ddog_SidecarTransport *sidecar_transport; + if (!ddtrace_ffi_try("Failed connecting to sidecar (subprocess mode)", + 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, + ddtrace_endpoint))) { + return NULL; + } + + dd_sidecar_post_connect(&sidecar_transport, false, logpath); + + // Set active mode + ddtrace_sidecar_active_mode = DD_SIDECAR_CONNECTION_SUBPROCESS; + + return sidecar_transport; +} + +// Thread connection mode - fallback when subprocess fails +ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void) { + if (!ddtrace_endpoint) { + return NULL; + } + ZEND_ASSERT(dogstatsd_endpoint != NULL); + +#ifndef _WIN32 + int32_t current_pid = (int32_t)getpid(); + bool is_master = (ddtrace_sidecar_master_pid == 0 || current_pid == ddtrace_sidecar_master_pid); + + if (is_master) { + // Set master PID + if (ddtrace_sidecar_master_pid == 0) { + ddtrace_sidecar_master_pid = current_pid; + } + + // Start master listener thread (only if not already running) + if (!ddog_sidecar_is_master_listener_active(ddtrace_sidecar_master_pid)) { + if (!ddtrace_ffi_try("Failed starting master listener thread", + ddog_sidecar_connect_master(ddtrace_sidecar_master_pid))) { + LOG(WARN, "Failed to start master listener thread"); + return NULL; + } + + LOG(INFO, "Started master listener thread (PID=%d)", ddtrace_sidecar_master_pid); + } + } + + // Connect as worker to master listener + ddog_SidecarTransport *sidecar_transport; + if (!ddtrace_ffi_try("Failed connecting to master listener (thread mode)", + ddog_sidecar_connect_worker(ddtrace_sidecar_master_pid, &sidecar_transport))) { + LOG(WARN, "Failed to connect to master listener"); + return NULL; + } + + char logpath[MAXPATHLEN]; + int error_fd = atomic_load(&ddtrace_error_log_fd); + if (error_fd == -1 || ddtrace_get_fd_path(error_fd, logpath) < 0) { + *logpath = 0; + } + + dd_sidecar_post_connect(&sidecar_transport, false, logpath); + + // Set active mode + ddtrace_sidecar_active_mode = DD_SIDECAR_CONNECTION_THREAD; + + return sidecar_transport; +#else + // Thread mode not supported on Windows + LOG(ERROR, "Thread-based sidecar connection is not supported on Windows"); + return NULL; +#endif +} + +// Auto-fallback connection logic +ddog_SidecarTransport *ddtrace_sidecar_connect_with_fallback(void) { + zend_long mode = get_global_DD_TRACE_SIDECAR_CONNECTION_MODE(); + ddog_SidecarTransport *transport = NULL; + + switch (mode) { + case DD_TRACE_SIDECAR_CONNECTION_MODE_SUBPROCESS: + // Force subprocess only + LOG(INFO, "Sidecar connection mode: subprocess (forced)"); + transport = ddtrace_sidecar_connect_subprocess(); + if (!transport) { + LOG(ERROR, "Subprocess connection failed (mode=subprocess, no fallback)"); + } + break; + + case DD_TRACE_SIDECAR_CONNECTION_MODE_THREAD: + // Force thread only + LOG(INFO, "Sidecar connection mode: thread (forced)"); + transport = ddtrace_sidecar_connect_thread(); + if (!transport) { + LOG(ERROR, "Thread connection failed (mode=thread, no fallback)"); + } + break; + + case DD_TRACE_SIDECAR_CONNECTION_MODE_AUTO: + default: + // Try subprocess first + LOG(INFO, "Sidecar connection mode: auto (trying subprocess first)"); + transport = ddtrace_sidecar_connect_subprocess(); + + if (transport) { + LOG(INFO, "Connected to sidecar via subprocess"); + } else { + // Fallback to thread mode + LOG(WARN, "Subprocess connection failed, falling back to thread mode"); + transport = ddtrace_sidecar_connect_thread(); + + if (transport) { + LOG(INFO, "Connected to sidecar via thread (fallback)"); + } else { + LOG(ERROR, "Both subprocess and thread connections failed, sidecar unavailable"); + } + } + break; + } + + return transport; +} + static ddog_SidecarTransport *dd_sidecar_connection_factory_ex(bool is_fork) { // Should not happen, unless the agent url is malformed if (!ddtrace_endpoint) { @@ -189,7 +335,20 @@ static ddog_SidecarTransport *dd_sidecar_connection_factory_ex(bool is_fork) { } ddog_SidecarTransport *dd_sidecar_connection_factory(void) { - return dd_sidecar_connection_factory_ex(false); + // Reconnect using the same mode that succeeded initially + switch (ddtrace_sidecar_active_mode) { + case DD_SIDECAR_CONNECTION_SUBPROCESS: + return ddtrace_sidecar_connect_subprocess(); + + case DD_SIDECAR_CONNECTION_THREAD: + return ddtrace_sidecar_connect_thread(); + + case DD_SIDECAR_CONNECTION_NONE: + default: + // Shouldn't happen, but fall back to auto mode + LOG(WARN, "Reconnection attempted with no active mode, using fallback logic"); + return ddtrace_sidecar_connect_with_fallback(); + } } bool ddtrace_sidecar_maybe_enable_appsec(bool *appsec_activation, bool *appsec_config) { @@ -222,7 +381,8 @@ void ddtrace_sidecar_setup(bool appsec_activation, bool appsec_config) { ddog_init_remote_config(get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED(), appsec_activation, appsec_config); - ddtrace_sidecar = dd_sidecar_connection_factory(); + // Use fallback connection logic + ddtrace_sidecar = ddtrace_sidecar_connect_with_fallback(); if (!ddtrace_sidecar) { // Something went wrong if (ddtrace_endpoint) { dd_free_endpoints(); @@ -234,6 +394,15 @@ void ddtrace_sidecar_setup(bool appsec_activation, bool appsec_config) { } } +// Initialize sidecar globals at module init +void ddtrace_sidecar_minit(void) { +#ifndef _WIN32 + if (ddtrace_sidecar_master_pid == 0) { + ddtrace_sidecar_master_pid = (int32_t)getpid(); + } +#endif +} + void ddtrace_sidecar_ensure_active(void) { if (ddtrace_sidecar) { ddtrace_sidecar_reconnect(&ddtrace_sidecar, dd_sidecar_connection_factory); @@ -261,8 +430,29 @@ void ddtrace_sidecar_finalize(bool clear_id) { } void ddtrace_sidecar_shutdown(void) { +#ifndef _WIN32 + // Shutdown master listener if this is the master process and thread mode is active + int32_t current_pid = (int32_t)getpid(); + if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD && + ddtrace_sidecar_master_pid != 0 && + current_pid == ddtrace_sidecar_master_pid) { + + // Close worker connection first to avoid deadlock + if (ddtrace_sidecar) { + ddog_sidecar_transport_drop(ddtrace_sidecar); + ddtrace_sidecar = NULL; + } + + // Then shutdown listener thread + ddtrace_ffi_try("Failed shutting down master listener", + ddog_sidecar_shutdown_master_listener()); + } +#endif + + // Standard cleanup if (ddtrace_sidecar_instance_id) { ddog_sidecar_instanceId_drop(ddtrace_sidecar_instance_id); + ddtrace_sidecar_instance_id = NULL; } if (ddtrace_endpoint) { @@ -271,7 +461,11 @@ void ddtrace_sidecar_shutdown(void) { if (ddtrace_sidecar) { ddog_sidecar_transport_drop(ddtrace_sidecar); + ddtrace_sidecar = NULL; } + + // Reset mode + ddtrace_sidecar_active_mode = DD_SIDECAR_CONNECTION_NONE; } void ddtrace_force_new_instance_id(void) { @@ -286,6 +480,19 @@ void ddtrace_reset_sidecar(void) { if (ddtrace_sidecar) { ddog_sidecar_transport_drop(ddtrace_sidecar); + ddtrace_sidecar = NULL; + + // Don't reconnect in thread mode after fork (Option A: documented incompatibility) + if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD) { + // Sidecar unavailable in child process after fork + LOG(WARN, "Thread mode sidecar cannot be reset after fork, sidecar unavailable"); + if (ddtrace_endpoint) { + dd_free_endpoints(); + } + return; + } + + // For subprocess mode, reconnect with is_fork=true ddtrace_sidecar = dd_sidecar_connection_factory_ex(true); if (!ddtrace_sidecar) { // Something went wrong if (ddtrace_endpoint) { @@ -596,6 +803,11 @@ void ddtrace_sidecar_rinit(void) { void ddtrace_sidecar_rshutdown(void) { ddog_Vec_Tag_drop(DDTRACE_G(active_global_tags)); + + // For CLI SAPI, shut down sidecar here (before ASAN checks) + if (strcmp(sapi_module.name, "cli") == 0) { + ddtrace_sidecar_shutdown(); + } } bool ddtrace_alter_test_session_token(zval *old_value, zval *new_value, zend_string *new_str) { diff --git a/ext/sidecar.h b/ext/sidecar.h index b3593ceaf1c..d96d25fef28 100644 --- a/ext/sidecar.h +++ b/ext/sidecar.h @@ -7,9 +7,18 @@ #include "ddtrace.h" #include "zend_string.h" +// Connection mode tracking +typedef enum { + DD_SIDECAR_CONNECTION_NONE = 0, + DD_SIDECAR_CONNECTION_SUBPROCESS = 1, + DD_SIDECAR_CONNECTION_THREAD = 2 +} dd_sidecar_active_mode_t; + extern ddog_SidecarTransport *ddtrace_sidecar; extern ddog_Endpoint *ddtrace_endpoint; extern struct ddog_InstanceId *ddtrace_sidecar_instance_id; +extern dd_sidecar_active_mode_t ddtrace_sidecar_active_mode; +extern int32_t ddtrace_sidecar_master_pid; DDTRACE_PUBLIC const uint8_t *ddtrace_get_formatted_session_id(void); struct telemetry_rc_info { @@ -20,6 +29,13 @@ struct telemetry_rc_info { }; DDTRACE_PUBLIC struct telemetry_rc_info ddtrace_get_telemetry_rc_info(void); +// Connection functions +ddog_SidecarTransport *ddtrace_sidecar_connect_subprocess(void); +ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void); +ddog_SidecarTransport *ddtrace_sidecar_connect_with_fallback(void); + +// Lifecycle functions +void ddtrace_sidecar_minit(void); void ddtrace_sidecar_setup(bool appsec_activation, bool appsec_config); bool ddtrace_sidecar_maybe_enable_appsec(bool *appsec_activation, bool *appsec_config); void ddtrace_sidecar_ensure_active(void); From e706557ad4a04a83fd70f122d5dca45f8844d20d Mon Sep 17 00:00:00 2001 From: Alexandre Rulleau Date: Tue, 13 Jan 2026 14:11:49 +0100 Subject: [PATCH 8/8] fix: compilation error Signed-off-by: Alexandre Rulleau --- ext/ddtrace.c | 4 +- ext/sidecar.c | 122 ++++++++------------- ext/sidecar.h | 2 +- tests/ext/sandbox/die_in_sandbox.phpt | 2 + tests/ext/span_on_close.phpt | 2 + tests/ext/startup_logging_json_config.phpt | 2 + 6 files changed, 56 insertions(+), 78 deletions(-) diff --git a/ext/ddtrace.c b/ext/ddtrace.c index 5b4b7ed62ac..cb7b6a5f4ff 100644 --- a/ext/ddtrace.c +++ b/ext/ddtrace.c @@ -1586,7 +1586,9 @@ static PHP_MSHUTDOWN_FUNCTION(ddtrace) { #ifndef _WIN32 ddtrace_signals_mshutdown(); - if (!get_global_DD_TRACE_SIDECAR_TRACE_SENDER()) { + // For CLI SAPI, background sender is already shut down in RSHUTDOWN + // For non-CLI SAPIs, shut it down here in MSHUTDOWN + if (!get_global_DD_TRACE_SIDECAR_TRACE_SENDER() && strcmp(sapi_module.name, "cli") != 0) { ddtrace_coms_mshutdown(); if (ddtrace_coms_flush_shutdown_writer_synchronous()) { ddtrace_coms_curl_shutdown(); diff --git a/ext/sidecar.c b/ext/sidecar.c index cddd5645375..e198084a661 100644 --- a/ext/sidecar.c +++ b/ext/sidecar.c @@ -1,3 +1,5 @@ +#include +#include
#include "ddtrace.h" #include "auto_flush.h" #include "compat_string.h" @@ -162,7 +164,6 @@ static void dd_sidecar_on_reconnect(ddog_SidecarTransport *transport) { } -// Subprocess connection mode - current default behavior ddog_SidecarTransport *ddtrace_sidecar_connect_subprocess(void) { if (!ddtrace_endpoint) { return NULL; @@ -193,13 +194,11 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_subprocess(void) { dd_sidecar_post_connect(&sidecar_transport, false, logpath); - // Set active mode ddtrace_sidecar_active_mode = DD_SIDECAR_CONNECTION_SUBPROCESS; return sidecar_transport; } -// Thread connection mode - fallback when subprocess fails ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void) { if (!ddtrace_endpoint) { return NULL; @@ -211,12 +210,10 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void) { bool is_master = (ddtrace_sidecar_master_pid == 0 || current_pid == ddtrace_sidecar_master_pid); if (is_master) { - // Set master PID if (ddtrace_sidecar_master_pid == 0) { ddtrace_sidecar_master_pid = current_pid; } - // Start master listener thread (only if not already running) if (!ddog_sidecar_is_master_listener_active(ddtrace_sidecar_master_pid)) { if (!ddtrace_ffi_try("Failed starting master listener thread", ddog_sidecar_connect_master(ddtrace_sidecar_master_pid))) { @@ -228,7 +225,6 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void) { } } - // Connect as worker to master listener ddog_SidecarTransport *sidecar_transport; if (!ddtrace_ffi_try("Failed connecting to master listener (thread mode)", ddog_sidecar_connect_worker(ddtrace_sidecar_master_pid, &sidecar_transport))) { @@ -244,7 +240,6 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void) { dd_sidecar_post_connect(&sidecar_transport, false, logpath); - // Set active mode ddtrace_sidecar_active_mode = DD_SIDECAR_CONNECTION_THREAD; return sidecar_transport; @@ -255,15 +250,25 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void) { #endif } -// Auto-fallback connection logic -ddog_SidecarTransport *ddtrace_sidecar_connect_with_fallback(void) { +ddog_SidecarTransport *ddtrace_sidecar_connect(bool is_fork) { + if (is_fork && ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD) { + LOG(WARN, "Thread mode sidecar cannot be reset after fork, sidecar unavailable"); + return NULL; + } + + if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_SUBPROCESS) { + return ddtrace_sidecar_connect_subprocess(); + } else if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD) { + return ddtrace_sidecar_connect_thread(); + } + zend_long mode = get_global_DD_TRACE_SIDECAR_CONNECTION_MODE(); ddog_SidecarTransport *transport = NULL; switch (mode) { case DD_TRACE_SIDECAR_CONNECTION_MODE_SUBPROCESS: // Force subprocess only - LOG(INFO, "Sidecar connection mode: subprocess (forced)"); + LOG(DEBUG, "Sidecar connection mode: subprocess (forced)"); transport = ddtrace_sidecar_connect_subprocess(); if (!transport) { LOG(ERROR, "Subprocess connection failed (mode=subprocess, no fallback)"); @@ -272,7 +277,7 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_with_fallback(void) { case DD_TRACE_SIDECAR_CONNECTION_MODE_THREAD: // Force thread only - LOG(INFO, "Sidecar connection mode: thread (forced)"); + LOG(DEBUG, "Sidecar connection mode: thread (forced)"); transport = ddtrace_sidecar_connect_thread(); if (!transport) { LOG(ERROR, "Thread connection failed (mode=thread, no fallback)"); @@ -281,14 +286,17 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_with_fallback(void) { case DD_TRACE_SIDECAR_CONNECTION_MODE_AUTO: default: - // Try subprocess first - LOG(INFO, "Sidecar connection mode: auto (trying subprocess first)"); + // Try subprocess first, fallback to thread if needed + LOG(DEBUG, "Sidecar connection mode: auto (trying subprocess first)"); transport = ddtrace_sidecar_connect_subprocess(); if (transport) { - LOG(INFO, "Connected to sidecar via subprocess"); + LOG(DEBUG, "Connected to sidecar via subprocess"); + } else if (!ddtrace_endpoint) { + // Don't try fallback if endpoint is invalid - both modes need a valid endpoint + // The "Invalid DD_TRACE_AGENT_URL" error was already logged during endpoint creation } else { - // Fallback to thread mode + // Subprocess failed but endpoint is valid - try thread mode fallback LOG(WARN, "Subprocess connection failed, falling back to thread mode"); transport = ddtrace_sidecar_connect_thread(); @@ -304,51 +312,8 @@ ddog_SidecarTransport *ddtrace_sidecar_connect_with_fallback(void) { return transport; } -static ddog_SidecarTransport *dd_sidecar_connection_factory_ex(bool is_fork) { - // Should not happen, unless the agent url is malformed - if (!ddtrace_endpoint) { - return NULL; - } - ZEND_ASSERT(dogstatsd_endpoint != NULL); - - dd_set_endpoint_test_token(dogstatsd_endpoint); - -#ifdef _WIN32 - DDOG_PHP_FUNCTION = (const uint8_t *)zend_hash_func; -#endif - - char logpath[MAXPATHLEN]; - int error_fd = atomic_load(&ddtrace_error_log_fd); - if (error_fd == -1 || ddtrace_get_fd_path(error_fd, logpath) < 0) { - *logpath = 0; - } - - ddog_SidecarTransport *sidecar_transport; - 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, ddtrace_endpoint))) { - dd_free_endpoints(); - return NULL; - } - - dd_sidecar_post_connect(&sidecar_transport, is_fork, logpath); - - return sidecar_transport; -} - -ddog_SidecarTransport *dd_sidecar_connection_factory(void) { - // Reconnect using the same mode that succeeded initially - switch (ddtrace_sidecar_active_mode) { - case DD_SIDECAR_CONNECTION_SUBPROCESS: - return ddtrace_sidecar_connect_subprocess(); - - case DD_SIDECAR_CONNECTION_THREAD: - return ddtrace_sidecar_connect_thread(); - - case DD_SIDECAR_CONNECTION_NONE: - default: - // Shouldn't happen, but fall back to auto mode - LOG(WARN, "Reconnection attempted with no active mode, using fallback logic"); - return ddtrace_sidecar_connect_with_fallback(); - } +static ddog_SidecarTransport *ddtrace_sidecar_connect_callback(void) { + return ddtrace_sidecar_connect(false); } bool ddtrace_sidecar_maybe_enable_appsec(bool *appsec_activation, bool *appsec_config) { @@ -381,8 +346,7 @@ void ddtrace_sidecar_setup(bool appsec_activation, bool appsec_config) { ddog_init_remote_config(get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED(), appsec_activation, appsec_config); - // Use fallback connection logic - ddtrace_sidecar = ddtrace_sidecar_connect_with_fallback(); + ddtrace_sidecar = ddtrace_sidecar_connect(false); if (!ddtrace_sidecar) { // Something went wrong if (ddtrace_endpoint) { dd_free_endpoints(); @@ -405,7 +369,7 @@ void ddtrace_sidecar_minit(void) { void ddtrace_sidecar_ensure_active(void) { if (ddtrace_sidecar) { - ddtrace_sidecar_reconnect(&ddtrace_sidecar, dd_sidecar_connection_factory); + ddtrace_sidecar_reconnect(&ddtrace_sidecar, ddtrace_sidecar_connect_callback); } } @@ -482,19 +446,8 @@ void ddtrace_reset_sidecar(void) { ddog_sidecar_transport_drop(ddtrace_sidecar); ddtrace_sidecar = NULL; - // Don't reconnect in thread mode after fork (Option A: documented incompatibility) - if (ddtrace_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD) { - // Sidecar unavailable in child process after fork - LOG(WARN, "Thread mode sidecar cannot be reset after fork, sidecar unavailable"); - if (ddtrace_endpoint) { - dd_free_endpoints(); - } - return; - } - - // For subprocess mode, reconnect with is_fork=true - ddtrace_sidecar = dd_sidecar_connection_factory_ex(true); - if (!ddtrace_sidecar) { // Something went wrong + ddtrace_sidecar = ddtrace_sidecar_connect(true); + if (!ddtrace_sidecar) { if (ddtrace_endpoint) { dd_free_endpoints(); } @@ -805,7 +758,24 @@ void ddtrace_sidecar_rshutdown(void) { ddog_Vec_Tag_drop(DDTRACE_G(active_global_tags)); // For CLI SAPI, shut down sidecar here (before ASAN checks) + // CRITICAL: Must shut down background sender FIRST if it's running, + // otherwise it may try to access instance_id while we're freeing it if (strcmp(sapi_module.name, "cli") == 0) { +#ifndef _WIN32 + if (!get_global_DD_TRACE_SIDECAR_TRACE_SENDER()) { + // Background sender is running - must shut it down first + extern void ddtrace_coms_mshutdown(void); + extern bool ddtrace_coms_flush_shutdown_writer_synchronous(void); + extern void ddtrace_coms_curl_shutdown(void); + extern void ddtrace_coms_mshutdown_proxy_env(void); + + ddtrace_coms_mshutdown(); + if (ddtrace_coms_flush_shutdown_writer_synchronous()) { + ddtrace_coms_curl_shutdown(); + } + ddtrace_coms_mshutdown_proxy_env(); + } +#endif ddtrace_sidecar_shutdown(); } } diff --git a/ext/sidecar.h b/ext/sidecar.h index d96d25fef28..26b01b7c0ea 100644 --- a/ext/sidecar.h +++ b/ext/sidecar.h @@ -32,7 +32,7 @@ DDTRACE_PUBLIC struct telemetry_rc_info ddtrace_get_telemetry_rc_info(void); // Connection functions ddog_SidecarTransport *ddtrace_sidecar_connect_subprocess(void); ddog_SidecarTransport *ddtrace_sidecar_connect_thread(void); -ddog_SidecarTransport *ddtrace_sidecar_connect_with_fallback(void); +ddog_SidecarTransport *ddtrace_sidecar_connect(bool is_fork); // Lifecycle functions void ddtrace_sidecar_minit(void); diff --git a/tests/ext/sandbox/die_in_sandbox.phpt b/tests/ext/sandbox/die_in_sandbox.phpt index 318f0467532..5c2da8f16fa 100644 --- a/tests/ext/sandbox/die_in_sandbox.phpt +++ b/tests/ext/sandbox/die_in_sandbox.phpt @@ -17,6 +17,8 @@ x(); ?> --EXPECTF-- +[ddtrace] [debug] Sidecar connection mode: auto (trying subprocess first) +[ddtrace] [debug] Connected to sidecar via subprocess [ddtrace] [warning] UnwindExit thrown in ddtrace's closure defined at %s:%d for x(): in Unknown on line 0 [ddtrace] [span] Encoding span: Span { service: die_in_sandbox.php, name: die_in_sandbox.php, resource: die_in_sandbox.php, type: cli, trace_id: %d, span_id: %d, parent_id: %d, start: %d, duration: %d, error: %d, meta: %s, metrics: %s, meta_struct: %s, span_links: %s, span_events: %s } [ddtrace] [span] Encoding span: Span { service: die_in_sandbox.php, name: x, resource: x, type: cli, trace_id: %d, span_id: %d, parent_id: %d, start: %d, duration: %d, error: %d, meta: %s, metrics: %s, meta_struct: %s, span_links: %s, span_events: %s } diff --git a/tests/ext/span_on_close.phpt b/tests/ext/span_on_close.phpt index ce519454054..c944b7d6b21 100644 --- a/tests/ext/span_on_close.phpt +++ b/tests/ext/span_on_close.phpt @@ -24,6 +24,8 @@ $span->onClose = [ ?> --EXPECTF-- +[ddtrace] [debug] Sidecar connection mode: auto (trying subprocess first) +[ddtrace] [debug] Connected to sidecar via subprocess Second First [ddtrace] [span] Encoding span: Span { service: %s, name: root span, resource: root span, type: cli, trace_id: %d, span_id: %d, parent_id: %d, start: %d, duration: %d, error: %d, meta: %s, metrics: %s, meta_struct: %s, span_links: %s, span_events: %s } diff --git a/tests/ext/startup_logging_json_config.phpt b/tests/ext/startup_logging_json_config.phpt index 62b7110518e..6113ec85384 100644 --- a/tests/ext/startup_logging_json_config.phpt +++ b/tests/ext/startup_logging_json_config.phpt @@ -52,6 +52,8 @@ dd_dump_startup_logs($logs, [ ]); ?> --EXPECT-- +[ddtrace] [debug] Sidecar connection mode: auto (trying subprocess first) +[ddtrace] [debug] Connected to sidecar via subprocess Sanity check env: "my-env" service: "my-service"