Compare commits

...

4 Commits

Author SHA1 Message Date
Rasmus Rygaard
6d2b55341b Narrow feedback log shared API to visitors 2026-04-30 14:32:23 -07:00
Rasmus Rygaard
da46b74016 Assert single feedback log formatter 2026-04-30 14:14:10 -07:00
Rasmus Rygaard
4b0d13a8bc Simplify 2026-04-30 14:09:51 -07:00
Rasmus Rygaard
236ab27e11 Add a reusable log formatter 2026-04-30 14:02:44 -07:00

View File

@@ -156,7 +156,7 @@ where
span.extensions_mut().insert(SpanLogContext {
name: span.metadata().name().to_string(),
formatted_fields: format_fields(attrs),
thread_id: visitor.thread_id,
thread_id: visitor.into_thread_id(),
});
}
}
@@ -169,11 +169,12 @@ where
) {
let mut visitor = SpanFieldVisitor::default();
values.record(&mut visitor);
let thread_id = visitor.into_thread_id();
if let Some(span) = ctx.span(id) {
let mut extensions = span.extensions_mut();
if let Some(log_context) = extensions.get_mut::<SpanLogContext>() {
if let Some(thread_id) = visitor.thread_id {
if let Some(thread_id) = thread_id {
log_context.thread_id = Some(thread_id);
}
append_fields(&mut log_context.formatted_fields, values);
@@ -181,7 +182,7 @@ where
extensions.insert(SpanLogContext {
name: span.metadata().name().to_string(),
formatted_fields: format_fields(values),
thread_id: visitor.thread_id,
thread_id,
});
}
}
@@ -191,10 +192,8 @@ where
let metadata = event.metadata();
let mut visitor = MessageVisitor::default();
event.record(&mut visitor);
let thread_id = visitor
.thread_id
.clone()
.or_else(|| event_thread_id(event, &ctx));
let (message, visitor_thread_id) = visitor.into_parts();
let thread_id = visitor_thread_id.or_else(|| event_thread_id(event, &ctx));
let feedback_log_body = format_feedback_log_body(event, &ctx);
let now = SystemTime::now()
@@ -205,7 +204,7 @@ where
ts_nanos: now.subsec_nanos() as i64,
level: metadata.level().as_str().to_string(),
target: metadata.target().to_string(),
message: visitor.message,
message,
feedback_log_body: Some(feedback_log_body),
thread_id,
process_uuid: Some(self.process_uuid.clone()),
@@ -239,12 +238,21 @@ struct SpanLogContext {
thread_id: Option<String>,
}
#[derive(Default)]
struct SpanFieldVisitor {
/// Extracts feedback-log fields from span attributes and span records.
#[derive(Debug, Default)]
pub struct SpanFieldVisitor {
thread_id: Option<String>,
}
impl SpanFieldVisitor {
pub fn thread_id(&self) -> Option<&str> {
self.thread_id.as_deref()
}
pub fn into_thread_id(self) -> Option<String> {
self.thread_id
}
fn record_field(&mut self, field: &Field, value: String) {
if field.name() == "thread_id" && self.thread_id.is_none() {
self.thread_id = Some(value);
@@ -404,13 +412,26 @@ async fn flush(state_db: &StateRuntime, buffer: &mut Vec<LogEntry>) {
let _ = state_db.insert_logs(entries.as_slice()).await;
}
#[derive(Default)]
struct MessageVisitor {
/// Extracts feedback-log fields from event records.
#[derive(Debug, Default)]
pub struct MessageVisitor {
message: Option<String>,
thread_id: Option<String>,
}
impl MessageVisitor {
pub fn message(&self) -> Option<&str> {
self.message.as_deref()
}
pub fn thread_id(&self) -> Option<&str> {
self.thread_id.as_deref()
}
pub fn into_parts(self) -> (Option<String>, Option<String>) {
(self.message, self.thread_id)
}
fn record_field(&mut self, field: &Field, value: String) {
if field.name() == "message" && self.message.is_none() {
self.message = Some(value.clone());