
Log.pudu
Pudu43 lines2.1 KB
1/** @Telemetry.Log.Module — events written as single text lines */2module PuduLangResilience.Telemetry.Log34import PuduLangResilience.Telemetry as Telemetry567export fn listener(least: Telemetry.Severity, write: fn(Str) -> ()) -> Telemetry.Listener {8 fn(event: Telemetry.Event) -> () {9 if Telemetry.rank(&event.severity) >= Telemetry.rank(&least) { write(format(&event)) }10 }11}121314export fn format(event: &Telemetry.Event) -> Str {15 let operation = match event.operationKey { case Some(key) => " operation=" + key case None => "" }16 let outcome = match event.outcome { case Some(text) => " outcome=" + text case None => "" }17 let detail = describe(&event.detail)18 let measured = if detail.isEmpty() { "" } else { " " + detail }19 "[" + Telemetry.severityName(&event.severity) + "] " + event.name + " source=" + Telemetry.sourceName(&event.source) + operation + measured + outcome20}212223fn describe(detail: &Telemetry.Detail) -> Str {24 match detail {25 case Telemetry.Executing => ""26 case Telemetry.Executed(duration) => "duration=" + show(duration)27 case Telemetry.Attempted(number, duration, handled) => "attempt=" + show(number) + " duration=" + show(duration) + " handled=" + show(handled)28 case Telemetry.Retrying(number, delay) => "attempt=" + show(number) + " delay=" + show(delay)29 case Telemetry.Opened(duration, manual) => "break=" + show(duration) + " manual=" + show(manual)30 case Telemetry.Closed(manual) => "manual=" + show(manual)31 case Telemetry.HalfOpened => ""32 case Telemetry.FellBack => ""33 case Telemetry.Hedged(number) => "attempt=" + show(number)34 case Telemetry.TimeoutElapsed(timeout) => "timeout=" + show(timeout)35 case Telemetry.Rejected(Some(after)) => "retryAfter=" + show(after)36 case Telemetry.Rejected(None) => ""37 case Telemetry.FaultInjected => ""38 case Telemetry.OutcomeInjected => ""39 case Telemetry.LatencyInjected(latency) => "latency=" + show(latency)40 case Telemetry.BehaviorInjected => ""41 }42}43