11个版本
0.2.5 | 2023年10月18日 |
---|---|
0.2.4 | 2023年9月21日 |
0.2.0 | 2023年8月29日 |
0.1.4 | 2023年1月4日 |
0.1.3 | 2022年9月17日 |
#737 in 解析器实现
每月51次下载
75KB
2K SLoC
jfrs
Java Flight Recorder的Rust读取器
功能
读取事件(低级API)
fn main() {
let mut reader = JfrReader::new(File::open("/path/to/recording.jfr").unwrap());
for (reader, chunk) in reader.chunks().flatten() {
for event in reader.events(&chunk)
.flatten()
.filter(|e| e.class.name() == "jdk.ExecutionSample")
{
let thread_name = event.value()
.get_field("sampledThread")
.and_then(|v| v.get_field("osName"))
.and_then(|v| <&str>::try_from(v.value).ok())
.unwrap();
println!("sampled thread: {}", thread_name);
}
}
}
[实验性] 将事件反序列化为Rust结构体
注意 目前,反序列化性能非常差。有关详情,请参阅tuning_notes.md。
尽管低级API提供了所需的完全功能来解释事件,但通常我们希望将已知的JFR事件映射到Rust结构体。
jfrs
还提供了基于serde-rs
的反序列化功能。
fn main() {
let mut reader = JfrReader::new(File::open("/path/to/recording.jfr").unwrap());
for (mut reader, chunk) in reader.chunks().flatten() {
for event in reader.events(&chunk)
.flatten()
.filter(|e| e.class.name() == "jdk.ExecutionSample")
{
let sample: ExecutionSample = from_event(&event).unwrap();
println!("sampled thread: {}", sample.sampled_thread.and_then(|t| t.os_name).unwrap());
}
}
}
依赖项
~0.4–1MB
~24K SLoC