Graham Dumpleton:带包裹的实时追踪 笔记

Graham Dumpleton:带包裹的实时追踪

Wrapture 绑定最初用于单元测试,也可作为强大的追踪机制。绑定会观察方法调用并触发事件,这些事件随后由“接收器”(sink)处理,而非测试磁带。这使得对运行中的程序进行实时叙述成为可能。本文通过一个 OrderService 示例加以说明,其中包含 Gateway、Ledger 和 Notifier 组件,支持信用卡支付被拒绝的场景。三个绑定被应用于关键方法:OrderService.place、Gateway.charge 和 Ledger.record。一个简单的 Printer 接收器用于显示这些事件。输出展示了详细的调用信息,包括参数、返回值和异常,缩进表示调用嵌套层级。关键的是,敏感数据(如卡号)可在绑定级别使用 wrapture.redact() 捕获策略进行脱敏。当未注册任何接收器时,绑定的开销极小,每次调用约增加半个微秒。为管理大型追踪数据,可在接收器或绑定级别应用过滤。接收器级别的过滤,如 wrapture.Depth(1, wrapture.Printer()),将输出限制为顶层调用,提供简洁的概览。绑定级别的过滤使用 when= 参数,接受一个谓词以防止特定调用构建事件,效率极高。然而,when= 仅跳过指定的事件;嵌套调用仍会被记录。若要抑制整个调用树,可在绑定中添加 tree=True,确保“从此处向下”不再进行追踪。绑定还会跟踪 filtered_calls,使用户能够了解哪些操作已被抑制。此配置使程序能够以实时数据自我描述其行为,仅需极少的代码更改,并支持为各种监控需求定制接收器。