首页 > IT职业 > IT生活 > 新特性jfr streaming
java14提供了jfr streaming的特性。这个算是带来了非常大的体验变化的。
在11的时候,jfr已经在openjdk中了,目前已经backport到8的版本。下面简单介绍一下jfr的为什么这么重要,以至于从11专门做backport到8。
上面讲了jfr的这么多好处,那这个新特性的优势是什么呢。
jfr streaming解决了上面的问题。他提供了api的方式,可以消费我们关注的指标数据。程序拿到指标数据后,就可以做很多操作,例如暴露让别的程序抓取,或者是直接socket传输走。
这样在用很低的功耗获取到特别多的数据。
因为这是jdk14的特性。所以必须切换为jdk14。
import jdk.jfr.Configuration;
import jdk.jfr.consumer.RecordingStream;
import java.io.IOException;
import java.text.ParseException;
public class JfrStream {
public static void main(String[] args) throws IOException, ParseException {
Configuration config = Configuration.getConfiguration("default");
try (var es = new RecordingStream(config)) {
es.onEvent("jdk.CPULoad", System.out::println);
es.onEvent("jdk.ThreadDump",System.out::println);
es.start();
}
}
}
code是比较简单的,想要运行获取到数据,这里就必须开启jfr功能。
-XX:StartFlightRecording
code是比较简单的,我们只要关注event就好,这里的event都可以在配置文件中获取。
这里只是简单的输出了一下。后面传递的是一个consumer
Consumer<RecordedEvent> action
后面就可以再这里进行一些需要特定话的操作。
自定义事件是Java11的特性。
@Label("myevent")
@Description("Helps the programmer getting started")
public class CustomEvent extends Event {
@Label("Message")
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
public static void main(String[] args) throws IOException, ParseException {
new Thread(() -> {
while (true) {
CustomEvent customEvent = new CustomEvent();
customEvent.begin();
customEvent.setMessage("first");
customEvent.end();
customEvent.commit();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
Configuration config = Configuration.getConfiguration("default");
try (var es = new RecordingStream(config)) {
es.onEvent("com.xp.log.CustomEvent", System.out::println);
es.start();
}
}
现在如果想做一个apm系统暴露指标,会特别容易。只要自定义事件,写好消费者,就可以获取一个低消耗的采集能力。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/866/viewspace-2826136/ ,如需转载,请注明出处,否则将追究法律责任。