【问题标题】:Java Flight Recorder - how to extract the values of a custom event field?Java Flight Recorder - 如何提取自定义事件字段的值?
【发布时间】:2020-10-31 00:52:12
【问题描述】:

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

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

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

我已经尝试过的

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

event.getFields();

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

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

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

我也试过了

我还尝试了一个非常直接的想法:以调试方式阅读内容。我认为它可以让我深入了解如何以编程方式提取这些信息。

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

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

【问题讨论】:

    标签: java field custom-events openjdk-11 jfr


    【解决方案1】:

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

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

    【讨论】:

    • 为什么你使用 eventType 而不是事件本身?
    • event.getValue(fieldName) 对事件起作用,但我需要知道字段的名称,所以我使用 EventType 和 ValueDescriptor。如果您已经知道字段的名称和类型,则可以执行 event.getLong("foo") 之类的操作。
    • 可以提取性能缺陷的根源,但如果这样做,结果是非常详细的——直接来自java的一些函数,比如IO。你知道如何获取我们实际测试的软件的来源吗?例如,如果我们有一个导致麻烦的 IO 操作,我想得到 MY 程序中调用此 IO 操作的行。
    • 您不能遍历堆栈跟踪并查找存在属于您程序的类或包的方法的框架吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多