Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 31 additions & 22 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions crates/crashtracker/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
12 changes: 6 additions & 6 deletions crates/crashtracker/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use napi::{Env, JsUnknown};
use napi::{Env, Unknown};
use napi_derive::napi;

mod unhandled_exception;
Expand All @@ -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)?;
Expand All @@ -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);
Expand All @@ -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();
Expand Down
19 changes: 10 additions & 9 deletions crates/crashtracker/src/unhandled_exception.rs
Original file line number Diff line number Diff line change
@@ -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<Option<String>> {
match obj.get_named_property::<JsUnknown>(key) {
fn get_optional_string_property(obj: &Object, key: &str) -> napi::Result<Option<String>> {
match obj.get_named_property::<Unknown>(key) {
Ok(val) => {
use napi::ValueType;
if val.get_type()? == ValueType::String {
Expand Down Expand Up @@ -80,21 +81,21 @@ fn parse_location(location: &str, frame: &mut libdd_crashtracker::StackFrame) {
}
}

fn is_error_instance(env: &Env, value: &JsUnknown) -> napi::Result<bool> {
fn is_error_instance(env: &Env, value: &Unknown) -> napi::Result<bool> {
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<String> {
fn stringify_js_value(value: Unknown) -> napi::Result<String> {
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")?;
Expand Down Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions crates/process_discovery/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
45 changes: 42 additions & 3 deletions crates/process_discovery/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ pub struct ThreadLocalMetadata {
pub extra_attributes: Vec<ExtraAttribute>,
}

#[napi(constructor)]
#[napi]
pub struct TracerMetadata {
pub runtime_id: Option<String>,
pub tracer_version: String,
Expand All @@ -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<ThreadLocalMetadata>,
}

#[napi]
impl TracerMetadata {
#[napi(constructor)]
pub fn new(
runtime_id: Option<String>,
tracer_version: String,
hostname: String,
service_name: Option<String>,
service_env: Option<String>,
service_version: Option<String>,
process_tags: Option<String>,
container_id: Option<String>,
threadlocal_metadata: Option<ThreadLocalMetadata>,
) -> 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<ThreadLocalMetadata> {
self.threadlocal_metadata.clone()
}

#[napi(setter)]
pub fn set_threadlocal_metadata(&mut self, value: Option<ThreadLocalMetadata>) {
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()),
Expand Down Expand Up @@ -108,7 +147,7 @@ fn convert_threadlocal_metadata(

#[napi]
pub fn store_metadata(data: &TracerMetadata) -> napi::Result<NapiAnonymousFileHandle> {
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"),
Expand All @@ -127,7 +166,7 @@ pub fn store_metadata(data: &TracerMetadata) -> napi::Result<NapiAnonymousFileHa
});

match res {
Ok(handle) => 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))
Expand Down
9 changes: 9 additions & 0 deletions test/process-discovery.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
Loading