Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-resilience

Resilience pipelines for Pudu: retry, circuit breaker, timeout, fallback, hedging, rate limiting, and chaos injection

0.1.0Apache-2.01

InstallClose

ChaosTesting.pudu

Pudu33 lines1.4 KB

GitHub ↗
1/** @Examples.ChaosTesting.Program — injected faults exercising a retry */2module ChaosTesting34import Std.Io as Io5import PuduLangResilience.Chaos as Chaos6import PuduLangResilience.Chaos.Fault as Fault7import PuduLangResilience.Context as Context8import PuduLangResilience.Pipeline as Pipeline9import PuduLangResilience.Randomizer as Randomizer10import PuduLangResilience as Resilience11import PuduLangResilience.Retry as Retry12import PuduLangResilience.Telemetry.Log as Log13import PuduLangResilience.Telemetry as Telemetry1415/// Injects a fault into half of all calls and lets a retry absorb it, logging every warning.16fn main() -> Int {17  let settings = Pipeline.Options{..Pipeline.defaults(), name: Some("chaos-demo"), randomizer: Randomizer.seeded(7), listeners: [Log.listener(Telemetry.Warning, fn(line: Str) -> () { let _w = Io.writeLine(line) })]}18  let built = Pipeline.buildWith(&settings, [19      Retry.strategy(Retry.Options{..Retry.defaults(), maxRetryAttempts: 10, delay: 1}),20      Fault.strategy(Fault.injecting(Resilience.Raised("injected fault"), Chaos.atRate(0.5d)))21    ])22  let pipeline = match built {23    case Ok(found) => found24    case Err(invalid) => {25      let _said = Io.writeErrorLine(Pipeline.explain(&invalid))26      return 127    }28  }29  let outcome = Pipeline.execute(&pipeline, fn(_context: Context.Context) -> Resilience.Outcome[Str, Str] { Ok("done") })30  let _shown = Io.writeLine("outcome: " + Resilience.summarize(&outcome))31  if outcome == Ok("done") { 0 } else { 1 }32}33