【问题标题】:Using Timer for batch operations使用 Timer 进行批处理操作
【发布时间】:2019-04-18 21:28:06
【问题描述】:

我是使用 Micrometer 的新手,我正在尝试查看是否有一种方法可以使用计时器,该计时器还包括批处理场景中项目数量的计数。由于我正在使用 Java 流处理批处理,因此我没有看到一种明显的方法来记录每个处理的项目的计时器,因此我正在寻找一种设置批处理大小属性的方法。我认为可行的一种方法是使用来自 https://micrometer.io/docs/concepts#_function_tracking_timers 的 FunctionTimer,但我认为这需要应用程序为总计数和总时间维持一组持续单调递增的值。

有没有更简单的方法可以做到这一点?最终,这些数据将被提供给 New Relic。我也尝试为批量大小设置标签,但这些标签似乎被报告为字符串,所以我无法对这些值进行任何类型的聚合。

谢谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow!你能否澄清一下你是否打算计算整个批次需要多长时间?或者批次中的单个元素需要多长时间?
  • @checketts 我认为任何一种方式都可以工作,因为我们目前将千分尺设置为每 30 秒报告一次。由于我使用 Java Streams 进行处理,因此我没有看到一个计时单个处理的好方法。谢谢。

标签: micrometer spring-micrometer


【解决方案1】:

计时器用于测量动作,至少会产生两种测量结果:计数和持续时间。

因此,计时器将非常适合您的批处理。在 java 流中,peek 操作可能是放置计时器的好地方。

如果您要处理 20 个元素并且您只是测量所有 20 个元素的时间,则需要创建一个新的Counter 来测量批量大小。您可以将计时器的总持续时间与您的计数器相除以获得每个项目的持续时间,或者将其与计时器的总计数相除以获得每批次的持续时间。

如果您需要反馈,请随时添加代码 sn-ps。

【讨论】:

  • 谢谢。对于使用peek,您能否澄清一下您如何看待与计时器一起使用?我不清楚如何测量独立处理流中每个元素的经过时间。我的流处理非常简单,只需进行映射和收集,例如:batch.stream().map(x -> x.doSomething()).map(y -> y.doSomething()).collect(toList()) 对于同时使用计数器和计时器,您建议我们在应用程序代码中执行的操作或收集数据的位置,在此案例新遗物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 2021-10-17
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多