#tide #usdt #dtrace #middleware #trace #bpf #dynamically

tide-trace

最小开销的USDT中间件,用于动态跟踪tide,支持BPF或DTrace。

4个版本 (重大变更)

0.5.0 2021年1月31日
0.4.0 2021年1月27日
0.3.0 2020年7月17日
0.1.1 2020年6月28日
0.1.0 2020年6月28日

#406 in Unix API

Apache-2.0

20KB
119

tide-trace

最小开销的USDT中间件,用于动态跟踪tide,支持BPFDTrace

$ cargo run --example histogram

$ sudo bpftrace -p $(pgrep histogram) tools/route-histogram.bt
Attaching 2 probes...

$ curl https://127.0.0.1:8080/route1 && curl https://127.0.0.1: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 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@           |

先决条件

linux

ubuntu

$ sudo apt-get install systemtap-sdt-dev bpftrace

fedora

$ sudo dnf install systemtap-sdt-devel bpftrace

mac

此中间件旨在在mac上运行,但尚未完全测试

$ brew install make 

示例用法

有关预构建应用程序,请参阅示例文件夹

创建项目

$ 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(())
}

跟踪请求

$ sudo bpftrace -p $(pgrep sample-project) tools/routes.bt 
$ curl https://127.0.0.1:8080/

测试

$ cargo build --examples 
$ sudo ./tests/test-all.sh

依赖项

~10–20MB
~318K SLoC