diff --git a/src/layer.rs b/src/layer.rs index 19710c1..a6c345b 100644 --- a/src/layer.rs +++ b/src/layer.rs @@ -56,13 +56,16 @@ where // ignore event that is out of current span if let Some(id) = ctx.current_span().id() { let span = ctx.span(id).expect("span not found"); - let mut extensions = span.extensions_mut(); let metadata = event.metadata(); // create a log let mut nr_log = NewrLog::new(metadata.level()); - if let Some(span_id) = extensions.get_mut::().map(|s| s.id.clone()) { + let span_id = span + .extensions_mut() + .get_mut::() + .map(|s| s.id.clone()); + if let Some(span_id) = span_id { // add linking metadata // https://github.com/newrelic/node-newrelic/blob/91967dd5cd997aa283b8aa0b2fdacc2a5f10a628/api.js#L132 nr_log.attributes.insert("span.id", span_id); @@ -77,10 +80,18 @@ where ), ); + for scope in ctx.event_scope(event).into_iter().flatten() { + let scope_extensions = scope.extensions(); + if let Some(scope_nr_span) = scope_extensions.get::() { + nr_log.attributes.append(&scope_nr_span.attributes); + } + } + // record event attributes event.record(&mut nr_log.attributes); // insert into extensions + let mut extensions = span.extensions_mut(); if let Some(nr_logs) = extensions.get_mut::>() { nr_logs.push(nr_log); } else { diff --git a/src/types.rs b/src/types.rs index 6578916..9020e33 100644 --- a/src/types.rs +++ b/src/types.rs @@ -60,6 +60,12 @@ impl NewrAttributes { pub fn insert>(&mut self, key: &str, val: V) { self.0.insert(key.into(), val.into()); } + + pub fn append(&mut self, other: &Self) { + for (key, val) in &other.0 { + self.0.entry(key.into()).or_insert_with(|| val.clone()); + } + } } impl Visit for NewrAttributes {