如何配置自定义 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();
});
我正在实施一个自定义 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();
});