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

Java Flight Recorder-如何提取自定义事件字段的值?,java,field,custom-events,openjdk-11,jfr,Java,Field,Custom Events,Openjdk 11,Jfr,Java Flight Recorder现在是OpenJDK 11的一部分,提供自定义事件的使用。 成功录制后,我希望重用事件中的信息(特别是我自己的自定义事件),但不知何故,我无法读取事件的字段内容。 我只能看到注释、字段的名称和类型 有人知道这是否真的可能吗 JFR有一个允许您从文件中读取信息的。我已经应用了一些函数 我已经尝试过的 首先,我访问事件的所有字段: event.getFields(); 然后我迭代这些字段,并以几种不同的方式访问它们的值: a) eventField.getD

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

有人知道这是否真的可能吗

JFR有一个允许您从文件中读取信息的。我已经应用了一些函数

我已经尝试过的

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

event.getFields();
然后我迭代这些字段,并以几种不同的方式访问它们的值:

a) eventField.getDescriptor();
b) eventField.getContentType();
只要看看他们的名字,显然没有人会告诉我内容。不幸的是,我找不到任何有帮助的函数

我也尝试过的

我还尝试了一个非常直截了当的想法:在debug modus中阅读内容。我想这会让我对如何通过编程提取这些信息有一些见解

不幸的是,JFR设法以某种方式对其记录进行编码,即在调试过程中,只有通过编程将其提取并将其作为局部变量(例如:映射)时,才能读取信息


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

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

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();
  }
}
公共类示例{
公共静态void main(字符串[]args)引发IOException{
如果(args.length!=1){
System.err.println(“必须指定记录文件”);
返回;
}
List events=RecordingFile.readAllEvents(Path.of(args[0]);
for(RecordedEvent事件:事件){
EventType EventType=event.getEventType();
String name=eventType.getName();
即时启动=event.getStartTime();
Instant end=event.getEndTime();
System.out.println(name+“”+start+“”-“”+end);
对于(ValueDescriptor字段:eventType.getFields()){
字符串fieldName=field.getName();
对象值=event.getValue(fieldName);
System.out.println(字段名+“=”+值);
}
System.out.println();
}
}

如果您想找到JFR所有方面的示例代码,可以查看OpenJDK项目中的。例如,测试a

为什么使用eventType而不是事件本身?event.getValue(fieldName)对事件有效,但我需要知道字段的名称,所以我使用EventType和ValueDescriptor。如果您已经知道字段的名称和类型,可以执行类似event.getLong(“foo”)的操作.我们可以提取性能缺陷的来源,但如果你这样做,结果是非常详细的-一些直接来自java的函数,如IO。你知道如何在我们实际测试的软件中获取来源吗?例如,如果我们有一个IO操作导致麻烦,我想作为结果在我的程序中获取行,其中O操作是被调用的。您不能遍历堆栈跟踪并查找存在属于您程序的类或包的方法的帧吗?