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

2019年1月21日 33点热度 0条评论

Java Flight Recorder现在是OpenJDK 11的一部分,并提供了自定义事件的用法。
成功记录后,我想重用事件(尤其是我自己的自定义事件)中的信息,但是以某种方式我无法读取事件的字段内容。
我只能看到注释,字段的名称和类型。
有人知道这是否真的可能吗?
JFR有一个consumer package,它使您可以从文件中读取信息。我已经应用了某些功能。
我已经尝试过的
首先,我访问事件的所有字段:

event.getFields();

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

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

只看他们的名字,显然他们都不给我内容。不幸的是,我找不到任何有帮助的功能。


我也尝试过的

我还尝试了一个非常简单的想法:以调试方式读取内容。我认为这将为我提供一些有关如何以编程方式提取这些信息的见识。

不幸的是,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各个方面的示例代码,可以在OpenJDK项目中的
test folder 中查找。例如,对
RecordedEvent的测试