diff --git a/Cargo.lock b/Cargo.lock index b2ea6a67fcb..b735232ff7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -319,7 +319,7 @@ dependencies = [ "addr2line", "cfg-if", "libc 0.2.177", - "miniz_oxide", + "miniz_oxide 0.8.3", "object 0.36.7", "rustc-demangle", "windows-targets 0.52.6", @@ -405,15 +405,15 @@ checksum = "a1d084b0137aaa901caf9f1e8b21daa6aa24d41cd806e111335541eff9683bd6" [[package]] name = "blazesym" -version = "0.2.0-rc.5" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95824d1dd4f20b4a4dfa63b72954e81914a718357231468180b30314e85057fa" +checksum = "48ceccc54b9c3e60e5f36b0498908c8c0f87387229cb0e0e5d65a074e00a8ba4" dependencies = [ - "cpp_demangle", + "cpp_demangle 0.5.1", "gimli 0.32.0", "libc 0.2.177", "memmap2", - "miniz_oxide", + "miniz_oxide 0.9.0", "rustc-demangle", ] @@ -632,7 +632,7 @@ dependencies = [ "serde_json", "syn 2.0.96", "tempfile", - "toml", + "toml 0.8.19", ] [[package]] @@ -651,7 +651,7 @@ dependencies = [ "serde_json", "syn 2.0.96", "tempfile", - "toml", + "toml 0.8.19", ] [[package]] @@ -951,6 +951,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cpp_demangle" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0667304c32ea56cb4cd6d2d7c0cfe9a2f8041229db8c033af7f8d69492429def" +dependencies = [ + "cfg-if", +] + [[package]] name = "cpu-time" version = "1.0.0" @@ -1025,6 +1034,12 @@ dependencies = [ "itertools 0.10.5", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -1208,6 +1223,12 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "data-encoding" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" + [[package]] name = "datadog-ffe" version = "1.0.0" @@ -1241,7 +1262,7 @@ dependencies = [ "glibc_version", "io-lifetimes", "libc 0.2.177", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-tinybytes", "memfd", "nix 0.29.0", @@ -1275,14 +1296,15 @@ name = "datadog-live-debugger" version = "0.0.1" dependencies = [ "anyhow", + "bytes", "constcat", + "http", "http-body-util", - "hyper 1.6.0", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-data-pipeline", "percent-encoding 2.3.1", "regex", - "regex-automata 0.4.9", + "regex-automata", "serde", "serde_json", "smallvec", @@ -1297,7 +1319,7 @@ version = "0.0.1" dependencies = [ "build_common", "datadog-live-debugger", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-common-ffi", "log 0.4.25", "percent-encoding 2.3.1", @@ -1328,7 +1350,7 @@ dependencies = [ "lazy_static", "libc 0.2.177", "libdd-alloc", - "libdd-common 1.1.0 (git+https://github.com/DataDog/libdatadog?tag=v27.0.0)", + "libdd-common 1.1.0", "libdd-library-config-ffi", "libdd-profiling", "log 0.4.25", @@ -1360,7 +1382,7 @@ dependencies = [ "http-body-util", "hyper 1.6.0", "hyper-util", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-trace-protobuf", "manual_future", "regex", @@ -1394,9 +1416,8 @@ dependencies = [ "http", "http-body-util", "httpmock", - "hyper 1.6.0", "libc 0.2.177", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-common-ffi", "libdd-crashtracker", "libdd-crashtracker-ffi", @@ -1441,7 +1462,7 @@ dependencies = [ "datadog-sidecar", "http", "libc 0.2.177", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-common-ffi", "libdd-crashtracker-ffi", "libdd-dogstatsd-client", @@ -1484,7 +1505,7 @@ dependencies = [ "itertools 0.11.0", "lazy_static", "libc 0.2.177", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-common-ffi", "libdd-crashtracker-ffi", "libdd-library-config-ffi", @@ -1495,7 +1516,7 @@ dependencies = [ "log 0.4.25", "paste", "regex", - "regex-automata 0.4.9", + "regex-automata", "serde", "serde_json", "serde_with", @@ -1646,6 +1667,18 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "enum-ordinalize" version = "3.1.15" @@ -1781,7 +1814,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.3", ] [[package]] @@ -2183,6 +2216,52 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hickory-proto" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna 1.0.3", + "ipnet", + "once_cell", + "rand 0.9.0", + "ring", + "thiserror 2.0.12", + "tinyvec", + "tokio", + "tracing", + "url 2.5.4", +] + +[[package]] +name = "hickory-resolver" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "moka", + "once_cell", + "parking_lot", + "rand 0.9.0", + "resolv-conf", + "smallvec", + "thiserror 2.0.12", + "tokio", + "tracing", +] + [[package]] name = "home" version = "0.5.9" @@ -2601,6 +2680,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "ipconfig" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +dependencies = [ + "socket2 0.5.10", + "widestring", + "windows-sys 0.48.0", + "winreg", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -2777,9 +2868,9 @@ dependencies = [ [[package]] name = "libdd-common" version = "1.1.0" +source = "git+https://github.com/DataDog/libdatadog?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" dependencies = [ "anyhow", - "bytes", "cc", "const_format", "futures", @@ -2793,11 +2884,9 @@ dependencies = [ "hyper 1.6.0", "hyper-rustls", "hyper-util", - "indexmap 2.12.1", "libc 0.2.177", - "maplit", "mime 0.3.17", - "multer", + "multipart", "nix 0.29.0", "pin-project", "rand 0.8.5", @@ -2807,7 +2896,6 @@ dependencies = [ "rustls-native-certs", "serde", "static_assertions", - "tempfile", "thiserror 1.0.69", "tokio", "tokio-rustls", @@ -2817,10 +2905,10 @@ dependencies = [ [[package]] name = "libdd-common" -version = "1.1.0" -source = "git+https://github.com/DataDog/libdatadog?tag=v27.0.0#72e56a3dcf9189a92db1f177c4c9d844725079f7" +version = "2.0.1" dependencies = [ "anyhow", + "bytes", "cc", "const_format", "futures", @@ -2834,9 +2922,11 @@ dependencies = [ "hyper 1.6.0", "hyper-rustls", "hyper-util", + "indexmap 2.12.1", "libc 0.2.177", + "maplit", "mime 0.3.17", - "multipart", + "multer", "nix 0.29.0", "pin-project", "rand 0.8.5", @@ -2844,8 +2934,10 @@ dependencies = [ "reqwest", "rustls", "rustls-native-certs", + "rusty-fork", "serde", "static_assertions", + "tempfile", "thiserror 1.0.69", "tokio", "tokio-rustls", @@ -2865,7 +2957,7 @@ dependencies = [ "crossbeam-queue", "function_name", "hyper 1.6.0", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "serde", ] @@ -2874,7 +2966,6 @@ name = "libdd-crashtracker" version = "1.0.0" dependencies = [ "anyhow", - "backtrace", "blazesym", "cc", "chrono", @@ -2884,7 +2975,8 @@ dependencies = [ "goblin", "http", "libc 0.2.177", - "libdd-common 1.1.0", + "libdd-common 2.0.1", + "libdd-libunwind-sys", "libdd-telemetry", "nix 0.29.0", "num-derive", @@ -2913,7 +3005,7 @@ dependencies = [ "build_common", "function_name", "libc 0.2.177", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-common-ffi", "libdd-crashtracker", "serde", @@ -2926,7 +3018,7 @@ dependencies = [ [[package]] name = "libdd-data-pipeline" -version = "1.0.0" +version = "2.0.1" dependencies = [ "anyhow", "arc-swap", @@ -2937,9 +3029,7 @@ dependencies = [ "http", "http-body-util", "httpmock", - "hyper 1.6.0", - "hyper-util", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-ddsketch", "libdd-dogstatsd-client", "libdd-log", @@ -2963,7 +3053,7 @@ dependencies = [ [[package]] name = "libdd-ddsketch" -version = "1.0.0" +version = "1.0.1" dependencies = [ "prost", "prost-build", @@ -2972,12 +3062,12 @@ dependencies = [ [[package]] name = "libdd-dogstatsd-client" -version = "1.0.0" +version = "1.0.1" dependencies = [ "anyhow", "cadence", "http", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "serde", "tokio", "tracing", @@ -2985,15 +3075,19 @@ dependencies = [ [[package]] name = "libdd-library-config" -version = "1.0.0" +version = "1.1.0" dependencies = [ "anyhow", + "libdd-trace-protobuf", "memfd", + "prost", "rand 0.8.5", "rmp", "rmp-serde", + "rustix 1.1.3", "serde", "serde_yaml", + "serial_test", "tempfile", ] @@ -3004,12 +3098,21 @@ dependencies = [ "anyhow", "build_common", "constcat", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-common-ffi", "libdd-library-config", "tempfile", ] +[[package]] +name = "libdd-libunwind-sys" +version = "0.1.0" +dependencies = [ + "cc", + "libc 0.2.177", + "paste", +] + [[package]] name = "libdd-log" version = "1.0.0" @@ -3041,7 +3144,7 @@ dependencies = [ "httparse", "indexmap 2.12.1", "libdd-alloc", - "libdd-common 1.1.0 (git+https://github.com/DataDog/libdatadog?tag=v27.0.0)", + "libdd-common 1.1.0", "libdd-profiling-protobuf", "mime 0.3.17", "parking_lot", @@ -3051,7 +3154,7 @@ dependencies = [ "rustc-hash 1.1.0", "serde", "serde_json", - "target-triple", + "target-triple 0.1.4", "thiserror 2.0.12", "tokio", "tokio-util", @@ -3068,7 +3171,7 @@ dependencies = [ [[package]] name = "libdd-telemetry" -version = "2.0.0" +version = "3.0.0" dependencies = [ "anyhow", "base64 0.22.1", @@ -3076,10 +3179,8 @@ dependencies = [ "hashbrown 0.15.2", "http", "http-body-util", - "hyper 1.6.0", - "hyper-util", "libc 0.2.177", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-ddsketch", "serde", "serde_json", @@ -3099,7 +3200,7 @@ dependencies = [ "build_common", "function_name", "libc 0.2.177", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-common-ffi", "libdd-telemetry", "paste", @@ -3122,7 +3223,7 @@ dependencies = [ [[package]] name = "libdd-trace-normalization" -version = "1.0.0" +version = "1.0.2" dependencies = [ "anyhow", "arbitrary", @@ -3134,7 +3235,7 @@ dependencies = [ [[package]] name = "libdd-trace-protobuf" -version = "1.0.0" +version = "2.0.0" dependencies = [ "prost", "prost-build", @@ -3147,7 +3248,7 @@ dependencies = [ [[package]] name = "libdd-trace-stats" -version = "1.0.0" +version = "1.0.3" dependencies = [ "criterion", "hashbrown 0.15.2", @@ -3159,7 +3260,7 @@ dependencies = [ [[package]] name = "libdd-trace-utils" -version = "1.0.0" +version = "2.0.2" dependencies = [ "anyhow", "bolero", @@ -3170,11 +3271,12 @@ dependencies = [ "flate2", "futures", "http", + "http-body", "http-body-util", "httpmock", "hyper 1.6.0", "indexmap 2.12.1", - "libdd-common 1.1.0", + "libdd-common 2.0.1", "libdd-tinybytes", "libdd-trace-normalization", "libdd-trace-protobuf", @@ -3297,11 +3399,11 @@ checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -3424,6 +3526,15 @@ name = "miniz_oxide" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8402cab7aefae129c6977bb0ff1b8fd9a04eb5b51efc50a70bea51cda0c7924" +dependencies = [ + "adler2", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5faa9f23e86bd5768d76def086192ff5f869fb088da12a976ea21e9796b975f6" dependencies = [ "adler2", "simd-adler32", @@ -3456,6 +3567,23 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" +[[package]] +name = "moka" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85f8024e1c8e71c778968af91d43700ce1d11b219d127d79fb2934153b82b42b" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + [[package]] name = "msvc-demangler" version = "0.10.1" @@ -3588,12 +3716,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "overload", - "winapi 0.3.9", + "windows-sys 0.61.2", ] [[package]] @@ -3836,6 +3963,10 @@ name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +dependencies = [ + "critical-section", + "portable-atomic", +] [[package]] name = "oorandom" @@ -3919,12 +4050,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "page_size" version = "0.6.0" @@ -4307,7 +4432,7 @@ dependencies = [ "rand 0.8.5", "rand_chacha 0.3.1", "rand_xorshift 0.3.0", - "regex-syntax 0.8.5", + "regex-syntax", "unarray", ] @@ -4839,17 +4964,8 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -4860,15 +4976,9 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.8.5" @@ -4894,6 +5004,7 @@ dependencies = [ "bytes", "futures-core", "futures-util", + "hickory-resolver", "http", "http-body", "http-body-util", @@ -4903,6 +5014,7 @@ dependencies = [ "js-sys", "log 0.4.25", "mime_guess 2.0.5", + "once_cell", "percent-encoding 2.3.1", "pin-project-lite", "quinn", @@ -4921,6 +5033,12 @@ dependencies = [ "web-sys", ] +[[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + [[package]] name = "ring" version = "0.17.14" @@ -5111,6 +5229,18 @@ version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" +[[package]] +name = "rusty-fork" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ruzstd" version = "0.3.1" @@ -5143,6 +5273,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scc" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" +dependencies = [ + "sdd", +] + [[package]] name = "schannel" version = "0.1.27" @@ -5208,6 +5347,12 @@ dependencies = [ "syn 2.0.96", ] +[[package]] +name = "sdd" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" + [[package]] name = "security-framework" version = "3.5.1" @@ -5349,6 +5494,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_with" version = "3.12.0" @@ -5392,6 +5546,32 @@ dependencies = [ "unsafe-libyaml", ] +[[package]] +name = "serial_test" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "911bd979bf1070a3f3aa7b691a3b3e9968f339ceeec89e08c280a8a22207a32f" +dependencies = [ + "futures-executor", + "futures-util", + "log 0.4.25", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a7d91949b85b0d2fb687445e448b40d322b6b3e4af6b44a29b21d9a5f33e6d9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.96", +] + [[package]] name = "sha1" version = "0.10.6" @@ -5675,7 +5855,7 @@ version = "12.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98cf6a95abff97de4d7ff3473f33cacd38f1ddccad5c1feab435d6760300e3b6" dependencies = [ - "cpp_demangle", + "cpp_demangle 0.4.4", "msvc-demangler", "rustc-demangle", "symbolic-common", @@ -5742,6 +5922,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "target-lexicon" version = "0.13.4" @@ -5754,6 +5940,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ac9aa371f599d22256307c24a9d748c041e548cbf599f35d890f9d365361790" +[[package]] +name = "target-triple" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "591ef38edfb78ca4771ee32cf494cb8771944bee237a9b91fc9c1424ac4b777b" + [[package]] name = "tarpc" version = "0.31.0" @@ -6105,11 +6297,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "toml_edit 0.22.22", ] +[[package]] +name = "toml" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "399b1124a3c9e16766831c6bba21e50192572cdd98706ea114f9502509686ffc" +dependencies = [ + "indexmap 2.12.1", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 1.0.0+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", +] + [[package]] name = "toml_datetime" version = "0.6.8" @@ -6119,6 +6326,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "1.0.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.20.7" @@ -6126,7 +6342,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ "indexmap 2.12.1", - "toml_datetime", + "toml_datetime 0.6.8", "winnow 0.5.40", ] @@ -6138,11 +6354,26 @@ checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap 2.12.1", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.8", + "toml_datetime 0.6.8", "winnow 0.6.24", ] +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow 0.7.15", +] + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + [[package]] name = "tonic" version = "0.14.2" @@ -6234,9 +6465,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "log 0.4.25", "pin-project-lite", @@ -6258,9 +6489,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -6269,9 +6500,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", "valuable", @@ -6313,14 +6544,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "serde", "serde_json", "sharded-slab", @@ -6346,17 +6577,17 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "trybuild" -version = "1.0.102" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f14b5c02a137632f68194ec657ecb92304138948e8957c932127eb1b58c23be" +checksum = "47c635f0191bd3a2941013e5062667100969f8c4e9cd787c14f977265d73616e" dependencies = [ "glob", "serde", "serde_derive", "serde_json", - "target-triple", + "target-triple 1.0.0", "termcolor", - "toml", + "toml 1.0.6+spec-1.1.0", ] [[package]] @@ -6608,6 +6839,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc 0.2.177", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -6769,6 +7009,12 @@ dependencies = [ "rustix 0.38.43", ] +[[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + [[package]] name = "winapi" version = "0.2.8" @@ -7254,6 +7500,22 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "winver" version = "1.0.0" diff --git a/Makefile b/Makefile index a659308034d..988bbc87c37 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-ffe,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") +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-ffe,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-libunwind-sys,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 "*/libunwind*" -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 }' ) @@ -500,7 +500,9 @@ $(PACKAGES_BUILD_DIR)/datadog-setup.php: $(PACKAGES_BUILD_DIR) $(PACKAGES_BUILD_DIR) build_pecl_package: - echo $(subst $(BUILD_DIR)/,,$(C_FILES) $(RUST_FILES) $(TEST_FILES) $(TEST_STUB_FILES) $(M4_FILES) Cargo.lock) | tooling/bin/pecl-build + $(file >.pecl-files,$(subst $(BUILD_DIR)/,,$(C_FILES) $(RUST_FILES) $(TEST_FILES) $(TEST_STUB_FILES) $(M4_FILES) Cargo.lock)) + tooling/bin/pecl-build < .pecl-files + @rm -f .pecl-files 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/appsec/tests/integration/build.gradle b/appsec/tests/integration/build.gradle index 3235b4b1c27..9a49f060d3f 100644 --- a/appsec/tests/integration/build.gradle +++ b/appsec/tests/integration/build.gradle @@ -189,10 +189,10 @@ def buildRunInDockerTask = { Map options -> } if (options.get('needsBoostCache', true)) { if (project.hasProperty('localBoostCache')) { - binds[project.getProperty('localBoostCache')] = '/root/.boost' + binds[project.getProperty('localBoostCache')] = '/var/boost-cache' } else { volumes['php-appsec-boost-cache'] = [ - mountPoint: '/root/.boost', + mountPoint: '/var/boost-cache', task: createVolumeTask('php-appsec-boost-cache'), ] } @@ -390,7 +390,7 @@ def buildAppSecTask = { String version, String variant, altBaseTag = null -> -DDD_APPSEC_ENABLE_PATCHELF_LIBC=ON \\ -DGIT_COMMIT=${libddwafCommit()} \\ -DDD_APPSEC_TESTING=ON \\ - -DBOOST_CACHE_PREFIX=/root/.boost /project/appsec + -DBOOST_CACHE_PREFIX=/var/boost-cache /project/appsec make -j extension ddappsec-helper && \\ touch ddappsec.so libddappsec-helper.so """ diff --git a/appsec/tests/integration/gradle/tag_mappings.gradle b/appsec/tests/integration/gradle/tag_mappings.gradle index e66859f946b..af3f27ce03e 100644 --- a/appsec/tests/integration/gradle/tag_mappings.gradle +++ b/appsec/tests/integration/gradle/tag_mappings.gradle @@ -137,5 +137,5 @@ ext.tag_mappings = [ 'nginx-fpm-php-8.5-release-zts': 'sha256:527f2ba273685ff7e3f72a74076fd6d99cbc87d51fb3485fef4dc80a0cfddeee', 'nginx-fpm-php-8.5-release': 'sha256:fc2eea1ed06dfcf8102bdbfb2596f9a32bbe6493ca83d53370e1438289caa6aa', 'nginx-fpm-php-8.5-debug': 'sha256:915d0155897e4f42cf1867b93edbb928afcc1c5b3bd3eccdb2d56ac50510cd82', - 'nginx-fpm-php-8.5-release-musl': 'sha256:73857002765b217e1076adc04f9ebc88505b0fa77fc48e2ad3005594b2f39bc9', + 'nginx-fpm-php-8.5-release-musl': 'sha256:a1ef09c1bf398049b340ab2a1c40839d828420df5a404831bb7b33a09d433755', ] diff --git a/appsec/tests/integration/src/docker/nginx-fpm-musl/Dockerfile b/appsec/tests/integration/src/docker/nginx-fpm-musl/Dockerfile index 572184d33df..b43281b06fb 100644 --- a/appsec/tests/integration/src/docker/nginx-fpm-musl/Dockerfile +++ b/appsec/tests/integration/src/docker/nginx-fpm-musl/Dockerfile @@ -3,9 +3,9 @@ FROM php:8.5-fpm-alpine # doubles as php/toolchain image for musl RUN apk add --no-cache \ - autoconf bash bison clang clang-dev cmake curl curl-dev \ + autoconf automake bash bison clang clang-dev cmake curl curl-dev \ g++ gcc gdb git libc-dev linux-headers llvm-libunwind-static make \ - musl-dev nginx oniguruma-dev openssl-dev patchelf pkgconf re2c \ + musl-dev nginx oniguruma-dev openssl-dev patchelf pkgconf re2c libtool \ libxml2-dev libzip-dev xz-static zlib-dev \ vim diff --git a/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/mock_agent/rem_cfg/RemoteConfigRequest.java b/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/mock_agent/rem_cfg/RemoteConfigRequest.java index 2481f2517a1..20844b1e7c1 100644 --- a/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/mock_agent/rem_cfg/RemoteConfigRequest.java +++ b/appsec/tests/integration/src/main/groovy/com/datadog/appsec/php/mock_agent/rem_cfg/RemoteConfigRequest.java @@ -218,6 +218,12 @@ public static class TracerInfo { @JsonProperty("app_version") public String serviceVersion; + @JsonProperty("process_tags") + public List processTags; + + @JsonProperty("container_tags") + public List containerTags; + @Override public String toString() { return new StringJoiner(", ", TracerInfo.class.getSimpleName() + "[", "]") @@ -229,6 +235,8 @@ public String toString() { .add("extraServices=" + extraServices) .add("serviceEnv='" + serviceEnv + "'") .add("serviceVersion='" + serviceVersion + "'") + .add("processTags=" + processTags) + .add("container_tags=" + containerTags) .toString(); } } diff --git a/cbindgen.toml b/cbindgen.toml index 15cf3ee378c..8e0dec9a265 100644 --- a/cbindgen.toml +++ b/cbindgen.toml @@ -23,6 +23,7 @@ rename_types = "PascalCase" "PushTagResult" = "ddog_Vec_Tag_PushResult" "ZendString" = "_zend_string" "FILE" = "FILE" +"EndpointConfig" = "ddog_crasht_EndpointConfig" [enum] prefix_with_name = true diff --git a/components-rs/common.h b/components-rs/common.h index e53c4ef311d..1a626de0afe 100644 --- a/components-rs/common.h +++ b/components-rs/common.h @@ -39,6 +39,12 @@ # define DDOG_CHECK_RETURN #endif +#ifdef _WIN32 +#define LIBDD_DLLIMPORT __declspec(dllimport) +#else +#define LIBDD_DLLIMPORT +#endif + /** * Default value for the timeout field in milliseconds. */ @@ -1231,9 +1237,6 @@ typedef enum ddog_crasht_SignalNames { * variable to allow downgrading the collector. */ typedef enum ddog_crasht_StacktraceCollection { - /** - * Stacktrace collection occurs in the - */ DDOG_CRASHT_STACKTRACE_COLLECTION_DISABLED, DDOG_CRASHT_STACKTRACE_COLLECTION_WITHOUT_SYMBOLS, /** @@ -1286,6 +1289,14 @@ typedef struct ddog_crasht_Slice_CharSlice { uintptr_t len; } ddog_crasht_Slice_CharSlice; +typedef struct ddog_crasht_EndpointConfig { + ddog_CharSlice url; + ddog_CharSlice api_key; + ddog_CharSlice test_token; + uint64_t timeout; + bool use_system_resolver; +} ddog_crasht_EndpointConfig; + typedef struct ddog_crasht_Slice_I32 { /** * Should be non-null and suitably aligned for the underlying type. It is @@ -1308,7 +1319,7 @@ typedef struct ddog_crasht_Config { * The endpoint to send the crash report to (can be a file://). * If None, the crashtracker will infer the agent host from env variables. */ - const struct ddog_Endpoint *endpoint; + struct ddog_crasht_EndpointConfig endpoint; /** * Optional filename for a unix domain socket if the receiver is used asynchonously */ @@ -1388,6 +1399,14 @@ typedef struct ddog_crasht_Slice_CInt { uintptr_t len; } ddog_crasht_Slice_CInt; +/** + * Represents an object that should only be referred to by its handle. + * Do not access its member for any reason, only use the C API functions on this struct. + */ +typedef struct ddog_crasht_Handle_StackTrace { + struct ddog_crasht_StackTrace *inner; +} ddog_crasht_Handle_StackTrace; + /** * A generic result type for when an operation may fail, * or may return in case of success. @@ -1493,14 +1512,6 @@ typedef struct ddog_crasht_Span { ddog_CharSlice thread_name; } ddog_crasht_Span; -/** - * Represents an object that should only be referred to by its handle. - * Do not access its member for any reason, only use the C API functions on this struct. - */ -typedef struct ddog_crasht_Handle_StackTrace { - struct ddog_crasht_StackTrace *inner; -} ddog_crasht_Handle_StackTrace; - typedef struct ddog_crasht_ThreadData { bool crashed; ddog_CharSlice name; @@ -1875,6 +1886,13 @@ void ddog_endpoint_set_timeout(struct ddog_Endpoint *endpoint, uint64_t millis); void ddog_endpoint_set_test_token(struct ddog_Endpoint *endpoint, ddog_CharSlice token); +/** + * Set whether to use the system DNS resolver when building the reqwest client. + * If false, the default in-process resolver is used. + */ +void ddog_endpoint_set_use_system_resolver(struct ddog_Endpoint *endpoint, + bool use_system_resolver); + void ddog_endpoint_drop(struct ddog_Endpoint*); struct ddog_Option_U32 ddog_Option_U32_some(uint32_t v); diff --git a/components-rs/crashtracker.h b/components-rs/crashtracker.h index 69f1e565029..65ab3af974b 100644 --- a/components-rs/crashtracker.h +++ b/components-rs/crashtracker.h @@ -131,6 +131,45 @@ struct ddog_VoidResult ddog_crasht_init_without_receiver(struct ddog_crasht_Conf */ struct ddog_crasht_Slice_CInt ddog_crasht_default_signals(void); +/** + * Report an unhandled exception as a crash event. + * + * This function sends a crash report for an unhandled exception detected + * by the runtime. It is intended to be called when the process is in a + * terminal state due to an unhandled exception. + * + * # Parameters + * - `error_type`: Optional type/class of the exception (e.g. "NullPointerException"). Pass empty + * CharSlice for unknown. + * - `error_message`: Optional error message. Pass empty CharSlice for no message. + * - `runtime_stack`: Stack trace from the runtime. Consumed by this call. + * + * If the crash-tracker has not been initialized, this function is a no-op. + * + * # Side effects + * This function disables the signal-based crash handler before performing + * any work. This means that if the process receives a fatal signal (SIGSEGV) + * during or after this call, the crashtracker will not produce a + * second crash report. The previous signal handler (if any) will still be + * chained. + * + * # Failure mode + * If a fatal signal occurs while this function is in progress, the calling + * process is in an unrecoverable state; the crashtracker cannot report the + * secondary fault and the caller's own signal handler (if any) will execute + * in a potentially corrupted context. Callers should treat this function as a + * terminal operation and exit shortly after it returns. + * + * # Safety + * Crash-tracking functions are not reentrant. + * No other crash-handler functions should be called concurrently. + * The `runtime_stack` handle must be valid and will be consumed. + */ +DDOG_CHECK_RETURN +struct ddog_VoidResult ddog_crasht_report_unhandled_exception(ddog_CharSlice error_type, + ddog_CharSlice error_message, + struct ddog_crasht_Handle_StackTrace *runtime_stack); + /** * Removes all existing additional tags * Expected to be used after a fork, to reset the additional tags on the child @@ -661,7 +700,12 @@ struct ddog_VoidResult ddog_crasht_CrashInfoBuilder_with_thread_name(struct ddog * The `builder` can be null, but if non-null it must point to a Builder made by this module, * which has not previously been dropped. * All arguments must be valid. - * This method requires that the builder has a UUID and metadata set + * This method requires that the builder has `metadata` and `kind` set + * Applications can add `message` or `sig_info` to the builder to provide additional context. + * If set, the data will be used to derive the crash ping message in the order of + * - an explicit message set with `with_message` + * - sig_info set with `with_sig_info` + * - kind set with `with_kind` */ DDOG_CHECK_RETURN struct ddog_VoidResult ddog_crasht_CrashInfoBuilder_upload_ping_to_endpoint(struct ddog_crasht_Handle_CrashInfoBuilder *builder, diff --git a/components-rs/ddtrace.h b/components-rs/ddtrace.h index c0bab2a9eab..0644a3fae84 100644 --- a/components-rs/ddtrace.h +++ b/components-rs/ddtrace.h @@ -39,6 +39,10 @@ void ddtrace_drop_rust_string(char *input, uintptr_t len); struct ddog_Endpoint *ddtrace_parse_agent_url(ddog_CharSlice url); +void ddtrace_endpoint_as_crashtracker_config(const struct ddog_Endpoint *endpoint, + void (*callback)(ddog_crasht_EndpointConfig, void*), + void *userdata); + ddog_Configurator *ddog_library_configurator_new_dummy(bool debug_logs, ddog_CharSlice language); int posix_spawn_file_actions_addchdir_np(void *file_actions, const char *path); @@ -80,7 +84,8 @@ bool ddog_remote_configs_service_env_change(struct ddog_RemoteConfigState *remot ddog_CharSlice service, ddog_CharSlice env, ddog_CharSlice version, - const struct ddog_Vec_Tag *tags); + const struct ddog_Vec_Tag *tags, + const struct ddog_Vec_Tag *process_tags); bool ddog_remote_config_alter_dynamic_config(struct ddog_RemoteConfigState *remote_config, ddog_CharSlice config, diff --git a/components-rs/lib.rs b/components-rs/lib.rs index 07ff0cb0223..d331ca1df1a 100644 --- a/components-rs/lib.rs +++ b/components-rs/lib.rs @@ -101,6 +101,28 @@ pub unsafe extern "C" fn ddtrace_parse_agent_url( }) } +#[no_mangle] +#[cfg(unix)] +pub unsafe extern "C" fn ddtrace_endpoint_as_crashtracker_config( + 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, + ); + } +} + // Hack: Without this, the PECL build of the tracer does not contain the ddog_library_* functions // It works well without in the "normal" build #[no_mangle] diff --git a/components-rs/library-config.h b/components-rs/library-config.h index 4bbc3d17f4a..c29b0cf3e55 100644 --- a/components-rs/library-config.h +++ b/components-rs/library-config.h @@ -91,6 +91,8 @@ void ddog_tracer_metadata_set(struct ddog_TracerMetadata *ptr, /** * Serializes the `TracerMetadata` into a platform-specific memory handle (e.g., memfd on Linux). + * This function also attempts to publish the tracer metadata as an OTel process context + * separately, but will ignore resulting errors. * * # Safety * - `ptr` must be a valid, non-null pointer to a `TracerMetadata`. diff --git a/components-rs/remote_config.rs b/components-rs/remote_config.rs index 75e97b019d2..f72779abe9c 100644 --- a/components-rs/remote_config.rs +++ b/components-rs/remote_config.rs @@ -494,12 +494,14 @@ pub extern "C" fn ddog_remote_configs_service_env_change( env: CharSlice, version: CharSlice, 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(), }; if let Some(target) = remote_config.manager.get_target() { diff --git a/components-rs/sidecar.h b/components-rs/sidecar.h index 2d694f91507..76426c3a2bd 100644 --- a/components-rs/sidecar.h +++ b/components-rs/sidecar.h @@ -201,14 +201,14 @@ ddog_MaybeError ddog_sidecar_session_set_config(struct ddog_SidecarTransport **t uintptr_t remote_config_capabilities_count, bool remote_config_enabled, bool is_fork, - ddog_CharSlice process_tags); + const struct ddog_Vec_Tag *process_tags); /** * Updates the process_tags for an existing session. */ ddog_MaybeError ddog_sidecar_session_set_process_tags(struct ddog_SidecarTransport **transport, ddog_CharSlice session_id, - ddog_CharSlice process_tags); + const struct ddog_Vec_Tag *process_tags); /** * Enqueues a telemetry log action to be processed internally. diff --git a/components-rs/sidecar.rs b/components-rs/sidecar.rs index 0b94deeeab9..82d8ed19f0a 100644 --- a/components-rs/sidecar.rs +++ b/components-rs/sidecar.rs @@ -4,8 +4,6 @@ use std::ops::DerefMut; use std::os::unix::ffi::OsStrExt; use lazy_static::{lazy_static, LazyStatic}; use tracing::warn; -#[cfg(windows)] -use std::os::windows::ffi::OsStrExt; use std::sync::Mutex; use std::time::Duration; use datadog_sidecar::config::{self, AppSecConfig, LogMethod}; diff --git a/components-rs/telemetry.rs b/components-rs/telemetry.rs index c39daa3dcaf..1155f3bcb33 100644 --- a/components-rs/telemetry.rs +++ b/components-rs/telemetry.rs @@ -5,7 +5,7 @@ use hashbrown::{Equivalent, HashMap}; use std::collections::HashSet; use std::ffi::CString; use std::path::PathBuf; -use std::time::{Duration, Instant, SystemTime}; +use std::time::{Duration, SystemTime}; use datadog_ipc::platform::NamedShmHandle; use datadog_sidecar::one_way_shared_memory::{open_named_shm, OneWayShmReader}; diff --git a/ext/process_tags.c b/ext/process_tags.c index 9c6a06a7ecc..76d0b51cba3 100644 --- a/ext/process_tags.c +++ b/ext/process_tags.c @@ -32,6 +32,7 @@ typedef struct { size_t count; size_t capacity; zend_string *serialized; + ddog_Vec_Tag vec; } process_tags_t; static process_tags_t process_tags = {0}; @@ -190,12 +191,35 @@ static void serialize_process_tags(void) { } smart_str_free(&buf); + + process_tags.vec = ddog_Vec_Tag_new(); + for (size_t i = 0; i < process_tags.count; i++) { + const char* key = process_tags.tag_list[i].key; + const char* value = process_tags.tag_list[i].value; + + UNUSED(ddog_Vec_Tag_push(&process_tags.vec, + (ddog_CharSlice) {.ptr = key, .len = strlen(key)}, + (ddog_CharSlice) {.ptr = value, .len = strlen(value)} + )); + } } zend_string *ddtrace_process_tags_get_serialized(void) { return (ddtrace_process_tags_enabled() && process_tags.serialized) ? process_tags.serialized : ZSTR_EMPTY_ALLOC(); } +const ddog_Vec_Tag *ddtrace_process_tags_get_vec(void) { + if (ddtrace_process_tags_enabled() && process_tags.vec.ptr) { + return &process_tags.vec; + } + + static ddog_Vec_Tag empty_vec; + if (!empty_vec.ptr) { + empty_vec = ddog_Vec_Tag_new(); + } + return &empty_vec; +} + bool ddtrace_process_tags_enabled(void){ return get_global_DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED(); } @@ -224,5 +248,10 @@ void ddtrace_process_tags_mshutdown(void) { if (process_tags.serialized) { zend_string_release(process_tags.serialized); } + + if (process_tags.vec.ptr) { + ddog_Vec_Tag_drop(process_tags.vec); + } + memset(&process_tags, 0, sizeof(process_tags)); } diff --git a/ext/process_tags.h b/ext/process_tags.h index 65377e113de..d2052675011 100644 --- a/ext/process_tags.h +++ b/ext/process_tags.h @@ -4,6 +4,8 @@ #include #include "Zend/zend_types.h" #include "ddtrace_export.h" +#include "components-rs/common.h" + // Called at first RINIT to collect process tags void ddtrace_process_tags_first_rinit(void); @@ -18,4 +20,8 @@ bool ddtrace_process_tags_enabled(void); // Returns NULL if disabled or not yet collected DDTRACE_PUBLIC zend_string *ddtrace_process_tags_get_serialized(void); +// Get a pointer to the process tags Vec +// Returns a pointer to an empty Vec if disabled or not yet collected +const ddog_Vec_Tag *ddtrace_process_tags_get_vec(void); + #endif // DD_PROCESS_TAGS_H diff --git a/ext/sidecar.c b/ext/sidecar.c index 73b653fd7cb..dc902ad0090 100644 --- a/ext/sidecar.c +++ b/ext/sidecar.c @@ -92,6 +92,7 @@ DDTRACE_PUBLIC uint64_t ddtrace_get_sidecar_queue_id(void) { static void dd_sidecar_post_connect(ddog_SidecarTransport **transport, bool is_fork, const char *logpath) { ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)}; + const ddog_Vec_Tag *process_tags = ddtrace_process_tags_get_vec(); ddog_sidecar_session_set_config(transport, session_id, ddtrace_endpoint, dogstatsd_endpoint, DDOG_CHARSLICE_C("php"), php_version_rt, @@ -111,7 +112,7 @@ static void dd_sidecar_post_connect(ddog_SidecarTransport **transport, bool is_f DDTRACE_REMOTE_CONFIG_CAPABILITIES.len, get_global_DD_REMOTE_CONFIG_ENABLED(), is_fork, - dd_zend_string_to_CharSlice(ddtrace_process_tags_get_serialized()) + process_tags ); if (get_global_DD_INSTRUMENTATION_TELEMETRY_ENABLED()) { @@ -124,13 +125,12 @@ void ddtrace_sidecar_update_process_tags(void) { return; } - zend_string *process_tags = ddtrace_process_tags_get_serialized(); - if (!process_tags || ZSTR_LEN(process_tags) == 0) { + const ddog_Vec_Tag *process_tags = ddtrace_process_tags_get_vec(); + if (!process_tags || process_tags->len == 0) { return; } - ddog_CharSlice session_id = (ddog_CharSlice) {.ptr = (char *) dd_sidecar_formatted_session_id, .len = sizeof(dd_sidecar_formatted_session_id)}; - ddog_sidecar_session_set_process_tags(&ddtrace_sidecar, session_id, dd_zend_string_to_CharSlice(process_tags)); + ddog_sidecar_session_set_process_tags(&ddtrace_sidecar, session_id, process_tags); } static void dd_sidecar_on_reconnect(ddog_SidecarTransport *transport) { @@ -528,9 +528,11 @@ void ddtrace_sidecar_submit_root_span_data_direct(ddog_SidecarTransport **transp } ddog_CharSlice version_slice = dd_zend_string_to_CharSlice(version_string); + const ddog_Vec_Tag *process_tags = ddtrace_process_tags_get_vec(); + bool changed = true; if (DDTRACE_G(remote_config_state)) { - changed = ddog_remote_configs_service_env_change(DDTRACE_G(remote_config_state), service_slice, env_slice, version_slice, &DDTRACE_G(active_global_tags)); + changed = ddog_remote_configs_service_env_change(DDTRACE_G(remote_config_state), service_slice, env_slice, version_slice, &DDTRACE_G(active_global_tags), process_tags); if (!changed && root) { // ddog_remote_configs_service_env_change() generally only processes configs if they changed. However, upon request initialization it may be identical to the previous request. // However, at request shutdown some configs are unloaded. Explicitly forcing a processing step ensures these are re-loaded. diff --git a/ext/signals.c b/ext/signals.c index 096bf28b20b..d75f3d4902b 100644 --- a/ext/signals.c +++ b/ext/signals.c @@ -242,6 +242,20 @@ 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) { @@ -256,35 +270,27 @@ static void dd_init_crashtracker() { free((void *) socket_path.ptr); socket_path.ptr = crashtracker_socket_path; - ddog_Endpoint *agent_endpoint = ddtrace_sidecar_agent_endpoint(); - if (!agent_endpoint) { + if (!ddtrace_endpoint) { return; } - ddog_crasht_Config config = { - .endpoint = agent_endpoint, - .timeout_ms = 5000, - .resolve_frames = DDOG_CRASHT_STACKTRACE_COLLECTION_ENABLED_WITH_INPROCESS_SYMBOLS, - .optional_unix_socket_filename = socket_path, - .additional_files = {0}, - }; - ddog_Vec_Tag tags = ddog_Vec_Tag_new(); dd_crasht_add_opcache_inis(&tags); - const ddog_crasht_Metadata metadata = ddtrace_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}, + }, + .metadata = ddtrace_setup_crashtracking_metadata(&tags), + }; - dd_crashtracker_check_result( - ddog_crasht_init_without_receiver( - config, - metadata - ), - "Cannot initialize CrashTracker" - ); + ddtrace_endpoint_as_crashtracker_config(ddtrace_endpoint, dd_crasht_do_init, &args); ddtrace_register_crashtracking_frames_collection(); - ddog_endpoint_drop(agent_endpoint); ddog_Vec_Tag_drop(tags); } diff --git a/libdatadog b/libdatadog index a0cef26b024..7b8a805a570 160000 --- a/libdatadog +++ b/libdatadog @@ -1 +1 @@ -Subproject commit a0cef26b0240f19dd994d471d5679e8c426adfc8 +Subproject commit 7b8a805a5706592390a0b8d012e3777bcb33aa27 diff --git a/tests/ext/crashtracker_segfault.phpt b/tests/ext/crashtracker_segfault.phpt index 8101393693c..3388f138fcb 100644 --- a/tests/ext/crashtracker_segfault.phpt +++ b/tests/ext/crashtracker_segfault.phpt @@ -51,7 +51,7 @@ $rr->waitForRequest(function ($request) { if (!isset($payload["message"]["metadata"])) { break; } - if (($payload["message"]["kind"] ?? "") == "Crash ping") { + if (($payload["is_crash"] ?? false) !== true) { continue; } diff --git a/tests/ext/includes/request_replayer.inc b/tests/ext/includes/request_replayer.inc index 0e0d8113362..a8fc12f2414 100644 --- a/tests/ext/includes/request_replayer.inc +++ b/tests/ext/includes/request_replayer.inc @@ -72,6 +72,26 @@ class RequestReplayer } while (true); } + public function waitForRcRequest($matcher) + { + $i = 0; + do { + if ($i++ == $this->maxIteration) { + throw new Exception("wait for replay timeout"); + } + usleep($this->flushInterval); + + $requests = $this->replayAllRcRequests(); + if (is_array($requests)) { + foreach ($requests as $request) { + if ($matcher($request)) { + return $request; + } + } + } + } while (true); + } + public function waitForDataAndReplay($ignoreTelemetry = true) { $i = 0; @@ -104,6 +124,15 @@ class RequestReplayer ])), true); } + public function replayAllRcRequests() + { + return json_decode(file_get_contents($this->endpoint . '/replay-rc-requests', false, stream_context_create([ + "http" => [ + "header" => "X-Datadog-Test-Session-Token: " . ini_get("datadog.trace.agent_test_session_token"), + ], + ])), true); + } + public function clearDumpedData() { file_get_contents($this->endpoint . '/clear-dumped-data', false, stream_context_create([ diff --git a/tests/ext/live-debugger/debugger_log_probe.phpt b/tests/ext/live-debugger/debugger_log_probe.phpt index 7edb7199ba9..87ce0d046a4 100644 --- a/tests/ext/live-debugger/debugger_log_probe.phpt +++ b/tests/ext/live-debugger/debugger_log_probe.phpt @@ -226,7 +226,7 @@ array(6) { ["fileName"]=> string(%d) "%sdebugger_log_probe.php" ["function"]=> - string(8) "foo::Bar" + string(8) "Bar::foo" ["lineNumber"]=> int(11) } diff --git a/tests/ext/live-debugger/debugger_span_decoration_probe.phpt b/tests/ext/live-debugger/debugger_span_decoration_probe.phpt index 9716393f6d7..e325910d42d 100644 --- a/tests/ext/live-debugger/debugger_span_decoration_probe.phpt +++ b/tests/ext/live-debugger/debugger_span_decoration_probe.phpt @@ -98,7 +98,7 @@ array(2) { ["_dd.di.ret.probe_id"]=> string(1) "3" } -string(%d) "/debugger/v1/input?ddtags=debugger_version:1.%s,env:none,version:,runtime_id:%s-%s-%s-%s-%s,host_name:%s" +string(%d) "/debugger/v1/diagnostics?ddtags=debugger_version:1.%s,env:none,version:,runtime_id:%s-%s-%s-%s-%s,host_name:%s" array(1) { [0]=> array(6) { diff --git a/tests/ext/remote_config/rc_process_tags.phpt b/tests/ext/remote_config/rc_process_tags.phpt new file mode 100644 index 00000000000..e4c16f93753 --- /dev/null +++ b/tests/ext/remote_config/rc_process_tags.phpt @@ -0,0 +1,68 @@ +--TEST-- +Test remote config request payload +--SKIPIF-- + +--ENV-- +DD_AGENT_HOST=request-replayer +DD_TRACE_AGENT_PORT=80 +DD_TRACE_GENERATE_ROOT_SPAN=0 +DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS=0.01 +DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED=1 +--INI-- +datadog.trace.agent_test_session_token=remote-config/check_payload +--FILE-- + true, +]); + +try { + $request = $rr->waitForRcRequest(function($req) { + if (strpos($req["uri"], '/v0.7/config') === false) { + return false; + } + + $body = json_decode($req["body"], true); + return isset($body["client"]["client_tracer"]["process_tags"]) + && !empty($body["client"]["client_tracer"]["process_tags"]); + }); + $body = json_decode($request["body"], true); +} catch (Exception $e) { + echo "ERROR: No RC request found\n"; + exit(1); +} + +if (!isset($body["client"]["client_tracer"]["process_tags"])) { + echo "ERROR: Missing 'process_tags' field\n"; + exit(1); +} + +$process_tags = $body["client"]["client_tracer"]["process_tags"]; +foreach ($process_tags as $tag) { + echo $tag . PHP_EOL; +} + +del_rc_file($path); + +?> +--CLEAN-- + +--EXPECTF-- +entrypoint.basedir:remote_config +entrypoint.name:rc_process_tags +entrypoint.type:script +entrypoint.workdir:%s +runtime.sapi:cli diff --git a/tests/ext/telemetry/process_tags.phpt b/tests/ext/telemetry/telemetry_process_tags.phpt similarity index 90% rename from tests/ext/telemetry/process_tags.phpt rename to tests/ext/telemetry/telemetry_process_tags.phpt index eaf742e04b4..306a8204b08 100644 --- a/tests/ext/telemetry/process_tags.phpt +++ b/tests/ext/telemetry/telemetry_process_tags.phpt @@ -43,7 +43,7 @@ for ($i = 0; $i < 300; ++$i) { ?> --EXPECTF-- Included -string(%d) "entrypoint.basedir:telemetry,entrypoint.name:process_tags,entrypoint.type:script,entrypoint.workdir:%s,runtime.sapi:cli" +string(%d) "entrypoint.basedir:telemetry,entrypoint.name:telemetry_process_tags,entrypoint.type:script,entrypoint.workdir:%s,runtime.sapi:cli" --CLEAN--