use serde::{Deserialize, Serialize};
use tracing_core::{Level, Metadata};
use core::hash::Hash;
use crate::{
alloc::{Cow, String, Vec},
TracedValues,
};
pub type MetadataId = u64;
pub type RawSpanId = u64;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TracingLevel {
Error,
Warn,
Info,
Debug,
Trace,
}
impl From<Level> for TracingLevel {
fn from(level: Level) -> Self {
match level {
Level::ERROR => Self::Error,
Level::WARN => Self::Warn,
Level::INFO => Self::Info,
Level::DEBUG => Self::Debug,
Level::TRACE => Self::Trace,
}
}
}
#[derive(Debug, Clone, Copy, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CallSiteKind {
Span,
Event,
}
#[derive(Debug, Clone, Hash, Serialize, Deserialize)]
pub struct CallSiteData {
pub kind: CallSiteKind,
pub name: Cow<'static, str>,
pub target: Cow<'static, str>,
pub level: TracingLevel,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub module_path: Option<Cow<'static, str>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file: Option<Cow<'static, str>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub line: Option<u32>,
pub fields: Vec<Cow<'static, str>>,
}
impl From<&Metadata<'static>> for CallSiteData {
fn from(metadata: &Metadata<'static>) -> Self {
let kind = if metadata.is_span() {
CallSiteKind::Span
} else {
debug_assert!(metadata.is_event());
CallSiteKind::Event
};
let fields = metadata
.fields()
.iter()
.map(|field| Cow::Borrowed(field.name()));
Self {
kind,
name: Cow::Borrowed(metadata.name()),
target: Cow::Borrowed(metadata.target()),
level: TracingLevel::from(*metadata.level()),
module_path: metadata.module_path().map(Cow::Borrowed),
file: metadata.file().map(Cow::Borrowed),
line: metadata.line(),
fields: fields.collect(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum TracingEvent {
NewCallSite {
id: MetadataId,
#[serde(flatten)]
data: CallSiteData,
},
NewSpan {
id: RawSpanId,
#[serde(default, skip_serializing_if = "Option::is_none")]
parent_id: Option<RawSpanId>,
metadata_id: MetadataId,
values: TracedValues<String>,
},
FollowsFrom {
id: RawSpanId,
follows_from: RawSpanId,
},
SpanEntered {
id: RawSpanId,
},
SpanExited {
id: RawSpanId,
},
SpanCloned {
id: RawSpanId,
},
SpanDropped {
id: RawSpanId,
},
ValuesRecorded {
id: RawSpanId,
values: TracedValues<String>,
},
NewEvent {
metadata_id: MetadataId,
#[serde(default, skip_serializing_if = "Option::is_none")]
parent: Option<RawSpanId>,
values: TracedValues<String>,
},
}