# tide-trace Minimum overhead [USDT](http://dtrace.org/guide/chp-usdt.html) middleware to dynamically trace [tide](https://github.com/http-rs/tide) with [BPF](http://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html) or [DTrace](https://en.wikipedia.org/wiki/DTrace). ``` $ cargo run --example histogram $ sudo bpftrace -p $(pgrep histogram) tools/route-histogram.bt Attaching 2 probes... $ curl http://localhost:8080/route1 && curl http://localhost:8080/route2 ^C @us[GET, /favicon.ico]: [32, 64) 1 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| @us[GET, /route1]: [32, 64) 2 |@@@@@@@@@@@@@@@@@ | [64, 128) 6 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [128, 256) 2 |@@@@@@@@@@@@@@@@@ | @us[GET, /route2]: [32, 64) 2 |@@@@@@@@@@@@@@@@@@@@ | [64, 128) 5 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [128, 256) 4 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | ``` ## pre-requisites ### linux #### ubuntu ``` $ sudo apt-get install systemtap-sdt-dev bpftrace ``` #### fedora ``` $ sudo dnf install systemtap-sdt-devel bpftrace ``` ### mac **This middleware is intended to work on mac but has not been fully tested** ``` $ brew install make ``` ## example usage For a prebuilt applications see examples folder Make a project ``` $ cargo init sample-project ``` Cargo.toml ``` tide = "0.16" async-std = { version = "1.8.0", features = ["attributes"] } tide-trace = { version = "0.4.0" } ``` main.rs ``` #[async_std::main] async fn main() -> Result<(), std::io::Error> { tide::log::start(); let mut app = tide::new(); app.middleware(tide_trace::USDTMiddleware::new(0)); app.at("/").get(|_| async { Ok("Hello, world!") }); app.listen("127.0.0.1:8080").await?; Ok(()) } ``` ## trace requests ``` $ sudo bpftrace -p $(pgrep sample-project) tools/routes.bt $ curl http://localhost:8080/ ``` ## tests ``` $ cargo build --examples $ sudo ./tests/test-all.sh ```