use std::fmt::Display;
use std::sync::OnceLock;
use std::time::Instant;
static TRACE_EPOCH: OnceLock<Instant> = OnceLock::new();
pub fn trace_epoch() -> Instant {
*TRACE_EPOCH.get_or_init(Instant::now)
}
pub fn now_us() -> u64 {
Instant::now().duration_since(trace_epoch()).as_micros() as u64
}
pub fn thread_id() -> u64 {
let thread_id = std::thread::current().id();
let debug_str = format!("{:?}", thread_id);
debug_str
.strip_prefix("ThreadId(")
.and_then(|s| s.strip_suffix(")"))
.and_then(|s| s.parse().ok())
.unwrap_or(0)
}
pub fn command_completed(
context: Option<&str>,
cmd: &str,
ts: u64,
tid: u64,
dur_us: u64,
ok: bool,
) {
match context {
Some(ctx) => log::debug!(
r#"[wt-trace] ts={} tid={} context={} cmd="{}" dur_us={} ok={}"#,
ts,
tid,
ctx,
cmd,
dur_us,
ok
),
None => log::debug!(
r#"[wt-trace] ts={} tid={} cmd="{}" dur_us={} ok={}"#,
ts,
tid,
cmd,
dur_us,
ok
),
}
}
pub fn command_errored(
context: Option<&str>,
cmd: &str,
ts: u64,
tid: u64,
dur_us: u64,
err: impl Display,
) {
match context {
Some(ctx) => log::debug!(
r#"[wt-trace] ts={} tid={} context={} cmd="{}" dur_us={} err="{}""#,
ts,
tid,
ctx,
cmd,
dur_us,
err
),
None => log::debug!(
r#"[wt-trace] ts={} tid={} cmd="{}" dur_us={} err="{}""#,
ts,
tid,
cmd,
dur_us,
err
),
}
}
pub fn instant(event: &str) {
log::debug!(
r#"[wt-trace] ts={} tid={} event="{}""#,
now_us(),
thread_id(),
event
);
}