Skip to content

Commit

Permalink
feat: extra fields
Browse files Browse the repository at this point in the history
  • Loading branch information
hseeberger committed Jul 25, 2023
1 parent 4302064 commit a64204c
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 5 deletions.
1 change: 1 addition & 0 deletions tracing-subscriber/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ valuable = ["tracing-core/valuable", "valuable_crate", "valuable-serde", "tracin
# Enables support for local time when using the `time` crate timestamp
# formatters.
local-time = ["time/local-offset"]
extra-fields = []

[dependencies]
tracing-core = { path = "../tracing-core", version = "0.1.30", default-features = false }
Expand Down
26 changes: 22 additions & 4 deletions tracing-subscriber/src/fmt/fmt_layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -311,10 +311,10 @@ impl<S, N, E, W> Layer<S, N, E, W> {
/// By default, `fmt::Layer` will write any `FormatEvent`-internal errors to
/// the writer. These errors are unlikely and will only occur if there is a
/// bug in the `FormatEvent` implementation or its dependencies.
///
///
/// If writing to the writer fails, the error message is printed to stderr
/// as a fallback.
///
///
/// [`FormatEvent`]: crate::fmt::FormatEvent
pub fn log_internal_errors(self, log_internal_errors: bool) -> Self {
Self {
Expand Down Expand Up @@ -623,6 +623,15 @@ impl<S, T, W> Layer<S, format::JsonFields, format::Format<format::Json, T>, W> {
..self
}
}

/// Set the function to make extra fields.
#[cfg(feature = "extra-fields")]
pub fn with_extra_fields(self, make_extra_fields: Box<dyn format::MakeExtraFields>) -> Self {
Layer {
fmt_event: self.fmt_event.with_make_extra_fields(make_extra_fields),
..self
}
}
}

impl<S, N, E, W> Layer<S, N, E, W> {
Expand Down Expand Up @@ -1288,8 +1297,17 @@ mod test {
let actual = sanitize_timings(make_writer.get_string());

// Only assert the start because the line number and callsite may change.
let expected = concat!("Unable to format the following event. Name: event ", file!(), ":");
assert!(actual.as_str().starts_with(expected), "\nactual = {}\nshould start with expected = {}\n", actual, expected);
let expected = concat!(
"Unable to format the following event. Name: event ",
file!(),
":"
);
assert!(
actual.as_str().starts_with(expected),
"\nactual = {}\nshould start with expected = {}\n",
actual,
expected
);
}

#[test]
Expand Down
7 changes: 7 additions & 0 deletions tracing-subscriber/src/fmt/format/json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,13 @@ where
.serialize_entry("threadId", &format!("{:?}", std::thread::current().id()))?;
}

#[cfg(feature = "extra-fields")]
if let Some((make_extra_fields, current_span)) = self.make_extra_fields.as_ref().zip(current_span) {
for (k, v) in make_extra_fields(current_span.extensions()) {
serializer.serialize_entry(&k, &v)?;
}
}

serializer.end()
};

Expand Down
63 changes: 63 additions & 0 deletions tracing-subscriber/src/fmt/format/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ mod pretty;
#[cfg_attr(docsrs, doc(cfg(feature = "ansi")))]
pub use pretty::*;

#[cfg(feature = "extra-fields")]
use crate::registry::Extensions;
#[cfg(feature = "extra-fields")]
use std::collections::HashMap;

/// A type that can format a tracing [`Event`] to a [`Writer`].
///
/// `FormatEvent` is primarily used in the context of [`fmt::Subscriber`] or
Expand Down Expand Up @@ -407,6 +412,43 @@ pub struct Format<F = Full, T = SystemTime> {
pub(crate) display_thread_name: bool,
pub(crate) display_filename: bool,
pub(crate) display_line_number: bool,
#[cfg(feature = "extra-fields")]
pub(crate) make_extra_fields: Option<Box<dyn MakeExtraFields>>
}

/// Make extra fields.
#[cfg(feature = "extra-fields")]
pub trait MakeExtraFields: Fn(Extensions<'_>) -> HashMap<String, String> + Send + Sync {
/// Clone self into a boxed [MakeTraceId].
fn clone_box<'a>(&self) -> Box<dyn 'a + MakeExtraFields>
where
Self: 'a;
}

#[cfg(feature = "extra-fields")]
impl Debug for Box<dyn MakeExtraFields> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "MakeExtraFields")
}
}

#[cfg(feature = "extra-fields")]
impl<F> MakeExtraFields for F
where
F: Fn(Extensions<'_>) -> HashMap<String, String> + Clone + Send + Sync {
fn clone_box<'a>(&self) -> Box<dyn 'a + MakeExtraFields>
where
Self: 'a,
{
Box::new(self.clone())
}
}

#[cfg(feature = "extra-fields")]
impl<'a> Clone for Box<dyn 'a + MakeExtraFields> {
fn clone(&self) -> Self {
self.clone_box()
}
}

// === impl Writer ===
Expand Down Expand Up @@ -585,6 +627,8 @@ impl Default for Format<Full, SystemTime> {
display_thread_name: false,
display_filename: false,
display_line_number: false,
#[cfg(feature = "extra-fields")]
make_extra_fields: None,
}
}
}
Expand All @@ -605,6 +649,8 @@ impl<F, T> Format<F, T> {
display_thread_name: self.display_thread_name,
display_filename: self.display_filename,
display_line_number: self.display_line_number,
#[cfg(feature = "extra-fields")]
make_extra_fields: None,
}
}

Expand Down Expand Up @@ -644,6 +690,8 @@ impl<F, T> Format<F, T> {
display_thread_name: self.display_thread_name,
display_filename: true,
display_line_number: true,
#[cfg(feature = "extra-fields")]
make_extra_fields: None,
}
}

Expand Down Expand Up @@ -675,6 +723,8 @@ impl<F, T> Format<F, T> {
display_thread_name: self.display_thread_name,
display_filename: self.display_filename,
display_line_number: self.display_line_number,
#[cfg(feature = "extra-fields")]
make_extra_fields: None,
}
}

Expand Down Expand Up @@ -704,6 +754,8 @@ impl<F, T> Format<F, T> {
display_thread_name: self.display_thread_name,
display_filename: self.display_filename,
display_line_number: self.display_line_number,
#[cfg(feature = "extra-fields")]
make_extra_fields: None,
}
}

Expand All @@ -720,6 +772,8 @@ impl<F, T> Format<F, T> {
display_thread_name: self.display_thread_name,
display_filename: self.display_filename,
display_line_number: self.display_line_number,
#[cfg(feature = "extra-fields")]
make_extra_fields: None,
}
}

Expand Down Expand Up @@ -801,6 +855,15 @@ impl<F, T> Format<F, T> {
.with_file(display_location)
}

/// Set the function to make extra fields.
#[cfg(feature = "extra-fields")]
pub fn with_make_extra_fields(self, make_trace_id: Box<dyn MakeExtraFields>) -> Self {
Format {
make_extra_fields: Some(make_trace_id),
..self
}
}

#[inline]
fn format_timestamp(&self, writer: &mut Writer<'_>) -> fmt::Result
where
Expand Down
2 changes: 1 addition & 1 deletion tracing-subscriber/src/fmt/time/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ pub trait FormatTime {
/// # }
/// ```
pub fn time() -> SystemTime {
SystemTime::default()
SystemTime
}

/// Returns a new `Uptime` timestamp provider.
Expand Down

0 comments on commit a64204c

Please sign in to comment.