如何在 Java 代码中监控/检查数据/属性流
Posted
技术标签:
【中文标题】如何在 Java 代码中监控/检查数据/属性流【英文标题】:How to Monitor/inspect data/attribute flow in Java code 【发布时间】:2019-07-15 17:13:30 【问题描述】:当我需要捕获从一个 API 到另一个 API 的数据流时,我有一个用例。例如,我的代码使用休眠从数据库读取数据,在数据处理过程中,我将一个POJO
转换为另一个并执行更多处理,然后最终转换为最终结果休眠对象。简而言之,类似于 POJO1
到 POJO2
到 POJO3
。
在 Java 中,有一种方法可以让我推断出 POJO3 的一个属性是从 POJO1 的这个属性生成/转换的。我想看看可以捕获从一个模型到另一个模型的数据流的东西。这个工具可以是编译时的,也可以是运行时的,我都可以。
我正在寻找一种可以与代码并行运行并在每次运行时提供数据沿袭详细信息的工具。
【问题讨论】:
可以放断点,一步一步看数据 我想在服务运行时捕获它,而不是进行调试。简而言之,在执行此逻辑时捕获数据沿袭和数据流。 静态安全分析 (SAST) 工具正是这样做的(但不是作为正常程序执行 AFAIK 的一部分)。您可能想查看他们使用的技术,Veracode 就是一个例子。 【参考方案1】:现在我将称它们为州而不是 Pojos!您有一个开始位置,您可以通过不同的状态迭代和转换模型。最后你有一个最终的终端状态,你想持久化到数据库中
stream(A).map(P1).map(P2).map(P3)....-> set of B
如果您使用称为事件溯源的技术,您可以推断是的。这会是什么样子呢?而不是直接将 A 映射到状态 P1 并将状态 P1 映射到状态 P2 您将排队所有必要且足以将 A 映射到 P1 和 P1 到 P2 等等的操作......如果您想恢复 P1 或 P2 在任何时间,它将只是排队操作的产物。只要您尚未更改数据库状态,您就可以随时快退或快退。 P1,P2,P3 可以作为快照。
通过这种方式,您将能够为该属性重建准确的映射流。你将把你的操作排队的粒度有多细,如果它和属性级别一样细,或者更细粒度,这取决于你。
这是一篇描述事件溯源及其工作原理的好文章:https://kickstarter.engineering/event-sourcing-made-simple-4a2625113224
更新:
我可以想出另外一种技术来捕捉属性变化。您可以对您的 Pojo-s 进行测试,它与 Hibernate 用于增强 Pojos 的技术几乎相同,并且与用于跟踪的技术配置文件相同。然后,您可以捕获并响应 Pojo1、Pojo2、Pojo3 上的每个 setter 调用。不知道我是否会走那条路……
如果https://www.cs.helsinki.fi/u/pohjalai/k05/okk/seminar/Aarniala-instrumenting.pdf,这里有一些关于字节码检测的详细阅读
【讨论】:
【参考方案2】:我想有两个原因,要么代码不是由您开发的,因此您想了解数据流以及将输入转换为输出的组合,或者您的代码的行为方式出乎您的意料。 我认为您需要将所有 pojo、输入和输出的值记录到您以后可以在每次运行时检查的任何地方。 示例:如果您在运行数百次后可能需要一个数据库表,但如果它的一次可能是以适当的形式记录到日志中。然后,您需要自己手动使用这些数据值逐层映射到下一层。我认为代码的可用性很容易。如果您有不同的需求,请。解释一下。
如果您感谢我帮助我的想法和经验的举动,请接受并喜欢。
【讨论】:
【参考方案3】:有“时间旅行调试器”。对于 Java,快速搜索只会发现这一点: Chronon Time Travelling Debugger,请参阅 this screencast 它对您有何帮助。
由于您的转换可能使用 setter 和 getter,这个工具也可能很有趣:Flow
编写您自己的 java 代理来跟踪这可能不是您想要的。您也许可以使用 AspectJ 将一些堆栈跟踪日志记录添加到 getter 和 setter。请参阅here 了解快速介绍。
【讨论】:
以上是关于如何在 Java 代码中监控/检查数据/属性流的主要内容,如果未能解决你的问题,请参考以下文章