#perf-event #perf-event-open #perf-events #parser #perf #linux #record

perf-event-data

Types and traits for parsing records emitted by perf_event_open

9 releases

0.1.8 Jan 21, 2025
0.1.7 Jan 18, 2025
0.1.6 May 21, 2024
0.1.4 Oct 24, 2023
0.1.2 May 17, 2023

#89 in Profiling

Download history 72/week @ 2024-11-15 143/week @ 2024-11-22 208/week @ 2024-11-29 185/week @ 2024-12-06 73/week @ 2024-12-13 6/week @ 2024-12-20 21/week @ 2024-12-27 34/week @ 2025-01-03 63/week @ 2025-01-10 358/week @ 2025-01-17 245/week @ 2025-01-24 620/week @ 2025-01-31 553/week @ 2025-02-07 81/week @ 2025-02-14 196/week @ 2025-02-21 447/week @ 2025-02-28

1,436 downloads per month
Used in 3 crates (via perf-event2)

MIT/Apache

175KB
4K SLoC

perf-event-data

ci badge crates.io badge docs.rs badge

Parse data emitted by perf_event_open into usable rust structs.

Getting Started

  • The Record type is an enum with every known record type.
  • The parse module has what you need to parse bytes into known records.

Putting it all together, we get

use perf_event_data::endian::Native;
use perf_event_data::parse::{ParseConfig, Parser};
use perf_event_data::Record;

fn main() {
    let data: &[u8] = &[
        0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
        0x16, 0x4C, 0x01, 0x00, 0x17, 0x4C, 0x01, 0x00,
        0x00, 0xA0, 0x48, 0x96, 0x4F, 0x7F, 0x00, 0x00,
        0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0xA0, 0x48, 0x96, 0x4F, 0x7F, 0x00, 0x00,
        0x2F, 0x2F, 0x61, 0x6E, 0x6F, 0x6E, 0x00, 0x00, 
    ];

    let config = ParseConfig::<Native>::default();
    let mut parser = Parser::new(data, config);
    let record: Record = parser.parse().expect("failed to parse the record");

    // ...
}

See Also

  • The perf-event2 crate allows you to set up sampled perf event counters. You will likely need this, or an equivalent crate, in order to get the event data this crate parses.
  • The linux-perf-event-reader crate provides similar functionality to this one.

Dependencies

~570–770KB
~19K SLoC