Java Flight Recorder - 如何提取自定义事件字段的值?

Java Flight Recorder - how to extract the values of a custom event field?

Java Flight Recorder 现在是 OpenJDK 11 的一部分,并提供自定义事件的使用。 录制成功后,我想重用事件中的信息(尤其是我自己的自定义事件),但不知怎么的,我无法读取事件的字段内容。 我只能看到字段的注释、名称和类型。

有人知道这是否真的可行吗?

JFR 有一个 consumer package 允许您从文件中读取信息。我已经应用了一些功能。

我已经尝试过的

首先,我访问事件的所有字段:

event.getFields();

然后我遍历字段并以几种不同的方式访问它们的值:

a) eventField.getDescriptor();
b) eventField.getContentType();

光看他们的名字,显然 none 会给我内容。不幸的是,我找不到任何可以提供帮助的功能。

我也试过了

我也尝试了一个很直接的想法:在debug模式下阅读内容。我认为它会为我提供一些关于如何以编程方式提取这些信息的见解。

不幸的是,JFR 设法以某种方式对他们的录音进行编码,在调试过程中,人们无法读取信息,直到有人以编程方式提取并拥有它作为局部变量(例如:地图)。

供您参考,我一直在使用 this 指令来实现自定义事件。

这是一个简短的程序,说明了如何获取值

public class Example {
  public static void main(String[] args) throws IOException {
  if (args.length != 1) {
    System.err.println("Must specify a recording file.");
    return;
  }

  List<RecordedEvent> events = RecordingFile.readAllEvents(Path.of(args[0]));
  for (RecordedEvent event : events) {
    EventType eventType = event.getEventType();
    String name = eventType.getName();
    Instant start = event.getStartTime();
    Instant end = event.getEndTime();
    System.out.println(name + " " + start + " - " + end);
    for (ValueDescriptor field : eventType.getFields()) {
      String fieldName = field.getName();
      Object value = event.getValue(fieldName);
      System.out.println(fieldName + " = " + value);
    }
    System.out.println();
  }
}

如果您想找到 JFR 各方面的示例代码,可以查看 test folder in the OpenJDK project. For example, the test of a RecordedEvent