Skip to content

Commit c7b338d

Browse files
committed
feat: add support for parent spans
1 parent 4014337 commit c7b338d

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

crates/bitwarden-logging/src/dynamic_tracing/span_factory.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub enum SpanBuilder<'a> {
1515
metadata: &'static Metadata<'static>,
1616
fields: &'static BTreeMap<&'static str, Field>,
1717
values: Vec<(&'static Field, Option<&'a dyn Value>)>,
18+
parent: Option<tracing::Id>,
1819
},
1920
Disabled {
2021
metadata: &'static Metadata<'static>,
@@ -30,6 +31,7 @@ impl Builder for SpanBuilder<'_> {
3031
metadata,
3132
fields,
3233
values: Vec::new(),
34+
parent: None,
3335
}
3436
}
3537
fn create_disabled(metadata: &'static Metadata<'static>) -> Self {
@@ -38,6 +40,13 @@ impl Builder for SpanBuilder<'_> {
3840
}
3941

4042
impl<'a> SpanBuilder<'a> {
43+
pub fn with_parent(&mut self, parent: Option<tracing::Id>) -> &mut Self {
44+
if let SpanBuilder::Enabled { parent: p, .. } = self {
45+
*p = parent;
46+
}
47+
self
48+
}
49+
4150
#[inline]
4251
pub fn with(&mut self, name: &str, value: &'a dyn Value) -> &mut Self {
4352
if let SpanBuilder::Enabled { values, fields, .. } = self {
@@ -51,15 +60,18 @@ impl<'a> SpanBuilder<'a> {
5160
pub fn build(&self) -> Span {
5261
match self {
5362
SpanBuilder::Enabled {
54-
metadata, values, ..
63+
parent,
64+
metadata,
65+
values,
66+
..
5567
} => {
5668
macro_rules! finish {
5769
($n:literal) => {
5870
if $n == values.len() {
5971
let values: [(&'static Field, Option<&'a (dyn Value)>); $n] =
6072
values.as_slice().try_into().unwrap();
6173
let value_set = metadata.fields().value_set(&values);
62-
return Span::new(metadata, &value_set);
74+
return ::tracing::Span::child_of(parent.clone(), metadata, &value_set);
6375
}
6476
};
6577
}

crates/bitwarden-logging/src/wasm/span.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,22 @@ impl SpanDefinition {
2020
factory: SpanFactory::new(&name, &target, level.into(), None, None, None, fields_slice),
2121
}
2222
}
23-
24-
// TODO: Add fields
2523
pub fn enter(&self, fields: Vec<FieldValue>) -> Span {
2624
let span = self.factory.create().build();
2725
for field in fields {
2826
span.record(field.name.as_str(), &field.value);
2927
}
3028
Span::new(span)
3129
}
30+
31+
pub fn enter_with_parent(&self, parent: &Span, fields: Vec<FieldValue>) -> Span {
32+
let span = self.factory.create().with_parent(parent.span.id()).build();
33+
// TODO: fix duplicate code
34+
for field in fields {
35+
span.record(field.name.as_str(), &field.value);
36+
}
37+
Span::new(span)
38+
}
3239
}
3340

3441
#[wasm_bindgen]
@@ -46,7 +53,14 @@ impl Span {
4653

4754
#[wasm_bindgen]
4855
impl Span {
49-
pub fn record(&self, event: &EventDefinition, message: Option<String>) {
56+
/// Record a field on the span. Use when the span is already entered
57+
/// and the field value was not known at span creation time.
58+
pub fn record(&self, field: FieldValue) {
59+
self.span.record(field.name.as_str(), &field.value);
60+
}
61+
62+
/// Emit an event associated with this span.
63+
pub fn event(&self, event: &EventDefinition, message: Option<String>) {
5064
event.record(
5165
self.span.id(),
5266
message.unwrap_or_else(|| {

0 commit comments

Comments
 (0)