From aff22b6c2f69f7c713679d9af692d2a15a2bfab3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 22:54:27 -0400 Subject: [PATCH 1/6] libdatadog update to 15899dfe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automated update by CI pipeline https://gitlab.ddbuild.io/DataDog/apm-reliability/dd-trace-php/-/pipelines/126695654 Full CI result: ❌ 148 job(s) failed --- libdatadog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdatadog b/libdatadog index 6a6d4a535e..15899dfe75 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 6a6d4a535e9875a7b012ce3f00eb6929649c3fb5 +Subproject commit 15899dfe754d12186ce7db72f0ff41c1920d52ec From 095f78aab02540a5eff1276b36acb50fd74a3d0d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 23:24:05 -0400 Subject: [PATCH 2/6] libdatadog update to 15899dfe [no-ci-feedback] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Automated update by CI pipeline https://gitlab.ddbuild.io/DataDog/apm-reliability/dd-trace-php/-/pipelines/126697886 Full CI result: ❌ 248 job(s) failed --- Cargo.toml | 11 +++++++++++ components-rs/Cargo.toml | 1 + components-rs/remote_config.rs | 19 +++++++++++-------- components-rs/stats.rs | 9 ++++++++- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bf4ff93f4b..22279e8bab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,15 @@ inherits = "release" # These are to satistfy the build with libdatadog as a path dependency inside # components-rs. There may be a better way to fix this, but I'm alreday two # tasks removed from what I'm trying to do, so pushing forward. +# +# Every dependency that a libdatadog crate inherits via `{ workspace = true }` +# must be declared here, because those crates resolve their workspace +# inheritance against this manifest when built as path dependencies. Keep this +# list in sync with libdatadog's own `[workspace.dependencies]`; libdatadog +# #2253 consolidated `anyhow`, `serde`, `tokio` and `tracing` to the workspace +# level, so they are mirrored here too. [workspace.dependencies] +anyhow = { version = "1.0", default-features = false } arc-swap = "1.7.1" hyper = { version = "1.6", features = [ "http1", @@ -44,6 +52,9 @@ hyper-util = { version = "0.1.10", features = [ "client", "client-legacy", ] } +serde = { version = "1.0", default-features = false } +tokio = { version = "1.36", default-features = false } +tracing = { version = "0.1", default-features = false } [workspace.lints] # empty for compat with libdatadog diff --git a/components-rs/Cargo.toml b/components-rs/Cargo.toml index c4b8de1c34..dfcc3aee29 100644 --- a/components-rs/Cargo.toml +++ b/components-rs/Cargo.toml @@ -23,6 +23,7 @@ libdd-data-pipeline = { path = "../libdatadog/libdd-data-pipeline" } libdd-tinybytes = { path = "../libdatadog/libdd-tinybytes" } libdd-trace-utils = { path = "../libdatadog/libdd-trace-utils" } libdd-trace-stats = { path = "../libdatadog/libdd-trace-stats" } +libdd-trace-protobuf = { path = "../libdatadog/libdd-trace-protobuf" } libdd-crashtracker-ffi = { path = "../libdatadog/libdd-crashtracker-ffi", default-features = false, features = ["collector"] } libdd-library-config-ffi = { path = "../libdatadog/libdd-library-config-ffi", default-features = false } spawn_worker = { path = "../libdatadog/spawn_worker" } diff --git a/components-rs/remote_config.rs b/components-rs/remote_config.rs index 51e2c575d7..f39ae1ac51 100644 --- a/components-rs/remote_config.rs +++ b/components-rs/remote_config.rs @@ -650,13 +650,16 @@ pub extern "C" fn ddog_remote_configs_service_env_change( tags: &libdd_common_ffi::Vec, process_tags: &libdd_common_ffi::Vec, ) -> bool { - let new_target = Target { - service: service.to_utf8_lossy().to_string(), - env: env.to_utf8_lossy().to_string(), - app_version: version.to_utf8_lossy().to_string(), - tags: tags.as_slice().to_vec(), - process_tags: process_tags.as_slice().to_vec(), - }; + // libdatadog now hides `Target`'s fields and exposes a constructor. `tags` + // and `process_tags` are stored as already-formatted "key:value" strings, + // so convert the incoming `Tag`s via their `Display` impl. + let new_target = Target::new( + service.to_utf8_lossy().to_string(), + env.to_utf8_lossy().to_string(), + version.to_utf8_lossy().to_string(), + tags.as_slice().iter().map(|t| t.to_string()).collect(), + process_tags.as_slice().iter().map(|t| t.to_string()).collect(), + ); if let Some(target) = remote_config.manager.get_target() { if **target == new_target { @@ -798,7 +801,7 @@ pub unsafe extern "C" fn ddog_send_debugger_diagnostics<'a>( remote_config_state .manager .get_target() - .map_or("", |t| t.service.as_str()), + .map_or("", |t| t.service()), ); let mut payload = ddog_debugger_diagnostics_create_unboxed( probe, diff --git a/components-rs/stats.rs b/components-rs/stats.rs index e2e831c48e..8fd2a67a73 100644 --- a/components-rs/stats.rs +++ b/components-rs/stats.rs @@ -11,6 +11,7 @@ use crate::trace_filter; use datadog_ipc::shm_stats::{OwnedShmSpanInput, ShmSpanConcentrator, ShmSpanInput, MAX_PEER_TAGS}; use datadog_sidecar::service::blocking::{add_span_to_concentrator, SidecarTransport}; use libdd_trace_stats::span_concentrator::FixedAggregationKey; +use libdd_trace_protobuf::pb::Trilean; use libdd_common_ffi::slice::{AsBytes, CharSlice}; use std::collections::HashMap; use std::ffi::{c_char, c_void}; @@ -148,7 +149,13 @@ fn build_fixed_key<'a>(span: &'a PhpSpanStats<'a>) -> FixedAggregationKey<&'a st http_endpoint: extract_http_endpoint(span), http_status_code: extract_http_status_code(span), is_synthetics_request: is_synthetics_request(span), - is_trace_root: span.is_trace_root, + // `is_trace_root` became a three-valued `Trilean` in libdatadog; the PHP + // side only ever knows true/false, so map the bool onto True/False. + is_trace_root: if span.is_trace_root { + Trilean::True + } else { + Trilean::False + }, grpc_status_code: extract_grpc_status_code(span), service_source: char_slice_str(span.service_source), } From ce1550f847c29822c68051e72c82465517744fc6 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 26 Jun 2026 22:11:03 +0200 Subject: [PATCH 3/6] Avoid a dedicated socket for crashtracker Update for libdatadog changes. Signed-off-by: Bob Weinand Help distinguishing debug logs by url for parallel requests Signed-off-by: Bob Weinand --- Cargo.lock | 127 ++++++++++----- cbindgen.toml | 1 + components-rs/Cargo.toml | 1 + components-rs/common.h | 17 +- components-rs/datadog.h | 30 +++- components-rs/lib.rs | 154 ++++++++++++++++-- .../php_sidecar_mockgen/mock_php.shared_lib | Bin 0 -> 59192 bytes components-rs/remote_config.rs | 3 - components-rs/sidecar.h | 5 - components-rs/stats.rs | 8 +- components-rs/telemetry.h | 56 ++++--- ext/signals.c | 58 +------ libdatadog | 2 +- 13 files changed, 304 insertions(+), 158 deletions(-) create mode 100755 components-rs/php_sidecar_mockgen/mock_php.shared_lib diff --git a/Cargo.lock b/Cargo.lock index 55e8f08e19..4d68ac668c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,7 +24,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.3.2", "once_cell", "version_check 0.9.5", "zerocopy 0.8.24", @@ -1336,6 +1335,7 @@ dependencies = [ "libc 0.2.186", "libdd-common", "libdd-common-ffi", + "libdd-crashtracker", "libdd-crashtracker-ffi", "libdd-data-pipeline", "libdd-library-config-ffi", @@ -1343,6 +1343,7 @@ dependencies = [ "libdd-telemetry", "libdd-telemetry-ffi", "libdd-tinybytes", + "libdd-trace-protobuf", "libdd-trace-stats", "libdd-trace-utils", "log", @@ -1871,9 +1872,9 @@ checksum = "673464e1e314dd67a0fd9544abc99e8eb28d0c7e3b69b033bcff9b2d00b87333" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -1886,9 +1887,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -1896,15 +1897,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -1913,15 +1914,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -1930,15 +1931,15 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-timer" @@ -1948,9 +1949,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -1960,7 +1961,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2768,7 +2768,7 @@ dependencies = [ [[package]] name = "libdd-capabilities" -version = "2.0.0" +version = "2.1.0" dependencies = [ "anyhow", "bytes", @@ -2778,19 +2778,21 @@ dependencies = [ [[package]] name = "libdd-capabilities-impl" -version = "2.0.0" +version = "3.0.0" dependencies = [ + "anyhow", "bytes", "http", "http-body-util", "libdd-capabilities", "libdd-common", + "tempfile", "tokio", ] [[package]] name = "libdd-common" -version = "4.2.0" +version = "5.1.0" dependencies = [ "anyhow", "bytes", @@ -2822,6 +2824,7 @@ dependencies = [ "rustls", "rustls-native-certs", "rustls-platform-verifier", + "rustls-webpki", "serde", "static_assertions", "tempfile", @@ -2863,6 +2866,8 @@ dependencies = [ "goblin", "http", "libc 0.2.186", + "libdd-capabilities", + "libdd-capabilities-impl", "libdd-common", "libdd-libunwind-sys", "libdd-telemetry", @@ -2906,7 +2911,7 @@ dependencies = [ [[package]] name = "libdd-data-pipeline" -version = "6.0.0" +version = "7.0.0" dependencies = [ "anyhow", "arc-swap", @@ -2916,6 +2921,7 @@ dependencies = [ "criterion", "duplicate 2.0.1", "either", + "futures", "getrandom 0.2.15", "http", "http-body-util", @@ -2934,6 +2940,7 @@ dependencies = [ "libdd-trace-protobuf", "libdd-trace-stats", "libdd-trace-utils", + "prost", "rand 0.8.5", "regex", "rmp-serde", @@ -2945,11 +2952,12 @@ dependencies = [ "tokio-util", "tracing", "uuid", + "web-time", ] [[package]] name = "libdd-ddsketch" -version = "1.0.1" +version = "1.1.0" dependencies = [ "criterion", "prost", @@ -2961,12 +2969,14 @@ dependencies = [ [[package]] name = "libdd-dogstatsd-client" -version = "3.0.0" +version = "4.0.0" dependencies = [ "anyhow", + "async-trait", "cadence", "http", "libdd-common", + "libdd-shared-runtime", "serde", "tokio", "tracing", @@ -2974,7 +2984,7 @@ dependencies = [ [[package]] name = "libdd-library-config" -version = "2.0.0" +version = "3.0.0" dependencies = [ "anyhow", "libc 0.2.186", @@ -3082,10 +3092,11 @@ dependencies = [ [[package]] name = "libdd-remote-config" -version = "0.1.0" +version = "2.0.0" dependencies = [ "anyhow", "base64 0.22.1", + "bytes", "futures", "futures-util", "hashbrown 0.15.2", @@ -3093,6 +3104,8 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", + "libdd-capabilities", + "libdd-capabilities-impl", "libdd-common", "libdd-remote-config", "libdd-trace-protobuf", @@ -3113,7 +3126,7 @@ dependencies = [ [[package]] name = "libdd-shared-runtime" -version = "1.0.0" +version = "2.0.0" dependencies = [ "async-trait", "futures", @@ -3129,18 +3142,20 @@ dependencies = [ [[package]] name = "libdd-telemetry" -version = "5.0.1" +version = "6.0.0" dependencies = [ "anyhow", "async-trait", "base64 0.22.1", "bytes", "futures", + "getrandom 0.2.15", "hashbrown 0.15.2", "http", - "http-body-util", "httpmock", "libc 0.2.186", + "libdd-capabilities", + "libdd-capabilities-impl", "libdd-common", "libdd-ddsketch", "libdd-shared-runtime", @@ -3152,6 +3167,7 @@ dependencies = [ "tracing", "tracing-subscriber", "uuid", + "web-time", "winver", ] @@ -3162,6 +3178,7 @@ dependencies = [ "build_common", "function_name", "libc 0.2.186", + "libdd-capabilities-impl", "libdd-common", "libdd-common-ffi", "libdd-telemetry", @@ -3186,7 +3203,7 @@ dependencies = [ [[package]] name = "libdd-trace-normalization" -version = "2.0.0" +version = "3.0.0" dependencies = [ "anyhow", "arbitrary", @@ -3198,7 +3215,7 @@ dependencies = [ [[package]] name = "libdd-trace-obfuscation" -version = "4.0.0" +version = "5.0.0" dependencies = [ "anyhow", "criterion", @@ -3215,7 +3232,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" -version = "3.0.2" +version = "4.0.0" dependencies = [ "bolero", "prost", @@ -3229,12 +3246,13 @@ dependencies = [ [[package]] name = "libdd-trace-stats" -version = "5.0.0" +version = "6.0.0" dependencies = [ "anyhow", "arc-swap", "async-trait", "criterion", + "futures", "hashbrown 0.15.2", "http", "httpmock", @@ -3242,7 +3260,9 @@ dependencies = [ "libdd-capabilities-impl", "libdd-common", "libdd-ddsketch", + "libdd-dogstatsd-client", "libdd-shared-runtime", + "libdd-telemetry", "libdd-trace-obfuscation", "libdd-trace-protobuf", "libdd-trace-utils", @@ -3252,11 +3272,12 @@ dependencies = [ "tokio", "tokio-util", "tracing", + "web-time", ] [[package]] name = "libdd-trace-utils" -version = "8.0.0" +version = "9.0.0" dependencies = [ "anyhow", "base64 0.22.1", @@ -3268,12 +3289,14 @@ dependencies = [ "flate2", "futures", "getrandom 0.2.15", + "hex", "http", "http-body", "http-body-util", "httpmock", "hyper", "indexmap 2.12.1", + "itoa", "libdd-capabilities", "libdd-capabilities-impl", "libdd-common", @@ -3288,6 +3311,7 @@ dependencies = [ "rmpv", "rustc-hash 2.1.3", "serde", + "serde-transcode", "serde_json", "tempfile", "thin-vec", @@ -4028,12 +4052,6 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkg-config" version = "0.3.32" @@ -4104,7 +4122,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "059a34f111a9dee2ce1ac2826a68b24601c4298cfeb1a587c3cb493d5ab46f52" dependencies = [ - "libc 0.1.12", + "libc 0.2.186", "nix 0.30.1", ] @@ -4871,9 +4889,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -5066,6 +5084,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde-transcode" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "590c0e25c2a5bb6e85bf5c1bce768ceb86b316e7a01bdf07d2cb4ec2271990e2" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.15" @@ -6376,6 +6403,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-root-certs" version = "1.0.6" diff --git a/cbindgen.toml b/cbindgen.toml index 2d4ec6b358..ad11ddb044 100644 --- a/cbindgen.toml +++ b/cbindgen.toml @@ -24,6 +24,7 @@ rename_types = "PascalCase" "ZendString" = "_zend_string" "FILE" = "FILE" "EndpointConfig" = "ddog_crasht_EndpointConfig" +"Metadata" = "ddog_crasht_Metadata" "MaybeOwnedZendString" = "_zend_string *" [enum] diff --git a/components-rs/Cargo.toml b/components-rs/Cargo.toml index dfcc3aee29..7c78ff2cad 100644 --- a/components-rs/Cargo.toml +++ b/components-rs/Cargo.toml @@ -24,6 +24,7 @@ libdd-tinybytes = { path = "../libdatadog/libdd-tinybytes" } libdd-trace-utils = { path = "../libdatadog/libdd-trace-utils" } libdd-trace-stats = { path = "../libdatadog/libdd-trace-stats" } libdd-trace-protobuf = { path = "../libdatadog/libdd-trace-protobuf" } +libdd-crashtracker = { path = "../libdatadog/libdd-crashtracker", default-features = false, features = ["collector"] } libdd-crashtracker-ffi = { path = "../libdatadog/libdd-crashtracker-ffi", default-features = false, features = ["collector"] } libdd-library-config-ffi = { path = "../libdatadog/libdd-library-config-ffi", default-features = false } spawn_worker = { path = "../libdatadog/spawn_worker" } diff --git a/components-rs/common.h b/components-rs/common.h index 9a148cb5d8..1fe7a60f93 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -52,8 +52,6 @@ typedef struct ddog_Endpoint ddog_Endpoint; -typedef struct ddog_Tag ddog_Tag; - /** * Holds the raw parts of a Rust Vec; it should only be created from Rust, * never from C. @@ -412,8 +410,11 @@ typedef enum ddog_RemoteConfigCapabilities { DDOG_REMOTE_CONFIG_CAPABILITIES_APM_TRACING_ENABLE_LIVE_DEBUGGING = 41, DDOG_REMOTE_CONFIG_CAPABILITIES_ASM_DD_MULTICONFIG = 42, DDOG_REMOTE_CONFIG_CAPABILITIES_ASM_TRACE_TAGGING_RULES = 43, + DDOG_REMOTE_CONFIG_CAPABILITIES_ASM_EXTENDED_DATA_COLLECTION = 44, DDOG_REMOTE_CONFIG_CAPABILITIES_APM_TRACING_MULTICONFIG = 45, DDOG_REMOTE_CONFIG_CAPABILITIES_FFE_FLAG_CONFIGURATION_RULES = 46, + DDOG_REMOTE_CONFIG_CAPABILITIES_DD_DATA_STREAMS_TRANSACTION_EXTRACTORS = 47, + DDOG_REMOTE_CONFIG_CAPABILITIES_LLM_OBS_ACTIVATION = 48, } ddog_RemoteConfigCapabilities; typedef enum ddog_RemoteConfigProduct { @@ -426,6 +427,7 @@ typedef enum ddog_RemoteConfigProduct { DDOG_REMOTE_CONFIG_PRODUCT_ASM_FEATURES, DDOG_REMOTE_CONFIG_PRODUCT_FFE_FLAGS, DDOG_REMOTE_CONFIG_PRODUCT_LIVE_DEBUGGER, + DDOG_REMOTE_CONFIG_PRODUCT_LIVE_DEBUGGER_SYMBOL_DB, } ddog_RemoteConfigProduct; typedef enum ddog_SpanProbeTarget { @@ -1110,9 +1112,10 @@ typedef struct ddog_TelemetryWorkerBuilder ddog_TelemetryWorkerBuilder; * The worker won't send data to the agent until you call `TelemetryWorkerHandle::send_start` * * To stop the worker, call `TelemetryWorkerHandle::send_stop` which trigger flush asynchronously - * then `TelemetryWorkerHandle::wait_for_shutdown` + * then `TelemetryWorkerHandle::wait_for_shutdown` (native only — wasm callers rely on the + * SharedRuntime worker JoinHandle instead). */ -typedef struct ddog_TelemetryWorkerHandle ddog_TelemetryWorkerHandle; +typedef struct ddog_TelemetryWorkerHandle_NativeCapabilities ddog_TelemetryWorkerHandle_NativeCapabilities; typedef enum ddog_Option_U64_Tag { DDOG_OPTION_U64_SOME_U64, @@ -1128,6 +1131,12 @@ typedef struct ddog_Option_U64 { }; } ddog_Option_U64; +/** + * FFI-facing alias: the C ABI surface is native-only, so the worker handle is + * always pinned to [`NativeCapabilities`]. + */ +typedef struct ddog_TelemetryWorkerHandle_NativeCapabilities ddog_TelemetryWorkerHandle; + typedef enum ddog_Option_Bool_Tag { DDOG_OPTION_BOOL_SOME_BOOL, DDOG_OPTION_BOOL_NONE_BOOL, diff --git a/components-rs/datadog.h b/components-rs/datadog.h index a1ed98a082..21c7f656fe 100644 --- a/components-rs/datadog.h +++ b/components-rs/datadog.h @@ -55,9 +55,26 @@ struct ddog_Endpoint *datadog_otel_metrics_endpoint_from_url(ddog_CharSlice url) struct ddog_Endpoint *datadog_otel_metrics_endpoint_from_agent_url(ddog_CharSlice url); -void datadog_endpoint_as_crashtracker_config(const struct ddog_Endpoint *endpoint, - void (*callback)(ddog_crasht_EndpointConfig, void*), - void *userdata); +/** + * Initialize crashtracking, selecting the receiver strategy for this process: + * - Linux, sidecar host (`master_pid == getpid()`): the in-process thread-mode sidecar can't + * serve its own crash, so spawn a fork+exec subprocess receiver (like the standalone daemon), + * resolving frames there since a crashing process can't reliably symbolize itself. + * - Linux, worker/collector: connect to the sidecar IPC socket and upgrade it to a crashtracker + * receiver on crash (`SOCK_SEQPACKET` + `enter_crashtracker_receiver`), streaming the report + * over that single socket and resolving frames in-process. + * - other unix (macOS): no sidecar upgrade; the default connector reaches the socket path. + * + * `master_pid` is the thread-mode master listener PID (0 if none): it keys the IPC socket and, on + * Linux, distinguishes the host from a worker. + * + * # Safety + * `endpoint` must point to a valid `Endpoint`; `metadata`'s borrowed strings/tags must outlive the + * call (they are copied into owned storage before it returns). + */ +ddog_MaybeError datadog_crashtracker_init(const struct ddog_Endpoint *endpoint, + ddog_crasht_Metadata metadata, + int32_t master_pid); ddog_Configurator *ddog_library_configurator_new_dummy(bool debug_logs, ddog_CharSlice language); @@ -189,7 +206,12 @@ void ddog_rshutdown_remote_config(struct ddog_RemoteConfigState *remote_config); void ddog_shutdown_remote_config(struct ddog_RemoteConfigState*); -void ddog_drop_probe(struct ddog_Probe probe); +/** + * Free the FFI-owned allocations in a `Probe` (the `tags` vec and the nested + * span-decoration / log allocations) by consuming it; borrowed `CharSlice`s are + * left untouched. Called from `dd_probe_dtor` when a probe is uninstalled. + */ +void ddog_drop_probe(struct ddog_Probe); void ddog_log_debugger_data(const struct ddog_Vec_DebuggerPayload *payloads); diff --git a/components-rs/lib.rs b/components-rs/lib.rs index f73beec72d..b893ea7336 100644 --- a/components-rs/lib.rs +++ b/components-rs/lib.rs @@ -22,7 +22,7 @@ use std::ffi::{c_char, OsStr}; use std::path::Path; use std::ptr::null_mut; use uuid::Uuid; - +use datadog_sidecar::crashtracker::crashtracker_receiver_request_bytes; pub use libdd_crashtracker_ffi::*; pub use libdd_library_config_ffi::*; pub use datadog_sidecar_ffi::*; @@ -196,26 +196,144 @@ pub unsafe extern "C" fn datadog_otel_metrics_endpoint_from_agent_url(url: CharS } } -#[no_mangle] +/// Initialize crashtracking, selecting the receiver strategy for this process: +/// - Linux, sidecar host (`master_pid == getpid()`): the in-process thread-mode sidecar can't +/// serve its own crash, so spawn a fork+exec subprocess receiver (like the standalone daemon), +/// resolving frames there since a crashing process can't reliably symbolize itself. +/// - Linux, worker/collector: connect to the sidecar IPC socket and upgrade it to a crashtracker +/// receiver on crash (`SOCK_SEQPACKET` + `enter_crashtracker_receiver`), streaming the report +/// over that single socket and resolving frames in-process. +/// - other unix (macOS): no sidecar upgrade; the default connector reaches the socket path. +/// +/// `master_pid` is the thread-mode master listener PID (0 if none): it keys the IPC socket and, on +/// Linux, distinguishes the host from a worker. +/// +/// # Safety +/// `endpoint` must point to a valid `Endpoint`; `metadata`'s borrowed strings/tags must outlive the +/// call (they are copied into owned storage before it returns). #[cfg(unix)] -pub unsafe extern "C" fn datadog_endpoint_as_crashtracker_config( +#[no_mangle] +#[allow(clippy::missing_safety_doc)] +pub unsafe extern "C" fn datadog_crashtracker_init( endpoint: &Endpoint, - callback: unsafe extern "C" fn(EndpointConfig<'_>, *mut std::ffi::c_void), - userdata: *mut std::ffi::c_void, -) { - let url_str = endpoint.url.to_string(); - unsafe { - callback( - EndpointConfig { - url: CharSlice::from(url_str.as_str()), - api_key: CharSlice::from(endpoint.api_key.as_deref().unwrap_or("")), - test_token: CharSlice::from(endpoint.test_token.as_deref().unwrap_or("")), - timeout: endpoint.timeout_ms, - use_system_resolver: endpoint.use_system_resolver, - }, - userdata, - ); + metadata: Metadata, + master_pid: i32, +) -> MaybeError { + use libdd_crashtracker::{CrashtrackerConfiguration, StacktraceCollection}; + + let result = (|| -> anyhow::Result<()> { + let metadata: libdd_crashtracker::Metadata = metadata.try_into()?; + + let mut builder = CrashtrackerConfiguration::builder() + .collect_all_threads(true) + .timeout(std::time::Duration::from_millis(5000)) + .endpoint_use_system_resolver(endpoint.use_system_resolver) + .endpoint_url(&endpoint.url.to_string()); + if let Some(api_key) = endpoint.api_key.as_deref() { + builder = builder.endpoint_api_key(api_key); + } + if let Some(test_token) = endpoint.test_token.as_deref() { + builder = builder.endpoint_test_token(test_token); + } + if endpoint.timeout_ms != 0 { + builder = builder.endpoint_timeout_ms(endpoint.timeout_ms); + } + + #[cfg(target_os = "linux")] + { + // Worker/collector: open a fresh connection to the sidecar IPC socket, upgrade it with + // the SEQPACKET connector, and resolve frames in-process. + if master_pid == 0 || master_pid != std::process::id() as i32 { + let socket_path = datadog_sidecar::crashtracker::crashtracker_ipc_socket_path( + master_pid as u32, + datadog_sidecar::config::FromEnv::ipc_mode(), + ); + // Prime the request bytes outside the crash handler so the connector never + // allocates in signal context. + let _ = crashtracker_receiver_request_bytes(); + let config = builder + .resolve_frames(StacktraceCollection::EnabledWithInprocessSymbols) + .unix_socket_path(socket_path.to_string_lossy().into_owned()) + .unix_socket_connector( + datadog_sidecar::crashtracker::connect_to_sidecar_receiver, + ) + .build()?; + return libdd_crashtracker::init( + config, + libdd_crashtracker::CrashtrackerReceiverConfig::default(), + metadata, + ); + } + // Thread-mode host: its in-process sidecar can't serve its own crash, so spawn a + // transient fork+exec subprocess receiver and resolve frames there. + let config = builder + .resolve_frames(StacktraceCollection::EnabledWithSymbolsInReceiver) + .build()?; + let receiver_config = + datadog_sidecar::build_crashtracker_receiver_config(None, None)?; + libdd_crashtracker::init(config, receiver_config, metadata) + } + + // macOS can't open a fresh SOCK_SEQPACKET connection signal-safely, so reuse the + // already-open sidecar fd and upgrade it at crash time (no-op if there's no connection). + // The path is a placeholder the connector ignores; it just has to be non-empty so the + // crashtracker takes the connector path. + #[cfg(target_os = "macos")] + { + // Prime the request bytes outside the crash handler so the connector never + // allocates in signal context. + let _ = crashtracker_receiver_request_bytes(); + let config = builder + .resolve_frames(StacktraceCollection::EnabledWithInprocessSymbols) + .unix_socket_path("datadog-sidecar-crashtracker".to_string()) + .unix_socket_connector(reuse_sidecar_fd_connector) + .build()?; + libdd_crashtracker::init( + config, + libdd_crashtracker::CrashtrackerReceiverConfig::default(), + metadata, + ) + } + + #[cfg(not(any(target_os = "linux", target_os = "macos")))] + { + let _ = (master_pid, builder, metadata); + Ok(()) + } + })(); + match result { + Ok(()) => MaybeError::None, + Err(e) => { + MaybeError::Some(Error::from(format!("{e:?}"))) + } + } +} + +/// On macos we cannot easily create a new signal safe connection to the sidecar, so we reuse the +/// already open fd from datadog_sidecar_for_signal. +#[cfg(target_os = "macos")] +fn reuse_sidecar_fd_connector(_unix_socket_path: &str) -> std::os::fd::RawFd { + extern "C" { + // Set by the sidecar connect path (sidecar.c) to the live transport for best-effort + // signal-handler use; null when there is no connection. The transport pointer is stable + // across transparent reconnects (only its inner sender is swapped), so reading the fd + // through it stays current. Typed as an opaque pointer to keep the `extern` block FFI-safe; + // cast to the real type below. + static mut datadog_sidecar_for_signal: *mut std::ffi::c_void; + } + + // Best-effort, signal context: read the transport pointer and get its current fd via + // SidecarTransport::signal_fd (which uses get_mut, never locking). Going through the raw + // pointer knowingly bypasses aliasing checks — the crashing thread is the only realistic + // accessor. + let transport = unsafe { datadog_sidecar_for_signal } + as *mut datadog_sidecar::service::blocking::SidecarTransport; + if transport.is_null() { + return -1; } + let fd = unsafe { (*transport).as_raw_fd() }; + let bytes = crashtracker_receiver_request_bytes(); + let sent = unsafe { libc::send(dup, bytes.as_ptr() as *const libc::c_void, bytes.len(), 0) }; } // Hack: Without this, the PECL build of the tracer does not contain the ddog_library_* functions diff --git a/components-rs/php_sidecar_mockgen/mock_php.shared_lib b/components-rs/php_sidecar_mockgen/mock_php.shared_lib new file mode 100755 index 0000000000000000000000000000000000000000..44c5c154629d5dd6e7ae66a8a56960801bfbff2a GIT binary patch literal 59192 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 R&*;m}o;T%kRn~O!zW{!(=Y0SG literal 0 HcmV?d00001 diff --git a/components-rs/remote_config.rs b/components-rs/remote_config.rs index f39ae1ac51..fe60fef2aa 100644 --- a/components-rs/remote_config.rs +++ b/components-rs/remote_config.rs @@ -650,9 +650,6 @@ pub extern "C" fn ddog_remote_configs_service_env_change( tags: &libdd_common_ffi::Vec, process_tags: &libdd_common_ffi::Vec, ) -> bool { - // libdatadog now hides `Target`'s fields and exposes a constructor. `tags` - // and `process_tags` are stored as already-formatted "key:value" strings, - // so convert the incoming `Tag`s via their `Display` impl. let new_target = Target::new( service.to_utf8_lossy().to_string(), env.to_utf8_lossy().to_string(), diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 14c3b0c6c8..de6df3cb55 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -442,11 +442,6 @@ ddog_MaybeError ddog_sidecar_set_test_session_token(struct ddog_SidecarTransport void ddog_sidecar_reconnect(struct ddog_SidecarTransport **transport, struct ddog_SidecarTransport *(*factory)(void)); -/** - * Return the path of the crashtracker unix domain socket. - */ -ddog_CharSlice ddog_sidecar_get_crashtracker_unix_socket_path(void); - /** * Gets an agent info reader. */ diff --git a/components-rs/stats.rs b/components-rs/stats.rs index 8fd2a67a73..f09cb9a935 100644 --- a/components-rs/stats.rs +++ b/components-rs/stats.rs @@ -149,13 +149,7 @@ fn build_fixed_key<'a>(span: &'a PhpSpanStats<'a>) -> FixedAggregationKey<&'a st http_endpoint: extract_http_endpoint(span), http_status_code: extract_http_status_code(span), is_synthetics_request: is_synthetics_request(span), - // `is_trace_root` became a three-valued `Trilean` in libdatadog; the PHP - // side only ever knows true/false, so map the bool onto True/False. - is_trace_root: if span.is_trace_root { - Trilean::True - } else { - Trilean::False - }, + is_trace_root: if span.is_trace_root { Trilean::True } else { Trilean::False }, grpc_status_code: extract_grpc_status_code(span), service_source: char_slice_str(span.service_source), } diff --git a/components-rs/telemetry.h b/components-rs/telemetry.h index eec7db11e7..0e818ddc0f 100644 --- a/components-rs/telemetry.h +++ b/components-rs/telemetry.h @@ -52,7 +52,7 @@ ddog_MaybeError ddog_telemetry_builder_with_config(struct ddog_TelemetryWorkerBu * * handle should be a non null pointer to a null pointer */ ddog_MaybeError ddog_telemetry_builder_run(struct ddog_TelemetryWorkerBuilder *builder, - struct ddog_TelemetryWorkerHandle **out_handle); + ddog_TelemetryWorkerHandle **out_handle); /** * Builds the telemetry worker and return a handle to it. The worker will only process and send @@ -63,13 +63,23 @@ ddog_MaybeError ddog_telemetry_builder_run(struct ddog_TelemetryWorkerBuilder *b * * handle should be a non null pointer to a null pointer */ ddog_MaybeError ddog_telemetry_builder_run_metric_logs(struct ddog_TelemetryWorkerBuilder *builder, - struct ddog_TelemetryWorkerHandle **out_handle); + ddog_TelemetryWorkerHandle **out_handle); +/** + * Sets the telemetry endpoint from its component parts. + * + * * `api_key` / `test_token`: ignored when empty. + * * `timeout_ms`: pass 0 to keep the existing/default timeout. + */ ddog_MaybeError ddog_telemetry_builder_with_endpoint_config_endpoint(struct ddog_TelemetryWorkerBuilder *telemetry_builder, - const struct ddog_Endpoint *endpoint); + ddog_CharSlice url, + ddog_CharSlice api_key, + uint64_t timeout_ms, + ddog_CharSlice test_token, + bool use_system_resolver); /** - * Sets a property from it's string value. + * Sets the endpoint property from its component parts. * * Available properties: * @@ -77,10 +87,14 @@ ddog_MaybeError ddog_telemetry_builder_with_endpoint_config_endpoint(struct ddog */ ddog_MaybeError ddog_telemetry_builder_with_property_endpoint(struct ddog_TelemetryWorkerBuilder *telemetry_builder, enum ddog_TelemetryWorkerBuilderEndpointProperty _property, - const struct ddog_Endpoint *endpoint); + ddog_CharSlice url, + ddog_CharSlice api_key, + uint64_t timeout_ms, + ddog_CharSlice test_token, + bool use_system_resolver); /** - * Sets a property from it's string value. + * Sets a named endpoint property from its component parts. * * Available properties: * @@ -88,7 +102,11 @@ ddog_MaybeError ddog_telemetry_builder_with_property_endpoint(struct ddog_Teleme */ ddog_MaybeError ddog_telemetry_builder_with_endpoint_named_property(struct ddog_TelemetryWorkerBuilder *telemetry_builder, ddog_CharSlice property, - const struct ddog_Endpoint *endpoint); + ddog_CharSlice url, + ddog_CharSlice api_key, + uint64_t timeout_ms, + ddog_CharSlice test_token, + bool use_system_resolver); ddog_MaybeError ddog_telemetry_builder_with_str_application_service_version(struct ddog_TelemetryWorkerBuilder *telemetry_builder, ddog_CharSlice param); @@ -239,11 +257,11 @@ ddog_MaybeError ddog_telemetry_builder_with_bool_named_property(struct ddog_Tele ddog_CharSlice property, bool param); -ddog_MaybeError ddog_telemetry_handle_add_dependency(const struct ddog_TelemetryWorkerHandle *handle, +ddog_MaybeError ddog_telemetry_handle_add_dependency(const ddog_TelemetryWorkerHandle *handle, ddog_CharSlice dependency_name, ddog_CharSlice dependency_version); -ddog_MaybeError ddog_telemetry_handle_add_integration(const struct ddog_TelemetryWorkerHandle *handle, +ddog_MaybeError ddog_telemetry_handle_add_integration(const ddog_TelemetryWorkerHandle *handle, ddog_CharSlice dependency_name, ddog_CharSlice dependency_version, bool enabled, @@ -256,33 +274,33 @@ ddog_MaybeError ddog_telemetry_handle_add_integration(const struct ddog_Telemetr * * stack_trace: stack trace associated with the log. If no stack trace is available, an empty * string should be passed */ -ddog_MaybeError ddog_telemetry_handle_add_log(const struct ddog_TelemetryWorkerHandle *handle, +ddog_MaybeError ddog_telemetry_handle_add_log(const ddog_TelemetryWorkerHandle *handle, ddog_CharSlice indentifier, ddog_CharSlice message, enum ddog_LogLevel level, ddog_CharSlice stack_trace); -ddog_MaybeError ddog_telemetry_handle_start(const struct ddog_TelemetryWorkerHandle *handle); +ddog_MaybeError ddog_telemetry_handle_start(const ddog_TelemetryWorkerHandle *handle); -struct ddog_TelemetryWorkerHandle *ddog_telemetry_handle_clone(const struct ddog_TelemetryWorkerHandle *handle); +ddog_TelemetryWorkerHandle *ddog_telemetry_handle_clone(const ddog_TelemetryWorkerHandle *handle); -ddog_MaybeError ddog_telemetry_handle_stop(const struct ddog_TelemetryWorkerHandle *handle); +ddog_MaybeError ddog_telemetry_handle_stop(const ddog_TelemetryWorkerHandle *handle); /** * * compatible: should be false if the metric is language specific, true otherwise */ -struct ddog_ContextKey ddog_telemetry_handle_register_metric_context(const struct ddog_TelemetryWorkerHandle *handle, +struct ddog_ContextKey ddog_telemetry_handle_register_metric_context(const ddog_TelemetryWorkerHandle *handle, ddog_CharSlice name, enum ddog_MetricType metric_type, struct ddog_Vec_Tag tags, bool common, enum ddog_MetricNamespace namespace_); -ddog_MaybeError ddog_telemetry_handle_add_point(const struct ddog_TelemetryWorkerHandle *handle, +ddog_MaybeError ddog_telemetry_handle_add_point(const ddog_TelemetryWorkerHandle *handle, const struct ddog_ContextKey *context_key, double value); -ddog_MaybeError ddog_telemetry_handle_add_point_with_tags(const struct ddog_TelemetryWorkerHandle *handle, +ddog_MaybeError ddog_telemetry_handle_add_point_with_tags(const ddog_TelemetryWorkerHandle *handle, const struct ddog_ContextKey *context_key, double value, struct ddog_Vec_Tag extra_tags); @@ -290,18 +308,18 @@ ddog_MaybeError ddog_telemetry_handle_add_point_with_tags(const struct ddog_Tele /** * This function takes ownership of the handle. It should not be used after calling it */ -void ddog_telemetry_handle_wait_for_shutdown(struct ddog_TelemetryWorkerHandle *handle); +void ddog_telemetry_handle_wait_for_shutdown(ddog_TelemetryWorkerHandle *handle); /** * This function takes ownership of the handle. It should not be used after calling it */ -void ddog_telemetry_handle_wait_for_shutdown_ms(struct ddog_TelemetryWorkerHandle *handle, +void ddog_telemetry_handle_wait_for_shutdown_ms(ddog_TelemetryWorkerHandle *handle, uint64_t wait_for_ms); /** * Drops the handle without waiting for shutdown. The worker will continue running in the * background until it exits by itself */ -void ddog_telemetry_handle_drop(struct ddog_TelemetryWorkerHandle *handle); +void ddog_telemetry_handle_drop(ddog_TelemetryWorkerHandle *handle); #endif /* DDOG_TELEMETRY_H */ diff --git a/ext/signals.c b/ext/signals.c index 7def8a44e8..2432234f89 100644 --- a/ext/signals.c +++ b/ext/signals.c @@ -13,6 +13,7 @@ #include #include #include +#include // getpid / geteuid for crashtracker role selection #include "configuration.h" #include "datadog.h" @@ -26,6 +27,7 @@ #include #include #include +#include #if PHP_VERSION_ID >= 80000 #include @@ -53,7 +55,6 @@ // true globals; only modify in MINIT/MSHUTDOWN static stack_t dd_altstack; static struct sigaction dd_sigsegv_sigaction; -static char crashtracker_socket_path[100] = {0}; static char *dd_signal_async_stack; static size_t dd_signal_async_stack_size; @@ -114,17 +115,6 @@ static void dd_sigsegv_handler(int sig) { _Exit(128 + sig); } -static bool dd_crashtracker_check_result(ddog_VoidResult result, const char *msg) { - if (result.tag != DDOG_VOID_RESULT_OK) { - ddog_CharSlice error_msg = ddog_Error_message(&result.err); - LOG(ERROR, "%s : %.*s", msg, (int) error_msg.len, error_msg.ptr); - ddog_Error_drop(&result.err); - return false; - } - - return true; -} - #if PHP_VERSION_ID >= 80000 static zend_never_inline ZEND_COLD void dd_crasht_failed_tag_push( ddog_Error *err, @@ -235,54 +225,18 @@ static void dd_crasht_add_opcache_inis(ddog_Vec_Tag *tags) { #endif } -typedef struct { - ddog_crasht_Config config; - ddog_crasht_Metadata metadata; -} dd_crasht_init_args; - -static void dd_crasht_do_init(ddog_crasht_EndpointConfig endpoint_config, void *userdata) { - dd_crasht_init_args *args = (dd_crasht_init_args *)userdata; - args->config.endpoint = endpoint_config; - dd_crashtracker_check_result( - ddog_crasht_init_without_receiver(args->config, args->metadata), - "Cannot initialize CrashTracker" - ); -} - static void dd_init_crashtracker() { - ddog_CharSlice socket_path = ddog_sidecar_get_crashtracker_unix_socket_path(); - if (socket_path.len > sizeof(crashtracker_socket_path) - 1) { - LOG(ERROR, "Cannot initialize CrashTracker : the socket path is too long."); - free((void *) socket_path.ptr); - return; - } - - // Copy the string to a global buffer to avoid a use-after-free error - memcpy(crashtracker_socket_path, socket_path.ptr, socket_path.len); - crashtracker_socket_path[socket_path.len] = '\0'; - free((void *) socket_path.ptr); - socket_path.ptr = crashtracker_socket_path; - if (!datadog_endpoint) { return; } ddog_Vec_Tag tags = ddog_Vec_Tag_new(); dd_crasht_add_opcache_inis(&tags); + ddog_crasht_Metadata metadata = datadog_setup_crashtracking_metadata(&tags); - dd_crasht_init_args args = { - .config = { - .timeout_ms = 5000, - .resolve_frames = DDOG_CRASHT_STACKTRACE_COLLECTION_ENABLED_WITH_INPROCESS_SYMBOLS, - .optional_unix_socket_filename = socket_path, - .additional_files = {0}, - .collect_all_threads = true, - .max_threads = 0, // uses libdatadog default, which is 256 - }, - .metadata = datadog_setup_crashtracking_metadata(&tags), - }; - - datadog_endpoint_as_crashtracker_config(datadog_endpoint, dd_crasht_do_init, &args); + int32_t master_pid = datadog_sidecar_active_mode == DD_SIDECAR_CONNECTION_THREAD ? datadog_sidecar_master_pid : 0; + datadog_ffi_try("Cannot initialize CrashTracker", + datadog_crashtracker_init(datadog_endpoint, metadata, master_pid)); datadog_register_crashtracking_frames_collection(); diff --git a/libdatadog b/libdatadog index 15899dfe75..b71e533647 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit 15899dfe754d12186ce7db72f0ff41c1920d52ec +Subproject commit b71e5336474075925f8f518143497f31380ddb65 From b562541957917c24e567a2c947cba73c84c1c00e Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 24 Jul 2026 17:43:45 +0200 Subject: [PATCH 4/6] Fixup testsuite Signed-off-by: Bob Weinand --- tests/ext/appsec/agentic_onboarding_test.inc | 2 +- tests/ext/appsec/sca_test.inc | 2 +- tests/ext/library_config/fleet_config.phpt | 2 +- tests/ext/library_config/local_config.phpt | 2 +- tests/ext/telemetry/broken_pipe.phpt | 2 +- tests/ext/telemetry/composer.phpt | 2 +- tests/ext/telemetry/config.phpt | 2 +- tests/ext/telemetry/disabled.phpt | 2 +- tests/ext/telemetry/integration.phpt | 2 +- tests/ext/telemetry/integration_filesystem_01.phpt | 2 +- tests/ext/telemetry/integration_filesystem_02.phpt | 2 +- tests/ext/telemetry/integration_filesystem_03.phpt | 2 +- tests/ext/telemetry/integration_filesystem_04.phpt | 2 +- tests/ext/telemetry/integration_runtime_error.phpt | 2 +- tests/ext/telemetry/metrics_logs_created.phpt | 2 +- tests/ext/telemetry/metrics_spans_created.phpt | 2 +- tests/ext/telemetry/simple.phpt | 2 +- tests/ext/telemetry/telemetry_process_tags.phpt | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/ext/appsec/agentic_onboarding_test.inc b/tests/ext/appsec/agentic_onboarding_test.inc index 89adfc53d2..b8b5833eb0 100644 --- a/tests/ext/appsec/agentic_onboarding_test.inc +++ b/tests/ext/appsec/agentic_onboarding_test.inc @@ -19,7 +19,7 @@ for ($i = 0; $i < 300; ++$i) { if (file_exists(__DIR__ . '/'.$id.'-telemetry.out')) { $batches = []; foreach (file(__DIR__ . '/'.$id.'-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); if ($json) { if ($json["application"]["service_name"] == "background_sender-php-service" || $json["application"]["service_name"] == "datadog-ipc-helper") { diff --git a/tests/ext/appsec/sca_test.inc b/tests/ext/appsec/sca_test.inc index eae3fa2664..042a38d295 100644 --- a/tests/ext/appsec/sca_test.inc +++ b/tests/ext/appsec/sca_test.inc @@ -19,7 +19,7 @@ for ($i = 0; $i < 300; ++$i) { if (file_exists(__DIR__ . '/'.$id.'-telemetry.out')) { $batches = []; foreach (file(__DIR__ . '/'.$id.'-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); if ($json) { if ($json["application"]["service_name"] == "background_sender-php-service" || $json["application"]["service_name"] == "datadog-ipc-helper") { diff --git a/tests/ext/library_config/fleet_config.phpt b/tests/ext/library_config/fleet_config.phpt index 3078cf3899..d2d63bf07e 100644 --- a/tests/ext/library_config/fleet_config.phpt +++ b/tests/ext/library_config/fleet_config.phpt @@ -42,7 +42,7 @@ for ($i = 0; $i < 100; ++$i) { ("us" . "leep")(100000); if (file_exists(__DIR__ . '/fleet-config-telemetry.out')) { foreach (file(__DIR__ . '/fleet-config-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/library_config/local_config.phpt b/tests/ext/library_config/local_config.phpt index 0bd2b41fc2..5f7a2e6e77 100644 --- a/tests/ext/library_config/local_config.phpt +++ b/tests/ext/library_config/local_config.phpt @@ -42,7 +42,7 @@ for ($i = 0; $i < 100; ++$i) { ("us" . "leep")(100000); if (file_exists(__DIR__ . '/local-config-telemetry.out')) { foreach (file(__DIR__ . '/local-config-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/broken_pipe.phpt b/tests/ext/telemetry/broken_pipe.phpt index 425770418c..d4686176cf 100644 --- a/tests/ext/telemetry/broken_pipe.phpt +++ b/tests/ext/telemetry/broken_pipe.phpt @@ -38,7 +38,7 @@ for ($i = 0; $i < 300; ++$i) { if (file_exists(__DIR__ . '/broken_pipe-telemetry.out')) { $batches = []; foreach (file(__DIR__ . '/broken_pipe-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); if ($json["application"]["service_name"] == "background_sender-php-service" || $json["application"]["service_name"] == "datadog-ipc-helper") { continue; diff --git a/tests/ext/telemetry/composer.phpt b/tests/ext/telemetry/composer.phpt index 3edf95a73d..700c95dc28 100644 --- a/tests/ext/telemetry/composer.phpt +++ b/tests/ext/telemetry/composer.phpt @@ -27,7 +27,7 @@ for ($i = 0; $i < 300; ++$i) { ("us" . "leep")(100000); if (file_exists(__DIR__ . '/composer-telemetry.out')) { foreach (file(__DIR__ . '/composer-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/config.phpt b/tests/ext/telemetry/config.phpt index fdebcc03fb..007f2722ae 100644 --- a/tests/ext/telemetry/config.phpt +++ b/tests/ext/telemetry/config.phpt @@ -42,7 +42,7 @@ for ($i = 0; $i < 300; ++$i) { ("us" . "leep")(100000); if (file_exists(__DIR__ . '/config-telemetry.out')) { foreach (file(__DIR__ . '/config-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/disabled.phpt b/tests/ext/telemetry/disabled.phpt index 606c412925..757758a22c 100644 --- a/tests/ext/telemetry/disabled.phpt +++ b/tests/ext/telemetry/disabled.phpt @@ -19,7 +19,7 @@ DDTrace\close_span(); dd_trace_internal_fn("finalize_telemetry"); usleep(100000); -var_dump(file_exists(__DIR__ . '/disabled-telemetry.out')); +var_dump(strpos(@file_get_contents(__DIR__ . '/disabled-telemetry.out') ?: "", "app-started")); ?> --EXPECT-- diff --git a/tests/ext/telemetry/integration.phpt b/tests/ext/telemetry/integration.phpt index 8e74be2293..cde1e21ad9 100644 --- a/tests/ext/telemetry/integration.phpt +++ b/tests/ext/telemetry/integration.phpt @@ -48,7 +48,7 @@ namespace ("us" . "leep")(100000); if (file_exists(__DIR__ . '/integration-telemetry.out')) { foreach (file(__DIR__ . '/integration-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/integration_filesystem_01.phpt b/tests/ext/telemetry/integration_filesystem_01.phpt index 1e27e3de85..3591fec542 100644 --- a/tests/ext/telemetry/integration_filesystem_01.phpt +++ b/tests/ext/telemetry/integration_filesystem_01.phpt @@ -25,7 +25,7 @@ namespace usleep(100000); if (file_exists($file )) { foreach (file($file) as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/integration_filesystem_02.phpt b/tests/ext/telemetry/integration_filesystem_02.phpt index 1a3fa6930f..685626318d 100644 --- a/tests/ext/telemetry/integration_filesystem_02.phpt +++ b/tests/ext/telemetry/integration_filesystem_02.phpt @@ -25,7 +25,7 @@ namespace usleep(100000); if (file_exists($file )) { foreach (file($file) as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/integration_filesystem_03.phpt b/tests/ext/telemetry/integration_filesystem_03.phpt index c1abac3f0d..61275011d1 100644 --- a/tests/ext/telemetry/integration_filesystem_03.phpt +++ b/tests/ext/telemetry/integration_filesystem_03.phpt @@ -27,7 +27,7 @@ namespace usleep(100000); if (file_exists($file )) { foreach (file($file) as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/integration_filesystem_04.phpt b/tests/ext/telemetry/integration_filesystem_04.phpt index a8eb145e9a..16fe5991cf 100644 --- a/tests/ext/telemetry/integration_filesystem_04.phpt +++ b/tests/ext/telemetry/integration_filesystem_04.phpt @@ -25,7 +25,7 @@ namespace usleep(100000); if (file_exists($file )) { foreach (file($file) as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/integration_runtime_error.phpt b/tests/ext/telemetry/integration_runtime_error.phpt index 3a8a03aa35..896e251df6 100644 --- a/tests/ext/telemetry/integration_runtime_error.phpt +++ b/tests/ext/telemetry/integration_runtime_error.phpt @@ -39,7 +39,7 @@ for ($i = 0; $i < 300; ++$i) { ("us" . "leep")(100000); if (file_exists(__DIR__ . '/integration-runtime-error-telemetry.out')) { foreach (file(__DIR__ . '/integration-runtime-error-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); $batch = $json["request_type"] == "message-batch" ? $json["payload"] : [$json]; foreach ($batch as $json) { diff --git a/tests/ext/telemetry/metrics_logs_created.phpt b/tests/ext/telemetry/metrics_logs_created.phpt index 16fb8bd876..9769ca4712 100644 --- a/tests/ext/telemetry/metrics_logs_created.phpt +++ b/tests/ext/telemetry/metrics_logs_created.phpt @@ -24,7 +24,7 @@ for ($i = 0; $i < 300; ++$i) { ("us" . "leep")(100000); if (file_exists(__DIR__ . '/metrics-logs-created-telemetry.out')) { foreach (file(__DIR__ . '/metrics-logs-created-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); if (($json["application"]["language_version"] ?? "") == "SIDECAR") { continue; diff --git a/tests/ext/telemetry/metrics_spans_created.phpt b/tests/ext/telemetry/metrics_spans_created.phpt index cf45f052cc..c63ed2648d 100644 --- a/tests/ext/telemetry/metrics_spans_created.phpt +++ b/tests/ext/telemetry/metrics_spans_created.phpt @@ -84,7 +84,7 @@ namespace ("us" . "leep")(100000); if (file_exists(__DIR__ . '/metrics-spans_created-telemetry.out')) { foreach (file(__DIR__ . '/metrics-spans_created-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); if (($json["application"]["language_version"] ?? "") == "SIDECAR") { continue; diff --git a/tests/ext/telemetry/simple.phpt b/tests/ext/telemetry/simple.phpt index 2279f460f5..a11fc653eb 100644 --- a/tests/ext/telemetry/simple.phpt +++ b/tests/ext/telemetry/simple.phpt @@ -33,7 +33,7 @@ for ($i = 0; $i < 300; ++$i) { if (file_exists(__DIR__ . '/simple-telemetry.out')) { $batches = []; foreach (file(__DIR__ . '/simple-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); if ($json["application"]["service_name"] == "background_sender-php-service" || $json["application"]["service_name"] == "datadog-ipc-helper") { continue; diff --git a/tests/ext/telemetry/telemetry_process_tags.phpt b/tests/ext/telemetry/telemetry_process_tags.phpt index 503ccf10c1..a92bbd4422 100644 --- a/tests/ext/telemetry/telemetry_process_tags.phpt +++ b/tests/ext/telemetry/telemetry_process_tags.phpt @@ -31,7 +31,7 @@ for ($i = 0; $i < 300; ++$i) { ("us" . "leep")(100000); if (file_exists(__DIR__ . '/process-tags-telemetry.out')) { foreach (file(__DIR__ . '/process-tags-telemetry.out') as $l) { - if ($l) { + if ($l && $l[0] == '{') { $json = json_decode($l, true); var_dump($json["application"]["process_tags"]); break 2; From 8726cae6e52379825e4bf22ef2a3a47b9282fd79 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 24 Jul 2026 18:19:28 +0200 Subject: [PATCH 5/6] Fix windows Signed-off-by: Bob Weinand --- components-rs/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/components-rs/lib.rs b/components-rs/lib.rs index b893ea7336..a787ca9d1c 100644 --- a/components-rs/lib.rs +++ b/components-rs/lib.rs @@ -22,6 +22,7 @@ use std::ffi::{c_char, OsStr}; use std::path::Path; use std::ptr::null_mut; use uuid::Uuid; +#[cfg(unix)] use datadog_sidecar::crashtracker::crashtracker_receiver_request_bytes; pub use libdd_crashtracker_ffi::*; pub use libdd_library_config_ffi::*; From 2d5858d3d8f61ab4343117b97a7e718d80265a2f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 24 Jul 2026 20:09:33 +0200 Subject: [PATCH 6/6] libdatadog update --- Cargo.lock | 5 ++++- libdatadog | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4d68ac668c..7d190dfa02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1284,7 +1284,8 @@ dependencies = [ "constcat", "futures", "http", - "http-body-util", + "libdd-capabilities", + "libdd-capabilities-impl", "libdd-common", "libdd-data-pipeline", "libdd-remote-config", @@ -2772,6 +2773,8 @@ version = "2.1.0" dependencies = [ "anyhow", "bytes", + "futures-channel", + "futures-util", "http", "thiserror 1.0.69", ] diff --git a/libdatadog b/libdatadog index b71e533647..43156bbe53 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit b71e5336474075925f8f518143497f31380ddb65 +Subproject commit 43156bbe53c026fdeeaeb3777cb9d4054507a250