diff --git a/Cargo.lock b/Cargo.lock index 9741ae22..593c9d90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -281,9 +281,9 @@ dependencies = [ [[package]] name = "convert_case" -version = "0.6.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" dependencies = [ "unicode-segmentation", ] @@ -370,13 +370,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.2.9" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" -dependencies = [ - "quote", - "syn 2.0.119", -] +checksum = "914a755b7c2d4af2bdcff7ce1739e2db9a1b81a9b07123d8015786ae03c0980d" [[package]] name = "darling" @@ -1686,9 +1682,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.9" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60" dependencies = [ "cfg-if", "windows-link 0.2.1", @@ -1814,26 +1810,34 @@ dependencies = [ [[package]] name = "napi" -version = "2.16.17" +version = "3.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55740c4ae1d8696773c78fdafd5d0e5fe9bc9f1b071c7ba493ba5c413a9184f3" +checksum = "58c5f4d5375213fdb7be2655e152386e82f026f9a5ba36a75556e11359aafe09" dependencies = [ "bitflags 2.13.1", "ctor", - "napi-derive", + "futures", + "libc", + "napi-build", "napi-sys", - "once_cell", + "nohash-hasher", + "rustc-hash", "serde", "serde_json", ] +[[package]] +name = "napi-build" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60fdf9b392c50e7c4170fa633bd909490ed7835cea4c046776d1a4dd8d2ae0ab" + [[package]] name = "napi-derive" -version = "2.16.13" +version = "3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cbe2585d8ac223f7d34f13701434b9d5f4eb9c332cccce8dee57ea18ab8ab0c" +checksum = "0fa55ea69990c90b888e9e77044410e304ce7f35de599dc6d0b5c1923d2e59af" dependencies = [ - "cfg-if", "convert_case", "napi-derive-backend", "proc-macro2", @@ -1843,12 +1847,11 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "1.0.75" +version = "6.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1639aaa9eeb76e91c6ae66da8ce3e89e921cd3885e99ec85f4abacae72fc91bf" +checksum = "df4056ac7c18e4438ccf0edaed4340ca0d269278c8ec19284f7b23cb039fd0ae" dependencies = [ "convert_case", - "once_cell", "proc-macro2", "quote", "syn 2.0.119", @@ -1856,9 +1859,9 @@ dependencies = [ [[package]] name = "napi-sys" -version = "2.4.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427802e8ec3a734331fec1035594a210ce1ff4dc5bc1950530920ab717964ea3" +checksum = "85fbf1fa9f1babfe396d74bbbf52b3643770243e8f5b0b46715d4caf7f0dfc9a" dependencies = [ "libloading", ] @@ -1888,6 +1891,12 @@ dependencies = [ "libc", ] +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "nu-ansi-term" version = "0.50.3" diff --git a/crates/crashtracker/Cargo.toml b/crates/crashtracker/Cargo.toml index 25c6a709..1044035c 100644 --- a/crates/crashtracker/Cargo.toml +++ b/crates/crashtracker/Cargo.toml @@ -15,7 +15,7 @@ path = "src/bin/receiver.rs" [dependencies] anyhow = "1" libdd-crashtracker = { git = "https://github.com/DataDog/libdatadog.git", tag = "v43.0.0" } -napi = { version = "2", features = ["serde-json"] } -napi-derive = { version = "2", default-features = false } +napi = { version = "3", features = ["serde-json"] } +napi-derive = { version = "3", default-features = false } rustls = { version = "*", default-features = false, features = ["aws-lc-rs"] } serde_json = "1" diff --git a/crates/crashtracker/src/lib.rs b/crates/crashtracker/src/lib.rs index eb906969..b39dcbae 100644 --- a/crates/crashtracker/src/lib.rs +++ b/crates/crashtracker/src/lib.rs @@ -1,4 +1,4 @@ -use napi::{Env, JsUnknown}; +use napi::{Env, Unknown}; use napi_derive::napi; mod unhandled_exception; @@ -22,9 +22,9 @@ fn apply_default_signals( #[napi] pub fn init( env: Env, - config: JsUnknown, - receiver_config: JsUnknown, - metadata: JsUnknown, + config: Unknown, + receiver_config: Unknown, + metadata: Unknown, ) -> napi::Result<()> { let config: libdd_crashtracker::CrashtrackerConfiguration = env.from_js_value(config)?; let receiver_config = env.from_js_value(receiver_config)?; @@ -38,7 +38,7 @@ pub fn init( } #[napi] -pub fn update_config(env: Env, config: JsUnknown) -> napi::Result<()> { +pub fn update_config(env: Env, config: Unknown) -> napi::Result<()> { let config: libdd_crashtracker::CrashtrackerConfiguration = env.from_js_value(config)?; let config = apply_default_signals(config); @@ -49,7 +49,7 @@ pub fn update_config(env: Env, config: JsUnknown) -> napi::Result<()> { } #[napi] -pub fn update_metadata(env: Env, metadata: JsUnknown) -> napi::Result<()> { +pub fn update_metadata(env: Env, metadata: Unknown) -> napi::Result<()> { let metadata = env.from_js_value(metadata)?; libdd_crashtracker::update_metadata(metadata).unwrap(); diff --git a/crates/crashtracker/src/unhandled_exception.rs b/crates/crashtracker/src/unhandled_exception.rs index 64dd8fcb..461ed84b 100644 --- a/crates/crashtracker/src/unhandled_exception.rs +++ b/crates/crashtracker/src/unhandled_exception.rs @@ -1,8 +1,9 @@ -use napi::{Env, JsFunction, JsObject, JsUnknown}; +use napi::bindgen_prelude::{Function, JsObjectValue, Object}; +use napi::{Env, JsValue, Unknown}; use napi_derive::napi; -fn get_optional_string_property(obj: &JsObject, key: &str) -> napi::Result> { - match obj.get_named_property::(key) { +fn get_optional_string_property(obj: &Object, key: &str) -> napi::Result> { + match obj.get_named_property::(key) { Ok(val) => { use napi::ValueType; if val.get_type()? == ValueType::String { @@ -80,21 +81,21 @@ fn parse_location(location: &str, frame: &mut libdd_crashtracker::StackFrame) { } } -fn is_error_instance(env: &Env, value: &JsUnknown) -> napi::Result { +fn is_error_instance(env: &Env, value: &Unknown) -> napi::Result { let global = env.get_global()?; - let error_ctor: JsFunction = global.get_named_property("Error")?; + let error_ctor: Function<'_, (), Unknown<'_>> = global.get_named_property("Error")?; value.instanceof(error_ctor) } -fn stringify_js_value(value: JsUnknown) -> napi::Result { +fn stringify_js_value(value: Unknown) -> napi::Result { let s = value.coerce_to_string()?.into_utf8()?; Ok(s.as_str()?.to_owned()) } -fn report_unhandled(env: &Env, error: JsUnknown, fallback_type: &str) -> napi::Result<()> { +fn report_unhandled(env: &Env, error: Unknown, fallback_type: &str) -> napi::Result<()> { let is_error = is_error_instance(env, &error)?; let (exception_type, exception_message, stacktrace) = if is_error { - let error_obj: JsObject = error.coerce_to_object()?; + let error_obj: Object = error.coerce_to_object()?; let name = get_optional_string_property(&error_obj, "name")?; let message = get_optional_string_property(&error_obj, "message")?; let stack_string = get_optional_string_property(&error_obj, "stack")?; @@ -128,7 +129,7 @@ fn report_unhandled(env: &Env, error: JsUnknown, fallback_type: &str) -> napi::R #[napi] pub fn report_uncaught_exception_monitor( env: Env, - error: JsUnknown, + error: Unknown, origin: String, ) -> napi::Result<()> { report_unhandled(&env, error, &origin) diff --git a/crates/process_discovery/Cargo.toml b/crates/process_discovery/Cargo.toml index d46b257b..5501ef0b 100644 --- a/crates/process_discovery/Cargo.toml +++ b/crates/process_discovery/Cargo.toml @@ -11,5 +11,5 @@ anyhow = "1" libdd-library-config = { git = "https://github.com/DataDog/libdatadog.git", tag = "v43.0.0", features = ["otel-thread-ctx"] } libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog.git", tag = "v43.0.0" } -napi = { version = "2" } -napi-derive = { version = "2", default-features = false } +napi = { version = "3" } +napi-derive = { version = "3", default-features = false } diff --git a/crates/process_discovery/src/lib.rs b/crates/process_discovery/src/lib.rs index 6e042e8f..707f683a 100644 --- a/crates/process_discovery/src/lib.rs +++ b/crates/process_discovery/src/lib.rs @@ -50,7 +50,7 @@ pub struct ThreadLocalMetadata { pub extra_attributes: Vec, } -#[napi(constructor)] +#[napi] pub struct TracerMetadata { pub runtime_id: Option, pub tracer_version: String, @@ -63,9 +63,48 @@ pub struct TracerMetadata { /// Optional thread-level context metadata; see [`ThreadLocalMetadata`]. /// `null`/omitted (the default) disables the `threadlocal.*` block in the /// emitted OTel process context entirely. + #[napi(skip)] pub threadlocal_metadata: Option, } +#[napi] +impl TracerMetadata { + #[napi(constructor)] + pub fn new( + runtime_id: Option, + tracer_version: String, + hostname: String, + service_name: Option, + service_env: Option, + service_version: Option, + process_tags: Option, + container_id: Option, + threadlocal_metadata: Option, + ) -> Self { + Self { + runtime_id, + tracer_version, + hostname, + service_name, + service_env, + service_version, + process_tags, + container_id, + threadlocal_metadata, + } + } + + #[napi(getter)] + pub fn threadlocal_metadata(&self) -> Option { + self.threadlocal_metadata.clone() + } + + #[napi(setter)] + pub fn set_threadlocal_metadata(&mut self, value: Option) { + self.threadlocal_metadata = value; + } +} + fn convert_extra_attribute(ea: &ExtraAttribute) -> napi::Result<(String, any_value::Value)> { let value = match (&ea.string_value, ea.int_value) { (Some(s), None) => any_value::Value::StringValue(s.clone()), @@ -108,7 +147,7 @@ fn convert_threadlocal_metadata( #[napi] pub fn store_metadata(data: &TracerMetadata) -> napi::Result { - let res = tracer_metadata::store_tracer_metadata(&tracer_metadata::TracerMetadata{ + let res = tracer_metadata::store_tracer_metadata(&tracer_metadata::TracerMetadata { schema_version: 1, runtime_id: data.runtime_id.clone(), tracer_language: String::from("nodejs"), @@ -127,7 +166,7 @@ pub fn store_metadata(data: &TracerMetadata) -> napi::Result Ok(NapiAnonymousFileHandle{ _internal: handle }), + Ok(handle) => Ok(NapiAnonymousFileHandle { _internal: handle }), Err(e) => { let err_msg = format!("Failed to store the tracer configuration: {:?}", e); Err(Error::new(Status::GenericFailure, err_msg)) diff --git a/test/process-discovery.js b/test/process-discovery.js index 9f202350..b7b52fce 100644 --- a/test/process-discovery.js +++ b/test/process-discovery.js @@ -57,6 +57,15 @@ assert.strictEqual( metadata_with_threadlocal.threadlocalMetadata.extraAttributes.length, 3, ) +metadata_with_threadlocal.threadlocalMetadata = { + attributeKeys: ['updated'], + schemaVersion: undefined, + extraAttributes: [], +} +assert.deepStrictEqual( + metadata_with_threadlocal.threadlocalMetadata.attributeKeys, + ['updated'], +) const cfg_handle_threadlocal = process_discovery.storeMetadata(metadata_with_threadlocal) assert(cfg_handle_threadlocal !== undefined)