Skip to content

Commit d38f793

Browse files
akinnanehawkw
andauthored
subscriber: fix on_event serialization when no fields set on span (#1333)
Serializing a spans `on_ACTION` events, when no fields are set on the span, results in invalid JSON. This is because `serializier_map` was getting a size hint for `self.0.metadata().fields().len()` then serializing `self.0.fields.field_set()` instead. This resulted in the fields key being set to an empty object, then Serde serializes the k/v pairs from `field_set()`. This was causing an erroneous closing brace `}` to be added after the serialized fields. This change aligns the size hint with the actual serialized data. Refs: #829 (comment) Co-authored-by: Eliza Weisman <eliza@buoyant.io>
1 parent f40410f commit d38f793

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

tracing-serde/src/fields.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ impl<'a> Serialize for SerializeFieldMap<'a, Event<'_>> {
2121
where
2222
S: Serializer,
2323
{
24-
let len = self.0.metadata().fields().len();
24+
let len = self.0.fields().count();
2525
let serializer = serializer.serialize_map(Some(len))?;
2626
let mut visitor = SerdeMapVisitor::new(serializer);
2727
self.0.record(&mut visitor);

tracing-subscriber/src/fmt/format/json.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ impl<'a> fmt::Debug for WriteAdaptor<'a> {
496496
#[cfg(test)]
497497
mod test {
498498
use super::*;
499-
use crate::fmt::{test::MockMakeWriter, time::FormatTime, CollectorBuilder};
499+
use crate::fmt::{format::FmtSpan, test::MockMakeWriter, time::FormatTime, CollectorBuilder};
500500
use tracing::{self, collect::with_default};
501501

502502
use std::fmt;
@@ -653,6 +653,23 @@ mod test {
653653
});
654654
}
655655

656+
#[test]
657+
fn json_span_event() {
658+
// Check span events serialize correctly.
659+
// Discussion: https://github.com/tokio-rs/tracing/issues/829#issuecomment-661984255
660+
//
661+
let expected = r#"{"timestamp":"fake time","level":"INFO","fields":{"message":"enter"},"target":"tracing_subscriber::fmt::format::json::test"}"#;
662+
let collector = collector()
663+
.flatten_event(false)
664+
.with_current_span(false)
665+
.with_span_list(false)
666+
.with_span_events(FmtSpan::ENTER);
667+
668+
test_json(expected, collector, || {
669+
tracing::info_span!("valid_json").in_scope(|| {});
670+
});
671+
}
672+
656673
fn test_json<T>(
657674
expected: &str,
658675
builder: crate::fmt::CollectorBuilder<JsonFields, Format<Json>>,

0 commit comments

Comments
 (0)