///|
pub(all) struct Span {
name : String
fields : Array[(String, String)]
start_seq : Int
}
///|
pub fn Span::enter(
logger : Logger,
name : String,
fields : Array[(String, String)],
) -> (Logger, Span) {
let l2 = logger.info("-> " + name, fields)
let span = Span::{ name, fields, start_seq: l2.seq }
(l2, span)
}
///|
pub fn Span::exit(self : Span, logger : Logger) -> Logger {
let elapsed = logger.seq - self.start_seq
let exit_fields : Array[(String, String)] = []
for i = 0; i < self.fields.length(); i = i + 1 {
exit_fields.push(self.fields[i])
}
exit_fields.push(("duration", elapsed.to_string() + "ticks"))
logger.info("<- " + self.name, exit_fields)
}