如何配置自定义 JFR 事件的间隔

How to configure the interval of a custom JFR event

我正在实施一个自定义 JFR 事件,该事件以特定时间间隔对计数器进行采样。如果可以像内置事件一样在 .jfc 配置文件中配置此事件和间隔,那就太棒了。为此,我需要以编程方式访问配置值。通过 EventFactory 如果可以访问 SettingDescriptor 但这只给我默认值,而不是当前值。

我看过 jdk.jfr.internal.settings.PeriodSetting 但这是内部 class。

可以在 .jfc 文件中配置自定义事件。

<event name="Foo">
  <setting name="enabled">true</setting>
  <setting name="period">5 s</setting>
</event>

或以编程方式使用地图:

 Recording r = new Recording();
 Map<String, String> settings = new HashMap<>();
 settings.put("Foo#enabled", "true");
 settings.put("Foo#period", "5 s");
 r.setSettings(settings);
 r.start();

或使用流利的API:

 r.enable("Foo").withPeriod(Duration.ofSeconds(5));

事件发出的时间由框架决定:

FlightRecorder.addPeriodicEvent(Foo.class, ()-> {
  Foo foo = new Foo();
  foo.bar = Sampler.sample();
  foo.commit();
});

如果事件的字段布局在编译时是未知的,所以你必须使用EventFactory,你可以这样做:

  final EventFactory factory = ...
  Event event = factory.newEvent();
  Class<Event> eventClass = event.getClass();
  FlightRecorder.addPeriodicEvent(eventClass, ()-> {
    Event foo = factory.newEvent();
    foo.set(0, Sampler.sample());
    foo.commit();
  });