A Rust library for managing eBPF programs.

Overview

oxidebpf

oxidebpf is a permissive licensed Rust library for managing eBPF programs.

Motivation

The motivation behind oxidebpf is to create a permissive licensed Rust library for managing long-running eBPF programs that operate in as many environments as possible. Doing this required breaking some pre-set patterns on how eBPF applications are developed and deployed. We wanted to be able to easily deploy an eBPF solution that worked on as many distributions as possible; without forcing the user to have a tool-chain present. Users typically just want a product to do the thing - without a bunch of additional setup or maintenance. This library helped us realize that goal - and we are sharing it openly.

Initially this library meets our current eBPF requirements, so its not a fully flushed out eBPF implementation. Contributions are very much welcome, and we will slowly be adding to the feature list over time.

Goals

We want oxidebpf to meet the following goals.

  • Permissive licensed with no GPL dependencies.
  • Support custom CO-RE eBPF
  • Run eBPF programs on Linux 4.4+
  • Written in pure Rust, or as close to pure Rust as possible.
  • Minimal dependencies, pull in the bare minimum set of dependencies required to achieve our desired functionality.

Requirements

A set of Linux environments are provided for building and testing, with dependencies listed in their bootstrap.sh scripts. In general, you will want:

$ sudo apt-get install build-essential clang llvm libclang-dev linux-tools-oem \
  linux-tools-(kernel version)-generic

Additionally, you will need cargo installed. The cargo-with package is recommended for debugging and testing. It allows you to trace BPF calls during tests by running cargo with "strace -vfe bpf" -- test.

Getting Started

Here's some quick steps to get you started right away.

  1. Add oxidebpf to your Cargo.toml
  2. Use the ProgramBlueprint to load your compiled eBPF object file with maps and programs.
  3. Create a Program for each program you intend to load, with options set.
  4. Create a ProgramVersion with your programs. You may create multiple ProgramVersions, representing different sets of programs. For example, programs intended to run on different kernel versions.
  5. Create a ProgramGroup with a channel capacity (or None).
  6. Give the ProgramGroup your ProgramVersions and ProgramBlueprint, and tell it to start loading. It will attempt each ProgramVersion in order until one successfully loads on the current kernel. If it cannot load any program version, it will return an error composed of the underlying errors for each ProgramVersion.
let program = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
    .join("test")
    .join(format!("test_program_{}", std::env::consts::ARCH));
let program_blueprint =
    ProgramBlueprint::new(&std::fs::read(program).expect("Could not open file"), None)
        .expect("Could not open test object file");
let mut program_group = ProgramGroup::new(None);

program_group.load(
    program_blueprint,
    vec![ProgramVersion::new(vec![
        Program::new(
            "test_program_map_update",
            vec!["do_mount"],
        )
        .syscall(true),
        Program::new("test_program", vec!["do_mount"]).syscall(true),
    ])],
).expect("Could not load programs");

Note: this expects the presence of a test_program_[arch] binary in a test subfolder of your project, where [arch] is the architecture of your system.

Building

The project includes several Vagrantfiles which are set up to build and test the library.

$ cd vagrant/ubuntu_20.04
$ vagrant up
$ vagrant ssh
$ cd oxidebpf
$ cargo build

If you want to build locally, check the bootstrap.sh file for the Vagrantfile most similar to your system. This file will include build and test dependencies for the distribution.

Testing

  1. Run docker-compose run --rm test-builder from the test/ directory to build the BPF test application. For additional options for RHEL builds, see test/README.md.
  2. Run tests with cargo test. To trace BPF syscalls as they occur, run the tests with cargo with "strace -fe bpf" -- test (depends on cargo-with, included in vagrant bootstrap by default).

Note: some tests will require root privileges to pass. Other tests require a single-threaded context to pass. To test consistently, try running: sudo -E /path/to/your/.cargo/bin/cargo test -- --test-threads=1. For convenience, you can alias this as alias scargo="sudo -E $HOME/.cargo/bin/cargo" and run tests with scargo test -- --test-threads=.

