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

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

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

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

То, что я уже пробовал

Сначала я обращаюсь ко всем полям события:

event.getFields();

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

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

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

То, что я также пробовал

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

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

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

1 Ответ

1 голос
/ 12 июля 2020

Вот короткая программа, которая иллюстрирует, как вы можете получить значения

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

...