Java Flight Recorder - как извлечь значения из настраиваемого поля события?

Java Flight Recorder теперь является частью OpenJDK 11 и предлагает использование пользовательских событий. После успешной записи я хочу повторно использовать информацию в событиях (особенно мои собственные пользовательские события), но почему-то не могу прочитать содержимое поля события. Я могу видеть только аннотации, название и тип полей.

Кто-нибудь знает, возможно ли это на самом деле?

JFR имеет потребительский пакет, который позволяет читать информацию из файлов. Некоторые функции я уже применяю.

Что я уже пробовал

Сначала я получаю доступ ко всем полям события:

event.getFields();

Затем я перебираю поля и получаю доступ к их значениям несколькими способами:

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

Просто глядя на их имена, очевидно, что никто из них не дал мне содержания. К сожалению, мне не удалось найти ни одной функции, которая могла бы помочь.

Что я тоже пробовал

Я также попробовал очень прямую идею: прочитать содержимое в режиме отладки. Я думал, что это даст мне некоторое представление о том, как программно извлекать эту информацию.

К сожалению, JFR удалось закодировать свои записи таким образом, что во время процедуры отладки никто не может прочитать информацию, пока кто-нибудь не извлечет их программно и не получит в качестве локальной переменной (пример: карта).

Для вашей информации я использовал эту инструкцию по реализации настраиваемого события.


person Matécsa Andrea    schedule 10.07.2020    source источник


Ответы (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. Например, тест RecordedEvent

person Kire Haglin    schedule 12.07.2020
comment
почему вы работаете с eventType, а не с самим событием? - person Matécsa Andrea; 13.07.2020
comment
event.getValue (fieldName) работает против события, но мне нужно знать имена полей, поэтому я использую EventType и ValueDescriptor. Если вы уже знаете имя поля и тип, вы можете сделать что-то вроде event.getLong (foo). - person Kire Haglin; 13.07.2020
comment
Можно извлечь причину дефицита производительности, но если вы это сделаете, результат будет очень подробным - некоторая функция прямо из java, например IO. Вы знаете, как найти источник в программном обеспечении, которое мы на самом деле тестируем? Например, если у нас есть операция ввода-вывода, которая вызывает проблемы, я хочу получить в результате строку в МОЕЙ программе, где вызывается эта операция ввода-вывода. - person Matécsa Andrea; 12.08.2020
comment
Разве вы не можете пройти трассировку стека и найти фрейм, в котором есть метод, принадлежащий классу или пакету вашей программы? - person Kire Haglin; 13.08.2020