如何在多个线程上跟踪JFR事件

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (8)

我正在努力用自定义JFR事件建模异步servlet请求处理。我面临的挑战是,在异步处理中,请求可能会#dispatch()多次发生。这意味着整个请求处理链可以多次执行,在不同的线程中相隔一段时间。如何使用自定义JFR事件对此进行建模?

对我有帮助的是“父”事件的概念(可能在不同的线程中)或事件的暂停和恢复。

编辑

为了说明这个问题。异步请求可能需要100秒的挂钟时间来处理。但是,实际处理可能在一个Servlet#service()方法中仅在4秒的用户时间内发生:

  • 在线程A中第二个0-1,Servlet#service()方法返回,AsyncContext开始
  • 在线程B中第二个10-11,Servlet#service()方法返回,AsyncContext开始
  • 在线程A中第二个80-81,Servlet#service()方法返回,AsyncContext开始
  • 在线程C中第二个99-100,Servlet#service()方法返回

我只对在这三个线程中为这四个持续时间生成事件然后将它们与单个请求相关联感兴趣。

提问于
用户回答回答于

您可以向事件添加线程字段

public class MyEvent extends Event [
  @Label("Start Thread")
  @TranistionFrom
  private final Thread startThread;
  MyEvent(Thread thread) {
    this.startThread = thread;
  }
]

提交事件时,将存储结束线程。

如果要跟踪多个线程上的事件,则需要为每个线程创建一个事件并拥有一个id,以便您可以了解该流程。

class MyEvent extends Event {

  @Label("Transition id");
  long id;
}

如果你愿意,可以创建一个关系id来描述关系,JMC应该能够暗示事件之间存在关系。

@Label("Transition Id")
@Relational
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@interface TransitionId {
}

如果您不想重复自己,可以在基类中的方法中编写上述功能,您可以为事件访问的每个新线程调用它。

 abstract AbstractTransition extends Event {

   @TransitionId
   @Label("Transition Id")
   private long id;
   public void setTransitionId(long id) {
     this.id = id;
   }
 }

没有其他办法可以做到这一点。

JVM不可能知道事件对象在哪个线程中,或者应该记录哪些线程。用户需要为每个应该触摸的线程(以及一些上下文)提供至少一个方法调用。

用户回答回答于

扫码关注云+社区

领取腾讯云代金券