From 854ea1db902c0ddc92cea7b5adc6d8307eb67336 Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Fri, 9 Feb 2024 15:31:47 -0300 Subject: [PATCH 01/10] Reached the desired outcome -- yet not optimal. + Working examples (specially demo_full_fields.rs) --- Cargo.lock | 13 +++++ Cargo.toml | 2 + examples/demo_custom_formatter.rs | 83 +++++++++++++++++++++++++++++++ examples/demo_custom_layer.rs | 83 +++++++++++++++++++++++++++++++ examples/demo_full_fields.rs | 42 ++++++++++++++++ src/event_formatter.rs | 78 ++++++++++++++++++++++++++++- 6 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 examples/demo_custom_formatter.rs create mode 100644 examples/demo_custom_layer.rs create mode 100644 examples/demo_full_fields.rs diff --git a/Cargo.lock b/Cargo.lock index dda4f9c..628fc80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -88,7 +88,9 @@ checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", "windows-targets", ] @@ -760,6 +762,7 @@ name = "tracing-stackdriver-cw" version = "0.1.0" dependencies = [ "Inflector", + "chrono", "http", "lazy_static", "opentelemetry", @@ -775,6 +778,7 @@ dependencies = [ "tracing-opentelemetry", "tracing-subscriber", "url", + "uuid", "valuable", "valuable-serde", ] @@ -834,6 +838,15 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "uuid" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +dependencies = [ + "getrandom", +] + [[package]] name = "valuable" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 850adb4..e3acf47 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -70,6 +70,8 @@ lazy_static = "1.4.0" tracing = "0.1.34" rand = "0.8.5" opentelemetry_sdk = "0.21.1" +uuid = { version = "1.7.0", features = ["v4"] } +chrono = "0.4.31" [dev-dependencies.time] features = ["serde", "serde-well-known", "formatting"] diff --git a/examples/demo_custom_formatter.rs b/examples/demo_custom_formatter.rs new file mode 100644 index 0000000..66df5dd --- /dev/null +++ b/examples/demo_custom_formatter.rs @@ -0,0 +1,83 @@ +use tracing_subscriber::prelude::*; +use tracing_subscriber::Registry; +// use tracing_stackdriver_cw::Layer; +use tracing_subscriber::fmt; +use tracing::{info, instrument}; +use serde_json::json; +use std::io; +use uuid::Uuid; +use chrono::Utc; +use tracing_subscriber::fmt::format::Writer; +use tracing_subscriber::fmt::FormatFields; + +#[instrument] +fn database_function() { + info!("This is the database function"); +} + +#[instrument] +fn business_logic_function() { + info!("This is the business logic function"); + database_function(); +} + +#[instrument] +fn endpoint_function() { + let trace_id = Uuid::new_v4().to_string(); + let _span = tracing::info_span!("endpoint_function", trace_id = %trace_id); + + info!(trace_id = %trace_id, "This is the endpoint function"); + business_logic_function(); +} + + +struct CustomFormatter; + +impl tracing_subscriber::fmt::FormatEvent for CustomFormatter + where + S: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, + N: for<'a> tracing_subscriber::fmt::FormatFields<'a> + 'static, +{ + fn format_event( + &self, + ctx: &tracing_subscriber::fmt::FmtContext<'_, S, N>, + writer: Writer, + event: &tracing::Event<'_>, + ) -> Result<(), std::fmt::Error> { + let metadata = event.metadata(); + let mut visitor = tracing_subscriber::fmt::format::JsonFields::new(); + println!("PARENT: {:?}", event.parent()); + println!("METADATA: {metadata:?}"); + for field in event.fields() { + println!("FIELD {field:?} = {{value:?}}"); + } + event.record(&mut |field, value| { + // }); + // let fields = visitor.finish(); + + // Using chrono for the timestamp + let now = Utc::now(); + + // let log = json!({ + // "time": now.to_rfc3339(), + // "level": metadata.level().to_string(), + // "message": fields.message.unwrap_or_default(), + // // "trace_id" handling remains the same + // }); + // + // writeln!(writer, "{}", log) + Ok(()) + } +} + +fn main() { + let subscriber = Registry::default() + .with(fmt::Layer::default() + .event_format(CustomFormatter) + .fmt_fields(fmt::format::JsonFields::new())); + + tracing::subscriber::set_global_default(subscriber) + .expect("setting default subscriber failed"); + + endpoint_function(); +} diff --git a/examples/demo_custom_layer.rs b/examples/demo_custom_layer.rs new file mode 100644 index 0000000..e8e266c --- /dev/null +++ b/examples/demo_custom_layer.rs @@ -0,0 +1,83 @@ +use tracing_subscriber::fmt::{format::JsonFields, FormatEvent, FormatFields, FormattedFields}; +use tracing_subscriber::{fmt, prelude::*, registry::LookupSpan, Layer, Registry}; +use std::fmt::{Debug, Write as _}; +use std::io::Write; +use tracing_core::Field; + +struct CustomLayer { + // Inner layer (e.g., for JSON formatting) + inner: fmt::Layer>, +} + +impl Layer for CustomLayer +where + S: tracing::Subscriber + for<'a> LookupSpan<'a>, + N: for<'a> FormatFields<'a> + 'static, +{ + fn on_event( + &self, + event: &tracing::Event<'_>, + ctx: tracing_subscriber::layer::Context<'_, S>, + ) { + // Intercept the event here and customize the output + let mut visitor = CustomVisitor::new(); + event.record(&mut visitor); + + // Write the customized fields to the formatter + if let Some(mut buf) = ctx.field_buffer() { + let mut serializer = buf.as_writer(); + for (field, value) in visitor.fields { + if field == "trace_id" { + // Move trace_id to the root level + writeln!(serializer, "\"trace_id\": {},", value).unwrap(); + } else { + // Adjust or ignore fields as needed + } + } + + // Use the inner layer to complete formatting and output + let fields = FormattedFields::::new(String::from_utf8(buf).unwrap()); + self.inner.on_event(event, &fields, ctx); + } + } +} + +// Define your custom visitor here to handle specific fields +struct CustomVisitor { + fields: Vec<(String, String)>, +} + +impl CustomVisitor { + fn new() -> Self { + CustomVisitor { fields: vec![] } + } +} + +impl tracing_subscriber::field::Visit for CustomVisitor { + fn record_str(&mut self, field: &tracing::field::Field, value: &str) { + self.fields.push((field.name().to_string(), value.to_string())); + } + + fn record_debug(&mut self, field: &Field, value: &dyn Debug) { + println!("RECORD_DEBUG CALLED!!"); + dbg!(field); + dbg!(value); + todo!() + } + + // Implement other record methods as needed +} + +fn main() { + // Set up the custom layer + let custom_layer = CustomLayer { + inner: fmt::Layer::new().json(), + }; + + let subscriber = Registry::default().with(custom_layer); + + tracing::subscriber::set_global_default(subscriber) + .expect("setting default subscriber failed"); + + // Your application logic here +} diff --git a/examples/demo_full_fields.rs b/examples/demo_full_fields.rs new file mode 100644 index 0000000..23c2698 --- /dev/null +++ b/examples/demo_full_fields.rs @@ -0,0 +1,42 @@ +use tracing::{info, instrument, trace_span}; +use tracing_subscriber::prelude::*; +use tracing_subscriber::Registry; +use tracing_stackdriver_cw::layer; +use uuid::Uuid; + +#[instrument] +fn database_function() { + info!("This is the database function"); +} + +#[instrument] +fn business_logic_function() { + info!("This is the business logic function"); + database_function(); +} + +#[instrument] +fn endpoint_function() { + // `trace_id` can come from Google App Engine, via headers + let trace_id = Uuid::new_v4().to_string(); + let span = trace_span!("endpoint_function", trace_id = %trace_id); + let _enter = span.enter(); + + info!(trace_id = %trace_id, "This is the endpoint function"); + business_logic_function(); +} + +fn main() { + // Set up the subscriber. + let stackdriver = layer(); // writes to std::io::Stdout + let subscriber = Registry::default().with(stackdriver); + + tracing::subscriber::set_global_default(subscriber) + .expect("setting default subscriber failed"); + + endpoint_function(); + + dbg!(core::any::TypeId::of::()); + dbg!(core::any::TypeId::of::()); + dbg!(core::any::TypeId::of::>()); +} diff --git a/src/event_formatter.rs b/src/event_formatter.rs index 7555032..e59a208 100644 --- a/src/event_formatter.rs +++ b/src/event_formatter.rs @@ -6,8 +6,10 @@ use crate::{ }; use serde::ser::{SerializeMap, Serializer as _}; use std::fmt; +use std::fmt::Debug; use time::{format_description::well_known::Rfc3339, OffsetDateTime}; -use tracing_core::{Event, Subscriber}; +use tracing_core::{Event, Field, Subscriber}; +use tracing_core::field::Visit; use tracing_subscriber::{ field::VisitOutput, fmt::{ @@ -16,6 +18,10 @@ use tracing_subscriber::{ }, registry::LookupSpan, }; +use tracing_subscriber::field::RecordFields; +use tracing_subscriber::registry::SpanRef; +use tracing_core::span::{Attributes, Record}; +use tracing_core::field::Value; #[derive(Debug, thiserror::Error)] enum Error { @@ -84,7 +90,43 @@ impl EventFormatter { // serialize the current span and its leaves if let Some(span) = span { map.serialize_entry("span", &SerializableSpan::new(&span))?; - map.serialize_entry("spans", &SerializableContext::new(context))?; + //map.serialize_entry("spans", &SerializableContext::new(context))?; + let mut trace_id = TraceIdVisitor { trace_id: None }; + // event.record(&mut trace_id); + if let None = trace_id.trace_id { + context.visit_spans(|span| { + for field in span.fields() { + if field.name() == "trace_id" { + // println!(" SPAN has TRACE ID: {:?}", field); + let extensions = span.extensions(); + if let Some(json_fields) = extensions.get::>() { + json_fields.record(&field, &mut trace_id); + println!(" SPAN Trace ID: {:?}", trace_id.trace_id); + } + } + } + // let mut span_trace_id = TraceIdVisitor { trace_id: None }; + // if let Some(fields) = span.extensions().get::() { + // fields.record(&mut span_trace_id); + // } + // println!(" SPAN Trace ID: {:?}", root_trace_id.trace_id); + Ok::<(), Box>(()) + }).expect("ERROR visiting_spans"); + } + println!("TO ADD TO ROOT Trace ID: {:?}", trace_id.trace_id); + // let span_fields = span.fields(); + // dbg!(span_fields); // trace_id, for the endpoint log, is in here +// let _metadata = span.metadata(); +// dbg!(_metadata); // nothing useful here +// let _extensions = span.extensions(); +// dbg!(_extensions); + for key in span.extensions().keys() { + dbg!(key); + } + + if let Some(trace_id) = trace_id.trace_id { + map.serialize_entry("traceId", &trace_id)?; + } #[cfg(feature = "opentelemetry")] if let (Some(crate::CloudTraceConfiguration { project_id }), Some(otel_data)) = ( @@ -129,6 +171,38 @@ impl EventFormatter { } } +// Define a custom visitor that looks for a specific field and stores its value. +struct TraceIdVisitor { + trace_id: Option, +} +impl TraceIdVisitor { + fn new() -> Self { + TraceIdVisitor { trace_id: None } + } +} + +impl Visit for TraceIdVisitor { + fn record_str(&mut self, field: &Field, value: &str) { + if field.name() == "trace_id" { + // trace_id can be a json serialized string, so... + let value = value.split(":") + .skip(1) + .map(|quoted| "ed[1..quoted.len()-2]) + .find(|_| true) + .unwrap_or(value); + + self.trace_id = Some(value.to_string()); + } + } + fn record_debug(&mut self, field: &Field, value: &dyn Debug) { + // if field.name() == "trace_id" { + // self.trace_id = Some(format!("--{:?}", value)); + // } + todo!() + } +} + + impl FormatEvent for EventFormatter where S: Subscriber + for<'span> LookupSpan<'span>, From 2cb6d9996e818b66ef682aee9ee82c4222d40c5e Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Thu, 15 Feb 2024 11:43:20 -0300 Subject: [PATCH 02/10] CLean-ups --- examples/demo_custom_formatter.rs | 83 ------------------------------- examples/demo_custom_layer.rs | 83 ------------------------------- examples/demo_full_fields.rs | 14 ++++-- src/event_formatter.rs | 17 ------- 4 files changed, 10 insertions(+), 187 deletions(-) delete mode 100644 examples/demo_custom_formatter.rs delete mode 100644 examples/demo_custom_layer.rs diff --git a/examples/demo_custom_formatter.rs b/examples/demo_custom_formatter.rs deleted file mode 100644 index 66df5dd..0000000 --- a/examples/demo_custom_formatter.rs +++ /dev/null @@ -1,83 +0,0 @@ -use tracing_subscriber::prelude::*; -use tracing_subscriber::Registry; -// use tracing_stackdriver_cw::Layer; -use tracing_subscriber::fmt; -use tracing::{info, instrument}; -use serde_json::json; -use std::io; -use uuid::Uuid; -use chrono::Utc; -use tracing_subscriber::fmt::format::Writer; -use tracing_subscriber::fmt::FormatFields; - -#[instrument] -fn database_function() { - info!("This is the database function"); -} - -#[instrument] -fn business_logic_function() { - info!("This is the business logic function"); - database_function(); -} - -#[instrument] -fn endpoint_function() { - let trace_id = Uuid::new_v4().to_string(); - let _span = tracing::info_span!("endpoint_function", trace_id = %trace_id); - - info!(trace_id = %trace_id, "This is the endpoint function"); - business_logic_function(); -} - - -struct CustomFormatter; - -impl tracing_subscriber::fmt::FormatEvent for CustomFormatter - where - S: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>, - N: for<'a> tracing_subscriber::fmt::FormatFields<'a> + 'static, -{ - fn format_event( - &self, - ctx: &tracing_subscriber::fmt::FmtContext<'_, S, N>, - writer: Writer, - event: &tracing::Event<'_>, - ) -> Result<(), std::fmt::Error> { - let metadata = event.metadata(); - let mut visitor = tracing_subscriber::fmt::format::JsonFields::new(); - println!("PARENT: {:?}", event.parent()); - println!("METADATA: {metadata:?}"); - for field in event.fields() { - println!("FIELD {field:?} = {{value:?}}"); - } - event.record(&mut |field, value| { - // }); - // let fields = visitor.finish(); - - // Using chrono for the timestamp - let now = Utc::now(); - - // let log = json!({ - // "time": now.to_rfc3339(), - // "level": metadata.level().to_string(), - // "message": fields.message.unwrap_or_default(), - // // "trace_id" handling remains the same - // }); - // - // writeln!(writer, "{}", log) - Ok(()) - } -} - -fn main() { - let subscriber = Registry::default() - .with(fmt::Layer::default() - .event_format(CustomFormatter) - .fmt_fields(fmt::format::JsonFields::new())); - - tracing::subscriber::set_global_default(subscriber) - .expect("setting default subscriber failed"); - - endpoint_function(); -} diff --git a/examples/demo_custom_layer.rs b/examples/demo_custom_layer.rs deleted file mode 100644 index e8e266c..0000000 --- a/examples/demo_custom_layer.rs +++ /dev/null @@ -1,83 +0,0 @@ -use tracing_subscriber::fmt::{format::JsonFields, FormatEvent, FormatFields, FormattedFields}; -use tracing_subscriber::{fmt, prelude::*, registry::LookupSpan, Layer, Registry}; -use std::fmt::{Debug, Write as _}; -use std::io::Write; -use tracing_core::Field; - -struct CustomLayer { - // Inner layer (e.g., for JSON formatting) - inner: fmt::Layer>, -} - -impl Layer for CustomLayer -where - S: tracing::Subscriber + for<'a> LookupSpan<'a>, - N: for<'a> FormatFields<'a> + 'static, -{ - fn on_event( - &self, - event: &tracing::Event<'_>, - ctx: tracing_subscriber::layer::Context<'_, S>, - ) { - // Intercept the event here and customize the output - let mut visitor = CustomVisitor::new(); - event.record(&mut visitor); - - // Write the customized fields to the formatter - if let Some(mut buf) = ctx.field_buffer() { - let mut serializer = buf.as_writer(); - for (field, value) in visitor.fields { - if field == "trace_id" { - // Move trace_id to the root level - writeln!(serializer, "\"trace_id\": {},", value).unwrap(); - } else { - // Adjust or ignore fields as needed - } - } - - // Use the inner layer to complete formatting and output - let fields = FormattedFields::::new(String::from_utf8(buf).unwrap()); - self.inner.on_event(event, &fields, ctx); - } - } -} - -// Define your custom visitor here to handle specific fields -struct CustomVisitor { - fields: Vec<(String, String)>, -} - -impl CustomVisitor { - fn new() -> Self { - CustomVisitor { fields: vec![] } - } -} - -impl tracing_subscriber::field::Visit for CustomVisitor { - fn record_str(&mut self, field: &tracing::field::Field, value: &str) { - self.fields.push((field.name().to_string(), value.to_string())); - } - - fn record_debug(&mut self, field: &Field, value: &dyn Debug) { - println!("RECORD_DEBUG CALLED!!"); - dbg!(field); - dbg!(value); - todo!() - } - - // Implement other record methods as needed -} - -fn main() { - // Set up the custom layer - let custom_layer = CustomLayer { - inner: fmt::Layer::new().json(), - }; - - let subscriber = Registry::default().with(custom_layer); - - tracing::subscriber::set_global_default(subscriber) - .expect("setting default subscriber failed"); - - // Your application logic here -} diff --git a/examples/demo_full_fields.rs b/examples/demo_full_fields.rs index 23c2698..582eb1e 100644 --- a/examples/demo_full_fields.rs +++ b/examples/demo_full_fields.rs @@ -17,8 +17,12 @@ fn business_logic_function() { #[instrument] fn endpoint_function() { - // `trace_id` can come from Google App Engine, via headers + // `trace_id` can come from Google App Engine, via headers. + // Here, we generate it manually let trace_id = Uuid::new_v4().to_string(); + // the following 2 variables must only be dropped at the end of the function, + // or else `traceId` won't be tracked correctly, as it is controlled by the + // opened "spans" on each thread. let span = trace_span!("endpoint_function", trace_id = %trace_id); let _enter = span.enter(); @@ -36,7 +40,9 @@ fn main() { endpoint_function(); - dbg!(core::any::TypeId::of::()); - dbg!(core::any::TypeId::of::()); - dbg!(core::any::TypeId::of::>()); + // observe that each entry contain the same 'traceId' field at the root of each json, + // like the following: + // {"time":"2024-02-15T14:38:07.97665775Z","target":"demo_full_fields","logging.googleapis.com/sourceLocation":{"file":"examples/demo_full_fields.rs","line":"29"},"span":{"trace_id":"25075b50-d745-4d6b-9040-015be8482ad7","name":"endpoint_function"},"traceId":"25075b50-d745-4d6b-9040-015be8482ad7","severity":"INFO","message":"This is the endpoint function","traceId":"25075b50-d745-4d6b-9040-015be8482ad7"} + // {"time":"2024-02-15T14:38:07.976721894Z","target":"demo_full_fields","logging.googleapis.com/sourceLocation":{"file":"examples/demo_full_fields.rs","line":"14"},"span":{"name":"business_logic_function"},"traceId":"25075b50-d745-4d6b-9040-015be8482ad7","severity":"INFO","message":"This is the business logic function"} + // {"time":"2024-02-15T14:38:07.976742013Z","target":"demo_full_fields","logging.googleapis.com/sourceLocation":{"file":"examples/demo_full_fields.rs","line":"9"},"span":{"name":"database_function"},"traceId":"25075b50-d745-4d6b-9040-015be8482ad7","severity":"INFO","message":"This is the database function"} } diff --git a/src/event_formatter.rs b/src/event_formatter.rs index e59a208..83b90e2 100644 --- a/src/event_formatter.rs +++ b/src/event_formatter.rs @@ -92,7 +92,6 @@ impl EventFormatter { map.serialize_entry("span", &SerializableSpan::new(&span))?; //map.serialize_entry("spans", &SerializableContext::new(context))?; let mut trace_id = TraceIdVisitor { trace_id: None }; - // event.record(&mut trace_id); if let None = trace_id.trace_id { context.visit_spans(|span| { for field in span.fields() { @@ -101,28 +100,12 @@ impl EventFormatter { let extensions = span.extensions(); if let Some(json_fields) = extensions.get::>() { json_fields.record(&field, &mut trace_id); - println!(" SPAN Trace ID: {:?}", trace_id.trace_id); } } } - // let mut span_trace_id = TraceIdVisitor { trace_id: None }; - // if let Some(fields) = span.extensions().get::() { - // fields.record(&mut span_trace_id); - // } - // println!(" SPAN Trace ID: {:?}", root_trace_id.trace_id); Ok::<(), Box>(()) }).expect("ERROR visiting_spans"); } - println!("TO ADD TO ROOT Trace ID: {:?}", trace_id.trace_id); - // let span_fields = span.fields(); - // dbg!(span_fields); // trace_id, for the endpoint log, is in here -// let _metadata = span.metadata(); -// dbg!(_metadata); // nothing useful here -// let _extensions = span.extensions(); -// dbg!(_extensions); - for key in span.extensions().keys() { - dbg!(key); - } if let Some(trace_id) = trace_id.trace_id { map.serialize_entry("traceId", &trace_id)?; From e3e22ce4fde86baee309f89b4219b59cf644d068 Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Thu, 15 Feb 2024 12:04:58 -0300 Subject: [PATCH 03/10] async demo --- Cargo.lock | 100 +++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + examples/demo_full_fields.rs | 60 ++++++++++++++++----- 3 files changed, 148 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 628fc80..20ec69b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,6 +12,21 @@ dependencies = [ "regex", ] +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "aho-corasick" version = "1.1.1" @@ -53,6 +68,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "bumpalo" version = "3.14.0" @@ -225,6 +255,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + [[package]] name = "glob" version = "0.3.1" @@ -237,6 +273,12 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "hermit-abi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" + [[package]] name = "http" version = "0.2.9" @@ -330,6 +372,15 @@ version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -349,6 +400,25 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.18.0" @@ -528,6 +598,12 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "ryu" version = "1.0.15" @@ -685,6 +761,29 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" +dependencies = [ + "backtrace", + "num_cpus", + "pin-project-lite", + "tokio-macros", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + [[package]] name = "tracing" version = "0.1.37" @@ -773,6 +872,7 @@ dependencies = [ "serde_json", "thiserror", "time", + "tokio", "tracing", "tracing-core", "tracing-opentelemetry", diff --git a/Cargo.toml b/Cargo.toml index e3acf47..f0c38d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -72,6 +72,7 @@ rand = "0.8.5" opentelemetry_sdk = "0.21.1" uuid = { version = "1.7.0", features = ["v4"] } chrono = "0.4.31" +tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros"] } [dev-dependencies.time] features = ["serde", "serde-well-known", "formatting"] diff --git a/examples/demo_full_fields.rs b/examples/demo_full_fields.rs index 582eb1e..11cb91b 100644 --- a/examples/demo_full_fields.rs +++ b/examples/demo_full_fields.rs @@ -5,32 +5,59 @@ use tracing_stackdriver_cw::layer; use uuid::Uuid; #[instrument] -fn database_function() { - info!("This is the database function"); +fn sync_database_function() { + info!("This is the SYNC database function"); } #[instrument] -fn business_logic_function() { - info!("This is the business logic function"); - database_function(); +fn sync_business_logic_function() { + info!("This is the SYNC business logic function"); + sync_database_function(); } #[instrument] -fn endpoint_function() { +fn sync_endpoint_function() { // `trace_id` can come from Google App Engine, via headers. // Here, we generate it manually let trace_id = Uuid::new_v4().to_string(); // the following 2 variables must only be dropped at the end of the function, // or else `traceId` won't be tracked correctly, as it is controlled by the // opened "spans" on each thread. - let span = trace_span!("endpoint_function", trace_id = %trace_id); + let span = trace_span!("sync_endpoint_function", trace_id = %trace_id); let _enter = span.enter(); - info!(trace_id = %trace_id, "This is the endpoint function"); - business_logic_function(); + info!(trace_id = %trace_id, "This is the SYNC endpoint function"); + sync_business_logic_function(); } -fn main() { +#[instrument] +async fn async_database_function() { + info!("This is the ASYNC database function"); +} + +#[instrument] +async fn async_business_logic_function() { + info!("This is the ASYNC business logic function"); + async_database_function().await; +} + +#[instrument] +async fn async_endpoint_function() { + // `trace_id` can come from Google App Engine, via headers. + // Here, we generate it manually + let trace_id = Uuid::new_v4().to_string(); + // the following 2 variables must only be dropped at the end of the function, + // or else `traceId` won't be tracked correctly, as it is controlled by the + // opened "spans" on each thread. + let span = trace_span!("async_endpoint_function", trace_id = %trace_id); + let _enter = span.enter(); + + info!(trace_id = %trace_id, "This is the SYNC endpoint function"); + async_business_logic_function().await; +} + +#[tokio::main] +async fn main() { // Set up the subscriber. let stackdriver = layer(); // writes to std::io::Stdout let subscriber = Registry::default().with(stackdriver); @@ -38,10 +65,17 @@ fn main() { tracing::subscriber::set_global_default(subscriber) .expect("setting default subscriber failed"); - endpoint_function(); + // For traditional sync functions, tracing-stackdriver will link spans to threads. + sync_endpoint_function(); + + // You can safely assume that tracing-stackdriver will work as expected in async scenarios when using Tokio, + // as it will link spans to execution contexts for the async mode. + // Ensure that all your asynchronous tasks (futures) are spawned within the Tokio runtime. + // Avoid mixing threads and tasks directly; let Tokio manage the execution flow. + async_endpoint_function().await; - // observe that each entry contain the same 'traceId' field at the root of each json, - // like the following: + // observe that each log entry contains the same 'traceId' field at the root of each json, + // like the following excerpt: // {"time":"2024-02-15T14:38:07.97665775Z","target":"demo_full_fields","logging.googleapis.com/sourceLocation":{"file":"examples/demo_full_fields.rs","line":"29"},"span":{"trace_id":"25075b50-d745-4d6b-9040-015be8482ad7","name":"endpoint_function"},"traceId":"25075b50-d745-4d6b-9040-015be8482ad7","severity":"INFO","message":"This is the endpoint function","traceId":"25075b50-d745-4d6b-9040-015be8482ad7"} // {"time":"2024-02-15T14:38:07.976721894Z","target":"demo_full_fields","logging.googleapis.com/sourceLocation":{"file":"examples/demo_full_fields.rs","line":"14"},"span":{"name":"business_logic_function"},"traceId":"25075b50-d745-4d6b-9040-015be8482ad7","severity":"INFO","message":"This is the business logic function"} // {"time":"2024-02-15T14:38:07.976742013Z","target":"demo_full_fields","logging.googleapis.com/sourceLocation":{"file":"examples/demo_full_fields.rs","line":"9"},"span":{"name":"database_function"},"traceId":"25075b50-d745-4d6b-9040-015be8482ad7","severity":"INFO","message":"This is the database function"} From ecc4dcf8de6aed160701cb749826ce6704793631 Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Thu, 15 Feb 2024 12:11:18 -0300 Subject: [PATCH 04/10] clean-ups --- src/event_formatter.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/event_formatter.rs b/src/event_formatter.rs index 83b90e2..bf8eae2 100644 --- a/src/event_formatter.rs +++ b/src/event_formatter.rs @@ -96,7 +96,6 @@ impl EventFormatter { context.visit_spans(|span| { for field in span.fields() { if field.name() == "trace_id" { - // println!(" SPAN has TRACE ID: {:?}", field); let extensions = span.extensions(); if let Some(json_fields) = extensions.get::>() { json_fields.record(&field, &mut trace_id); @@ -154,7 +153,7 @@ impl EventFormatter { } } -// Define a custom visitor that looks for a specific field and stores its value. +/// A custom visitor that looks for the `trace_id` field and store its value. struct TraceIdVisitor { trace_id: Option, } @@ -167,7 +166,8 @@ impl TraceIdVisitor { impl Visit for TraceIdVisitor { fn record_str(&mut self, field: &Field, value: &str) { if field.name() == "trace_id" { - // trace_id can be a json serialized string, so... + // `trace_id` can be a json serialized string + // -- if so, we unpack it let value = value.split(":") .skip(1) .map(|quoted| "ed[1..quoted.len()-2]) @@ -178,14 +178,9 @@ impl Visit for TraceIdVisitor { } } fn record_debug(&mut self, field: &Field, value: &dyn Debug) { - // if field.name() == "trace_id" { - // self.trace_id = Some(format!("--{:?}", value)); - // } - todo!() } } - impl FormatEvent for EventFormatter where S: Subscriber + for<'span> LookupSpan<'span>, From 961010691f23fca229536cd75d09b7faa2561440 Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Thu, 15 Feb 2024 12:12:47 -0300 Subject: [PATCH 05/10] cargo fmt --- examples/demo_full_fields.rs | 5 ++--- src/event_formatter.rs | 41 ++++++++++++++++++++---------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/examples/demo_full_fields.rs b/examples/demo_full_fields.rs index 11cb91b..6bc74bc 100644 --- a/examples/demo_full_fields.rs +++ b/examples/demo_full_fields.rs @@ -1,7 +1,7 @@ use tracing::{info, instrument, trace_span}; +use tracing_stackdriver_cw::layer; use tracing_subscriber::prelude::*; use tracing_subscriber::Registry; -use tracing_stackdriver_cw::layer; use uuid::Uuid; #[instrument] @@ -62,8 +62,7 @@ async fn main() { let stackdriver = layer(); // writes to std::io::Stdout let subscriber = Registry::default().with(stackdriver); - tracing::subscriber::set_global_default(subscriber) - .expect("setting default subscriber failed"); + tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed"); // For traditional sync functions, tracing-stackdriver will link spans to threads. sync_endpoint_function(); diff --git a/src/event_formatter.rs b/src/event_formatter.rs index bf8eae2..49f7c72 100644 --- a/src/event_formatter.rs +++ b/src/event_formatter.rs @@ -8,8 +8,12 @@ use serde::ser::{SerializeMap, Serializer as _}; use std::fmt; use std::fmt::Debug; use time::{format_description::well_known::Rfc3339, OffsetDateTime}; -use tracing_core::{Event, Field, Subscriber}; +use tracing_core::field::Value; use tracing_core::field::Visit; +use tracing_core::span::{Attributes, Record}; +use tracing_core::{Event, Field, Subscriber}; +use tracing_subscriber::field::RecordFields; +use tracing_subscriber::registry::SpanRef; use tracing_subscriber::{ field::VisitOutput, fmt::{ @@ -18,10 +22,6 @@ use tracing_subscriber::{ }, registry::LookupSpan, }; -use tracing_subscriber::field::RecordFields; -use tracing_subscriber::registry::SpanRef; -use tracing_core::span::{Attributes, Record}; -use tracing_core::field::Value; #[derive(Debug, thiserror::Error)] enum Error { @@ -93,17 +93,22 @@ impl EventFormatter { //map.serialize_entry("spans", &SerializableContext::new(context))?; let mut trace_id = TraceIdVisitor { trace_id: None }; if let None = trace_id.trace_id { - context.visit_spans(|span| { - for field in span.fields() { - if field.name() == "trace_id" { - let extensions = span.extensions(); - if let Some(json_fields) = extensions.get::>() { - json_fields.record(&field, &mut trace_id); + context + .visit_spans(|span| { + for field in span.fields() { + if field.name() == "trace_id" { + let extensions = span.extensions(); + if let Some(json_fields) = extensions + .get::>() { + json_fields.record(&field, &mut trace_id); + } } } - } - Ok::<(), Box>(()) - }).expect("ERROR visiting_spans"); + Ok::<(), Box>(()) + }) + .expect("ERROR visiting_spans"); } if let Some(trace_id) = trace_id.trace_id { @@ -168,17 +173,17 @@ impl Visit for TraceIdVisitor { if field.name() == "trace_id" { // `trace_id` can be a json serialized string // -- if so, we unpack it - let value = value.split(":") + let value = value + .split(":") .skip(1) - .map(|quoted| "ed[1..quoted.len()-2]) + .map(|quoted| "ed[1..quoted.len() - 2]) .find(|_| true) .unwrap_or(value); self.trace_id = Some(value.to_string()); } } - fn record_debug(&mut self, field: &Field, value: &dyn Debug) { - } + fn record_debug(&mut self, field: &Field, value: &dyn Debug) {} } impl FormatEvent for EventFormatter From be208e3fcded8ae44c0ff0a00c7486d0b29a804a Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Thu, 15 Feb 2024 12:21:06 -0300 Subject: [PATCH 06/10] addressed clippy warnings --- src/event_formatter.rs | 13 +++++-------- src/serializers.rs | 1 + 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/event_formatter.rs b/src/event_formatter.rs index 49f7c72..fa943c1 100644 --- a/src/event_formatter.rs +++ b/src/event_formatter.rs @@ -1,6 +1,6 @@ use crate::{ google::LogSeverity, - serializers::{SerializableContext, SerializableSpan, SourceLocation}, + serializers::{SerializableSpan, SourceLocation}, visitor::Visitor, writer::WriteAdaptor, }; @@ -10,10 +10,7 @@ use std::fmt::Debug; use time::{format_description::well_known::Rfc3339, OffsetDateTime}; use tracing_core::field::Value; use tracing_core::field::Visit; -use tracing_core::span::{Attributes, Record}; use tracing_core::{Event, Field, Subscriber}; -use tracing_subscriber::field::RecordFields; -use tracing_subscriber::registry::SpanRef; use tracing_subscriber::{ field::VisitOutput, fmt::{ @@ -91,8 +88,8 @@ impl EventFormatter { if let Some(span) = span { map.serialize_entry("span", &SerializableSpan::new(&span))?; //map.serialize_entry("spans", &SerializableContext::new(context))?; - let mut trace_id = TraceIdVisitor { trace_id: None }; - if let None = trace_id.trace_id { + let mut trace_id = TraceIdVisitor::new(); + if trace_id.trace_id.is_none() { context .visit_spans(|span| { for field in span.fields() { @@ -174,7 +171,7 @@ impl Visit for TraceIdVisitor { // `trace_id` can be a json serialized string // -- if so, we unpack it let value = value - .split(":") + .split(':') .skip(1) .map(|quoted| "ed[1..quoted.len() - 2]) .find(|_| true) @@ -183,7 +180,7 @@ impl Visit for TraceIdVisitor { self.trace_id = Some(value.to_string()); } } - fn record_debug(&mut self, field: &Field, value: &dyn Debug) {} + fn record_debug(&mut self, _field: &Field, _value: &dyn Debug) {} } impl FormatEvent for EventFormatter diff --git a/src/serializers.rs b/src/serializers.rs index a780367..6f2146e 100644 --- a/src/serializers.rs +++ b/src/serializers.rs @@ -65,6 +65,7 @@ impl<'a, 'b, S> SerializableContext<'a, 'b, S> where S: Subscriber + for<'lookup> LookupSpan<'lookup>, { + #[allow(dead_code)] pub(crate) fn new(context: &'b FmtContext<'a, S, JsonFields>) -> Self { Self(context) } From d0ad18270e53104630dd4fcb21b3bd375e69e370 Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Thu, 15 Feb 2024 13:50:33 -0300 Subject: [PATCH 07/10] pulled from master --- Cargo.lock | 383 ++++++++++++++++++++++++----------------------------- 1 file changed, 175 insertions(+), 208 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6d98a9f..5bb4a5e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,17 +51,6 @@ dependencies = [ "libc", ] -[[package]] -name = "async-trait" -version = "0.1.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -89,12 +78,6 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - [[package]] name = "cc" version = "1.0.83" @@ -130,25 +113,6 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - [[package]] name = "deranged" version = "0.3.10" @@ -159,91 +123,6 @@ dependencies = [ "serde", ] -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-core", - "futures-macro", - "futures-sink", - "futures-task", - "pin-project-lite", - "pin-utils", - "slab", -] - [[package]] name = "getrandom" version = "0.2.10" @@ -261,35 +140,12 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - [[package]] name = "hermit-abi" version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" -[[package]] -name = "http" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "iana-time-zone" version = "0.1.58" @@ -314,37 +170,32 @@ dependencies = [ ] [[package]] -name = "idna" -version = "0.5.0" +name = "itoa" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] -name = "indexmap" -version = "2.1.0" +name = "js-sys" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ - "equivalent", - "hashbrown", + "wasm-bindgen", ] -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + [[package]] name = "log" version = "0.4.20" @@ -428,6 +279,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "proc-macro2" version = "1.0.67" @@ -446,6 +303,36 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "regex" version = "1.9.5" @@ -614,21 +501,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.36.0" @@ -712,11 +584,7 @@ version = "0.1.0" dependencies = [ "Inflector", "chrono", - "http", "lazy_static", - "opentelemetry", - "opentelemetry-stdout", - "opentelemetry_sdk", "rand", "serde", "serde_json", @@ -726,7 +594,6 @@ dependencies = [ "tracing", "tracing-core", "tracing-subscriber", - "url", "uuid", "valuable", "valuable-serde", @@ -755,32 +622,6 @@ version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "uuid" version = "1.7.0" @@ -820,6 +661,66 @@ dependencies = [ "valuable", ] +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.37", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" + [[package]] name = "winapi" version = "0.3.9" @@ -841,3 +742,69 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" From 619c50e1dc256a74d44ba0d871c9ab4baa054a98 Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Thu, 15 Feb 2024 18:26:06 -0300 Subject: [PATCH 08/10] addressed review topics + removed .expect() --- src/event_formatter.rs | 42 +++++++++++++++++++----------------------- src/serializers.rs | 3 ++- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/src/event_formatter.rs b/src/event_formatter.rs index bcde50b..027f6cc 100644 --- a/src/event_formatter.rs +++ b/src/event_formatter.rs @@ -82,35 +82,31 @@ impl EventFormatter { } } - // serialize the current span and its leaves + // serialize the current span // and its leaves if let Some(span) = span { map.serialize_entry("span", &SerializableSpan::new(&span))?; // map.serialize_entry("spans", &SerializableContext::new(context))?; TODO: remove } - //map.serialize_entry("spans", &SerializableContext::new(context))?; - let mut trace_id = TraceIdVisitor::new(); - if trace_id.trace_id.is_none() { - context - .visit_spans(|span| { - for field in span.fields() { - if field.name() == "trace_id" { - let extensions = span.extensions(); - if let Some(json_fields) = extensions - .get::>() { - json_fields.record(&field, &mut trace_id); - } - } + let mut trace_id = TraceIdVisitor::new(); + context + .visit_spans(|span| { + for field in span.fields() { + if field.name() == "trace_id" { + let extensions = span.extensions(); + if let Some(json_fields) = extensions + .get::>() { + json_fields.record(&field, &mut trace_id); } - Ok::<(), Box>(()) - }) - .expect("ERROR visiting_spans"); - } + } + } + Ok::<(), Error>(()) + })?; - if let Some(trace_id) = trace_id.trace_id { - map.serialize_entry("traceId", &trace_id)?; - } + if let Some(trace_id) = trace_id.trace_id { + map.serialize_entry("traceId", &trace_id)?; + } // TODO: obtain and serialize trace_id here. // if let Some(trace_id) = trace_id { diff --git a/src/serializers.rs b/src/serializers.rs index f32aa38..bebd33e 100644 --- a/src/serializers.rs +++ b/src/serializers.rs @@ -37,7 +37,8 @@ where let span_length = formatted_fields.fields.len() + 1; let mut map = serializer.serialize_map(Some(span_length))?; - match serde_json::from_str::(formatted_fields) { // TODO: this seems weird + match serde_json::from_str::(formatted_fields) { + // TODO: this seems weird // handle string escaping "properly" (this should be fixed upstream) // https://github.com/tokio-rs/tracing/issues/391 Ok(Value::Object(fields)) => { From 5e95027dc612f8a84f27098cfd44e0d1bbca1ee3 Mon Sep 17 00:00:00 2001 From: Gabriel Bastos Date: Fri, 16 Feb 2024 17:29:31 -0300 Subject: [PATCH 09/10] Remove unused deps --- Cargo.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 9d440d7..175151a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,8 +33,5 @@ valuable-serde = { version = "0.1.0", optional = true } [dev-dependencies] tracing = "0.1.34" time = { version = "0.3.30", features = ["serde", "serde-well-known", "formatting"] } -lazy_static = "1.4.0" -rand = "0.8.5" uuid = { version = "1.7.0", features = ["v4"] } -chrono = "0.4.31" tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros"] } From 28cdb579604dc691d24298a5ecf67530b0c50de5 Mon Sep 17 00:00:00 2001 From: Luiz Silveira Date: Wed, 21 Feb 2024 12:34:00 -0300 Subject: [PATCH 10/10] addressed bug: adding new fields was breaking the extraction of the 'trace_id' field. --- Cargo.lock | 247 ----------------------------------- examples/demo_full_fields.rs | 4 +- src/event_formatter.rs | 11 +- 3 files changed, 4 insertions(+), 258 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5bb4a5e..6aa6d3c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,27 +36,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - [[package]] name = "backtrace" version = "0.3.69" @@ -72,12 +51,6 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - [[package]] name = "cc" version = "1.0.83" @@ -93,26 +66,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "wasm-bindgen", - "windows-targets", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - [[package]] name = "deranged" version = "0.3.10" @@ -146,44 +99,12 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" -[[package]] -name = "iana-time-zone" -version = "0.1.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "itoa" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" -[[package]] -name = "js-sys" -version = "0.3.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" -dependencies = [ - "wasm-bindgen", -] - [[package]] name = "lazy_static" version = "1.4.0" @@ -227,15 +148,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", -] - [[package]] name = "num_cpus" version = "1.16.0" @@ -279,12 +191,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "proc-macro2" version = "1.0.67" @@ -303,36 +209,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - [[package]] name = "regex" version = "1.9.5" @@ -583,9 +459,6 @@ name = "tracing-stackdriver-cw" version = "0.1.0" dependencies = [ "Inflector", - "chrono", - "lazy_static", - "rand", "serde", "serde_json", "thiserror", @@ -667,60 +540,6 @@ version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" -[[package]] -name = "wasm-bindgen" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.37", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.91" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" - [[package]] name = "winapi" version = "0.3.9" @@ -742,69 +561,3 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/examples/demo_full_fields.rs b/examples/demo_full_fields.rs index 6bc74bc..4e53f29 100644 --- a/examples/demo_full_fields.rs +++ b/examples/demo_full_fields.rs @@ -23,7 +23,7 @@ fn sync_endpoint_function() { // the following 2 variables must only be dropped at the end of the function, // or else `traceId` won't be tracked correctly, as it is controlled by the // opened "spans" on each thread. - let span = trace_span!("sync_endpoint_function", trace_id = %trace_id); + let span = trace_span!("sync_endpoint_function", trace_id = %trace_id, test="\"trace_id\":\"yeah, yeah\""); let _enter = span.enter(); info!(trace_id = %trace_id, "This is the SYNC endpoint function"); @@ -49,7 +49,7 @@ async fn async_endpoint_function() { // the following 2 variables must only be dropped at the end of the function, // or else `traceId` won't be tracked correctly, as it is controlled by the // opened "spans" on each thread. - let span = trace_span!("async_endpoint_function", trace_id = %trace_id); + let span = trace_span!("async_endpoint_function", trace_id = %trace_id, test=1); let _enter = span.enter(); info!(trace_id = %trace_id, "This is the SYNC endpoint function"); diff --git a/src/event_formatter.rs b/src/event_formatter.rs index 027f6cc..8ee8b75 100644 --- a/src/event_formatter.rs +++ b/src/event_formatter.rs @@ -108,14 +108,6 @@ impl EventFormatter { map.serialize_entry("traceId", &trace_id)?; } - // TODO: obtain and serialize trace_id here. - // if let Some(trace_id) = trace_id { - // map.serialize_entry( - // "logging.googleapis.com/trace", - // &format!("projects/{project_id}/traces/{trace_id}",), - // )?; - // } - // serialize the stackdriver-specific fields with a visitor let mut visitor = Visitor::new(severity, map); event.record(&mut visitor); @@ -140,8 +132,9 @@ impl Visit for TraceIdVisitor { // `trace_id` can be a json serialized string // -- if so, we unpack it let value = value - .split(':') + .split("\"trace_id\":") .skip(1) + .filter(|quoted| quoted.len() >= 2) .map(|quoted| "ed[1..quoted.len() - 2]) .find(|_| true) .unwrap_or(value);