#java #文件格式 #jfr

jfrs

Java Flight Recorder的Rust读取器

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 解析器实现

Download history 4/week @ 2024-03-10 57/week @ 2024-03-31

每月51次下载

Apache-2.0

75KB
2K SLoC

jfrs

CI Crate

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