用于在运行时检测python代码的库。
diagnose的Python项目详细描述
诊断
用于在运行时检测python代码的库。
探头
结构化日志、度量和可观察性都很好,但几乎总是 要求您更改代码,这会在读取代码时中断流。 它通常还需要一个构建周期来改变;制作一张罚单没有任何乐趣, 进行检查,等待构建和部署,然后再次执行所有操作 以支持你的临时添加。做研究的时候这是双重事实, 在这里,您可以执行十几个小实验来测量您的实时代码。
这个库允许您在运行时动态添加探测。 探头为:
- 可靠:错误永远不会影响生产代码
- 短暂:为每种乐器设置一个“寿命”(分钟)
- 全面:对目标函数的所有引用都已插入指令
- 快速:通过快速的局部查找来测量大多数功能;使用hunter(在cython中)进行更具侵入性的内部探针。
通过调用attach_to(target)
:
>>> from path.to.module import myclass >>> myclass().add13(arg=5) 18 >>> p = diagnose.probes.attach_to("path.to.module.myclass.add13") >>> p.instruments["foo"] = diagnose.LogInstrument("foo", "arg") >>> p.start() >>> myclass().add13(arg=5) Probe (foo) = 5 18
仪器不仅限于录音设备!使用探测器触发任何类型的事件处理程序。工具可以自由地维护自己的状态,或者从其他地方读取状态,以控制自己的行为,甚至实现反馈机制。一个真正邪恶的工具甚至可以动态地改变传递给函数的args/kwargs,或者调用任意的python代码来做任何疯狂的事情。因此,由您来控制哪些工具被添加到您的环境中。
经理
在正在运行的系统中,我们希望添加、删除、启动和停止探测器和仪器,而不必在交互提示下编写代码或重新启动系统;我们使用InstrumentManager来完成此操作。从配置全局诊断开始。管理器:
>>> diagnose.manager.instrument_classes = { "log": LogInstrument, "hist": MyHistogramInstrument, "incr": MyIncrementInstrument, } >>> diagnose.manager.global_namespace.update({"foo": foo})
稍后,您可以定义仪器:
>>> diagnose.manager.specs["instr-1"] = { "target": "myapp.module.file.class.method", "instrument": { "type": "log", "name": "myapp.method", "value": "result", "event": "return", "custom": {}, }, "lifespan": 10, "lastmodified": datetime.datetime.utcnow(), "applied": {}, }
然后在添加工具时调用diagnose.manager.apply()
,如果存储在mongodb中,并且进程定义探测不是目标进程,则按计划调用diagnose.manager.apply()
。
applied
字典将填充有关哪些进程的信息
已应用探测器,以及是否遇到任何错误。