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的测试