Comments
  • README updates

    README updates

    The community team will probably want to add their own copy, but let's agree on the message we're trying to send.

    I also wanted to check that the 7 quickstart steps match what we all expect the top-down functionality to be.

    opened by FridayOrtiz 2
  • Unaligned Access in `MapDefinition::try_from`

    Unaligned Access in `MapDefinition::try_from`

    Hi.

    As of 6e0c70b229fe5c367004d05727caeb92651d3c10, there seems to be unaligned access within the try_from function of MapDefinition.

    For example, cargo miri test bpf::tests::test_blueprint_map_definition_parsing yields error: Undefined Behavior: accessing memory with alignment 1, but alignment 4 is required

    I think you can use std::ptr::read_unaligned instead of std::ptr::read. It appears to work fine at least according to that test case.

    Full error

    error: Undefined Behavior: accessing memory with alignment 1, but alignment 4 is required
       --> /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:701:9
        |
    701 |         copy_nonoverlapping(src, tmp.as_mut_ptr(), 1);
        |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ accessing memory with alignment 1, but alignment 4 is required
        |
        = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
        = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
                
        = note: inside `std::ptr::read::<bpf::MapDefinition>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:701:9
    note: inside `<bpf::MapDefinition as std::convert::TryFrom<&[u8]>>::try_from` at src/bpf/mod.rs:127:21
       --> src/bpf/mod.rs:127:21
        |
    127 |         Ok(unsafe { std::ptr::read(data.as_ptr() as *const _) })
        |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    note: inside `bpf::tests::test_blueprint_map_definition_parsing` at src/bpf/mod.rs:587:17
       --> src/bpf/mod.rs:587:17
        |
    587 |         let r = MapDefinition::try_from(&minimum[..]).unwrap();
        |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    note: inside closure at src/bpf/mod.rs:579:5
       --> src/bpf/mod.rs:579:5
        |
    578 |       #[test]
        |       ------- in this procedural macro expansion
    579 | /     fn test_blueprint_map_definition_parsing() {
    580 | |         // test minimal definition
    581 | |         let minimum = vec![
    582 | |             0x1, 0x0, 0x0, 0x0, // map_type
    ...   |
    635 | |         );
    636 | |     }
        | |_____^
        = note: inside `<[closure@src/bpf/mod.rs:579:5: 636:6] as std::ops::FnOnce<()>>::call_once - shim` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227:5
        = note: inside `<fn() as std::ops::FnOnce<()>>::call_once - shim(fn())` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227:5
        = note: inside `program_tests::test::__rust_begin_short_backtrace::<fn()>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:585:5
        = note: inside closure at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:576:30
        = note: inside `<[closure@program_tests::test::run_test::{closure#2}] as std::ops::FnOnce<()>>::call_once - shim(vtable)` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227:5
        = note: inside `<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send> as std::ops::FnOnce<()>>::call_once` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/boxed.rs:1811:9
        = note: inside `<std::panic::AssertUnwindSafe<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send>> as std::ops::FnOnce<()>>::call_once` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/panic/unwind_safe.rs:271:9
        = note: inside `std::panicking::r#try::do_call::<std::panic::AssertUnwindSafe<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send>>, ()>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:406:40
        = note: inside `std::panicking::r#try::<(), std::panic::AssertUnwindSafe<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send>>>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:370:19
        = note: inside `std::panic::catch_unwind::<std::panic::AssertUnwindSafe<std::boxed::Box<dyn std::ops::FnOnce() + std::marker::Send>>, ()>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:133:14
        = note: inside `program_tests::test::run_test_in_process` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:608:18
        = note: inside closure at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:500:39
        = note: inside `program_tests::test::run_test::run_test_inner` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:538:13
        = note: inside `program_tests::test::run_test` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:572:28
        = note: inside `program_tests::test::run_tests::<[closure@program_tests::test::run_tests_console::{closure#2}]>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:313:17
        = note: inside `program_tests::test::run_tests_console` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/console.rs:290:5
        = note: inside `program_tests::test::test_main` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:124:15
        = note: inside `program_tests::test::test_main_static` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:143:5
        = note: inside `main`
        = note: inside `<fn() as std::ops::FnOnce<()>>::call_once - shim(fn())` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227:5
        = note: inside `std::sys_common::backtrace::__rust_begin_short_backtrace::<fn(), ()>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/backtrace.rs:123:18
        = note: inside closure at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:145:18
        = note: inside `std::ops::function::impls::<impl std::ops::FnOnce<()> for &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>::call_once` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:259:13
        = note: inside `std::panicking::r#try::do_call::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:406:40
        = note: inside `std::panicking::r#try::<i32, &dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:370:19
        = note: inside `std::panic::catch_unwind::<&dyn std::ops::Fn() -> i32 + std::marker::Sync + std::panic::RefUnwindSafe, i32>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:133:14
        = note: inside closure at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:128:48
        = note: inside `std::panicking::r#try::do_call::<[closure@std::rt::lang_start_internal::{closure#2}], isize>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:406:40
        = note: inside `std::panicking::r#try::<isize, [closure@std::rt::lang_start_internal::{closure#2}]>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:370:19
        = note: inside `std::panic::catch_unwind::<[closure@std::rt::lang_start_internal::{closure#2}], isize>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:133:14
        = note: inside `std::rt::lang_start_internal` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:128:20
        = note: inside `std::rt::lang_start::<()>` at /home/ubuntu/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:144:17
        = note: this error originates in the attribute macro `test` (in Nightly builds, run with -Z macro-backtrace for more info)
    
    error: aborting due to previous error
    
    error: test failed, to rerun pass '--lib'
    
    opened by YoshikiTakashima 1
  • test/Makefile modification to build without docker-compose (on rhel8)

    test/Makefile modification to build without docker-compose (on rhel8)

    The current instructions indicate to run docker-compose but it may not be installed on the host (as I didn't have it on a rhel8 VM where I tried to build). There may also be different versions of clang and llc (I had clang and LLVM 11.0.0). With the proposed Makefile modifications, I am able to build test_program_x86_64 on a RHEL 8.4.2 VM with make KERNEL_HEADERS_ROOT=/usr/src/kernels/$(uname -r). It still works as before for the "standard case" with docker-compose build.

    $ make CC=clang LLC=llc OPT=opt LLVM_DIS=llvm-dis KERNEL_HEADERS_ROOT=/usr/src/kernels/$(uname -r)
    CC: clang
    KERNEL_HEADER_VERSION: 4.4.0-98-generic
    KERNEL_HEADERS_ROOT: /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64
    clang -target x86_64 -D__KERNEL__ -D__BPF_TRACING__ -Wunused -Wall -Werror -Wno-pointer-sign -Wno-address-of-packed-member -Wno-compare-distinct-pointer-types -Wno-gnu-variable-sized-type-not-at-end -Wno-macro-redefined -Wno-sometimes-uninitialized -Wno-tautological-compare -fno-stack-protector -Xclang -disable-llvm-passes -O2 -D__ASM_SYSREG_H -D__TARGET_ARCH_x86 -emit-llvm -c test_program.c -I src/ -I /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64/arch/x86/include -I /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64/arch/x86/include/uapi -I /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64/arch/x86/include/generated -I /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64/arch/x86/include/generated/uapi -I /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64/include -I /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64/include/uapi -I /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64/include/generated -I /usr/src/kernels/4.18.0-305.19.1.el8_4.x86_64/include/generated/uapi -o - | \
    	opt -O2 -mtriple=bpf-pc-linux | llvm-dis | \
    	llc -march=bpf -filetype=obj -o test_program_x86_64
    

    docker-compose build on a Mac:

    $ docker-compose run --rm test-builder
    Creating test_test-builder_run ... done
    CC: clang-6.0
    KERNEL_HEADER_VERSION: 4.4.0-98-generic
    KERNEL_HEADERS_ROOT: /usr/src/linux-headers-4.4.0-98-generic
    rm -rf test_program_*
    clang-6.0 -target x86_64 -D__KERNEL__ -D__BPF_TRACING__ -Wunused -Wall -Werror -Wno-pointer-sign -Wno-address-of-packed-member -Wno-compare-distinct-pointer-types -Wno-gnu-variable-sized-type-not-at-end -Wno-macro-redefined -Wno-sometimes-uninitialized -Wno-tautological-compare -fno-stack-protector -Xclang -disable-llvm-passes -O2 -D__ASM_SYSREG_H -D__TARGET_ARCH_x86 -emit-llvm -c test_program.c -I src/ -I /usr/src/linux-headers-4.4.0-98-generic/arch/x86/include -I /usr/src/linux-headers-4.4.0-98-generic/arch/x86/include/uapi -I /usr/src/linux-headers-4.4.0-98-generic/arch/x86/include/generated -I /usr/src/linux-headers-4.4.0-98-generic/arch/x86/include/generated/uapi -I /usr/src/linux-headers-4.4.0-98-generic/include -I /usr/src/linux-headers-4.4.0-98-generic/include/uapi -I /usr/src/linux-headers-4.4.0-98-generic/include/generated -I /usr/src/linux-headers-4.4.0-98-generic/include/generated/uapi -o - | \
    	opt-6.0 -O2 -mtriple=bpf-pc-linux | llvm-dis-6.0 | \
    	llc-6.0 -march=bpf -filetype=obj -o test_program_x86_64
    

    The llvm-objdump output seems reasonable to me: https://gist.github.com/dmitris/6b4152ed15e01e21ef8b84ba0fade99e

    To admit, I cannot yet run all the tests [1] - I don't know yet what causes the test failures (Update: solved with making ulimit -l unlimited). [1] https://gist.github.com/dmitris/6ec20abefe56788626129d9810015151

    opened by dmitris 1
  • blueprint interface changes

    blueprint interface changes

    Split out objects to be maps and programs for easier access. The maps key is the symbol name of the map, while the programs key is the section name of the map, if one is present.

    opened by bjackson41 1
  • Add bpf syscall interface

    Add bpf syscall interface

    Refactor bpf syscalls into their own module and implement the following calls:

    • perf_event_open
    • setns
    • ioctl(PERF_EVENT_IOC_SET_BPF)
    • ioctl(PERF_EVENT_IOC_ENABLE)
    • ioctl(PERF_EVENT_IOC_DISABLE)
    • bpf_prog_load
    • bpf_map_lookup_elem
    • bpf_map_update_elem
    • bpf_map_create

    WIP while I add some docs and tests.

    opened by FridayOrtiz 1
  • set bpf/syscall logging to debug

    set bpf/syscall logging to debug

    The syscall.rs of the bpf library is very spammy on info dumping logs during retries when the system kernel does not support eBPF. The output logged isn't useful for troubleshooting outside a debug context.

    Example:

    sys_bpf(); cmd: 5; errno: 22; arg_bpf_attr: SizedBpfAttr { bpf_attr: BpfAttr: [2, 0, 0, 0, 2, 0, 0, 0, 64, 44, 106, 1, 0, 0, 0, 0, 160, 223, 115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], size: 48 }
    
    opened by rc-vbundage 0
  • set slog level of non error returns to debug | Bump crate version to 0.2.6

    set slog level of non error returns to debug | Bump crate version to 0.2.6

    This PR sets the slog level of non error return logging to use the debug! macro. Some of these logs were redundant with what was being returned with an error or are only informational in that they print the data at a point of execution.

    opened by rc-vbundage 0
  • Bump metrics to 0.20.1, remove metrics-macros

    Bump metrics to 0.20.1, remove metrics-macros

    Bump metrics dependency and remove metrics-macros as is already a dependency of metrics.

    Resolves an issue where metrics may not appear due to version mismatch.

    opened by erikwilson-rc 0
  • no longer send cpu as a label for perfmap buffer full metric

    no longer send cpu as a label for perfmap buffer full metric

    in practice this extra dimension in the data is of low value and multiplies the amount of data being sent.

    Bump the version for a new release at the same time.

    I had to make three tests no longer run because they were failing in CI with an EPERM. As far as I could tell this is because either: newer versions of the kernel require explicit permissions for this and we can't do it without them or being sudo, or CI is being run in a version of the kernel that has a a bug that doesn't allow creation of maps due to memory limits even when they were overriden.

    The tests pass locally in my machine with sudo and this PR hasn't changed anything regarding bpf map logic so I think uncommenting for now and looking into it later is okay.

    opened by rc-andres 0
  • Change mmap metrics

    Change mmap metrics

    • changed the names to be "perfmap" rather than "mmap" since that is sort of an implementation detail
    • report on unread pct rather than slack size to fit how metric histograms and summaries prefer to work.
    • Add a describe histogram so we can tell the reporter that it is a percentage so it can set up appropriate histogram buckets.
    • added gauges to report on how big the buffer is and how many are they
    opened by rc-andres 0
  • add metrics crate

    add metrics crate

    follow-up from: https://github.com/redcanaryco/oxidebpf/pull/47

    This lets users of oxidebpf to optionally elect into receiving metrics via the metrics crate for size of the mmap and how filled it is right before being read. This should let users of oxidebpf determine how their perf buffers are being used. In the future we may add more metrics under the same feature flag.

    opened by rc-andres 0
Releases(v0.2.7)
  • v0.2.7(Sep 9, 2022)

    What's Changed

    • set bpf/syscall logging to debug by @rc-vbundage in https://github.com/redcanaryco/oxidebpf/pull/57

    Full Changelog: https://github.com/redcanaryco/oxidebpf/compare/v0.2.6...v0.2.7

    Source code(tar.gz)
    Source code(zip)
  • v0.2.6(Sep 8, 2022)

    • set slog level of non error logging to debug by @rc-vbundage in #56

    Full Changelog: https://github.com/redcanaryco/oxidebpf/compare/v0.2.5...v0.2.6

    Source code(tar.gz)
    Source code(zip)
  • v0.2.5(Aug 3, 2022)

    What's Changed

    • bump metrics version by @erikwilson-rc in https://github.com/redcanaryco/oxidebpf/pull/54

    Full Changelog: https://github.com/redcanaryco/oxidebpf/compare/v0.2.4...v0.2.5

    Source code(tar.gz)
    Source code(zip)
  • v0.2.4(May 2, 2022)

    What's Changed

    • fix unaligned reads and clippy by @RafaelOrtizRC in https://github.com/redcanaryco/oxidebpf/pull/52
    • no longer send cpu as a label for perfmap buffer full metric by @rc-andres in https://github.com/redcanaryco/oxidebpf/pull/53

    Full Changelog: https://github.com/redcanaryco/oxidebpf/compare/v0.2.3...v0.2.4

    Source code(tar.gz)
    Source code(zip)
  • v0.2.3(Mar 23, 2022)

    What's Changed

    • Update deps + perfmap refactors by @rc-andres in https://github.com/redcanaryco/oxidebpf/pull/47
    • add metrics crate by @rc-andres in https://github.com/redcanaryco/oxidebpf/pull/48
    • Change mmap metrics by @rc-andres in https://github.com/redcanaryco/oxidebpf/pull/49
    • fix metrics feature breakage in latest version by @rc-andres in https://github.com/redcanaryco/oxidebpf/pull/50

    Full Changelog: https://github.com/redcanaryco/oxidebpf/compare/v0.2.0...v0.2.3

    Source code(tar.gz)
    Source code(zip)
  • v0.2.0(Jan 20, 2022)

    What's Changed

    • Allow perf buffer total size by @rc-andres in https://github.com/redcanaryco/oxidebpf/pull/46

    Full Changelog: https://github.com/redcanaryco/oxidebpf/compare/v0.1.3...v0.2.0

    Source code(tar.gz)
    Source code(zip)
  • v0.1.3(Jan 20, 2022)

    What's Changed

    • Fix default num cpus by @rc-vbundage in https://github.com/redcanaryco/oxidebpf/pull/45

    New Contributors

    • @rc-vbundage made their first contribution in https://github.com/redcanaryco/oxidebpf/pull/45

    Full Changelog: https://github.com/redcanaryco/oxidebpf/compare/v0.1.2...v0.1.3

    Source code(tar.gz)
    Source code(zip)
  • v0.1.2(Jan 19, 2022)

    What's Changed

    • add a rootless_blueprints feature by @RafaelOrtizRC in https://github.com/redcanaryco/oxidebpf/pull/43
    • Default num cpus on perfmaps by @rc-andres in https://github.com/redcanaryco/oxidebpf/pull/44

    Full Changelog: https://github.com/redcanaryco/oxidebpf/compare/v0.1.0...v0.1.2

    Source code(tar.gz)
    Source code(zip)
  • v0.1.0(Jan 18, 2022)

    New Contributors

    • @rc-andres made their first contribution in https://github.com/redcanaryco/oxidebpf/pull/17
    • @int5-grey made their first contribution in https://github.com/redcanaryco/oxidebpf/pull/19
    • @dmitris made their first contribution in https://github.com/redcanaryco/oxidebpf/pull/38

    Full Changelog: https://github.com/redcanaryco/oxidebpf/commits/v0.1.0

    Source code(tar.gz)
    Source code(zip)
Owner
Red Canary
Red Canary
🐝🦀🔥 An ebpf based CPU profiler written in Rust

profile-bee ?? ?? ?? Profile Bee is an eBPF based CPU profiler written in Rust for performance and efficiency. Aya is used for building the BPF progra

Joshua Koo 5 Dec 16, 2022
Fox Ear is a Linux process behavior trace tool powered by eBPF

Fox Ear Fox Ear is a Linux process behavior trace tool powered by eBPF. Banner image by Birger Strahl on Unsplash. Features Log process and its subpro

Rui Li 77 Dec 5, 2022
A modular and blazing fast runtime security framework for the IoT, powered by eBPF.

Pulsar is a security tool for monitoring the activity of Linux devices at runtime, powered by eBPF. The Pulsar core modules use eBPF probes to collect

Exein.io 319 Jul 8, 2023
Managing schema for AWS Athena in GitOps-style

athena-rs Managing AWS Athena Schemas Installation $ cargo install --git https://github.com/duyet/athena-rs $ athena --help athena 0.1.0 Duyet <me@du

Duyet Le 3 Sep 25, 2022
Tudo is a fast and simple CLI tool for managing to-do lists.

Tudo is a fast and simple CLI tool for managing to-do lists. With Tudo, you can easily add, remove, clear, and mark tasks as done, all from the command line. Tudo is written in Rust, making it a BLAZINGLY high-performance and efficient tool for staying organized.

Daniel Ramirez 3 Apr 18, 2023
tracing - a framework for instrumenting Rust programs to collect structured, event-based diagnostic information

tracing-appender Writers for logging events and spans Documentation | Chat Overview tracing is a framework for instrumenting Rust programs to collect

Cris Liao 1 Mar 9, 2022
Py-spy - Sampling profiler for Python programs

py-spy: Sampling profiler for Python programs py-spy is a sampling profiler for Python programs. It lets you visualize what your Python program is spe

Ben Frederickson 9.5k Jan 8, 2023
A library to compile USDT probes into a Rust library

sonde sonde is a library to compile USDT probes into a Rust library, and to generate a friendly Rust idiomatic API around it. Userland Statically Defi

Ivan Enderlin 40 Jan 7, 2023
A Rust library for calculating sun positions

sun A rust port of the JS library suncalc. Install Add the following to your Cargo.toml [dependencies] sun = "0.2" Usage pub fn main() { let unixti

Markus Kohlhase 36 Dec 28, 2022
A cross-platform serial port library in Rust.

Introduction serialport-rs is a general-purpose cross-platform serial port library for Rust. It provides a blocking I/O interface and port enumeration

Bryant Mairs 143 Nov 5, 2021
A high level diffing library for rust based on diffs

Similar: A Diffing Library Similar is a dependency free crate for Rust that implements different diffing algorithms and high level interfaces for it.

Armin Ronacher 617 Dec 30, 2022
A reactive DOM library for Rust in WASM

maple A VDOM-less web library with fine-grained reactivity. Getting started The recommended build tool is Trunk. Start by adding maple-core to your Ca

Luke Chu 1.8k Jan 3, 2023
transmute-free Rust library to work with the Arrow format

Arrow2: Transmute-free Arrow This repository contains a Rust library to work with the Arrow format. It is a re-write of the official Arrow crate using

Jorge Leitao 708 Dec 30, 2022
Cross-platform Window library in Rust for Tauri. [WIP]

Cross-platform application window creation library in Rust that supports all major platforms like Windows, macOS, Linux, iOS and Android. Built for you, maintained for Tauri.

Tauri 899 Jan 1, 2023
A library in Rust for theorem proving with Intuitionistic Propositional Logic.

Prop Propositional logic with types in Rust. A library in Rust for theorem proving with Intuitionistic Propositional Logic. Supports theorem proving i

AdvancedResearch 48 Jan 3, 2023
A Rust library for constructing tilings of regular polygons

tiling tiling is a library for constructing tilings of regular polygons and their dual tilings. Resources Documentation Tilings by regular polygons Li

Jonas Michel 29 Sep 30, 2021
miette is a diagnostic library for Rust. It includes a series of traits/protocols that allow you to hook into its error reporting facilities, and even write your own error reports!

miette is a diagnostic library for Rust. It includes a series of traits/protocols that allow you to hook into its error reporting facilities, and even write your own error reports!

Kat Marchán 1.2k Jan 1, 2023
Generative arts library in Rust

Generative Generative (WIP) is 2D generational arts creation library written in Rust. Currently it is in nascent stage and is somewhat unstable. Examp

Gaurav Patel 22 May 13, 2022
Membrane is an opinionated crate that generates a Dart package from a Rust library. Extremely fast performance with strict typing and zero copy returns over the FFI boundary via bincode.

Membrane is an opinionated crate that generates a Dart package from a Rust library. Extremely fast performance with strict typing and zero copy returns over the FFI boundary via bincode.

Jerel Unruh 70 Dec 13, 2022