docs: add README with project overview and usage examples
This commit is contained in:
1 file changed
+144
@@ -0,0 +1,144 @@
|
||||
# irtt-rs
|
||||
|
||||
`irtt-rs` is a Rust implementation of an IRTT-compatible client.
|
||||
|
||||
It is not the upstream IRTT project. For the original implementation, protocol background, and broader project documentation, see:
|
||||
|
||||
<https://github.com/heistp/irtt>
|
||||
|
||||
## Status
|
||||
|
||||
This repository currently provides:
|
||||
|
||||
- `irtt-cli`, a command-line IRTT-compatible client
|
||||
- `irtt-client`, a Rust library for running client sessions and consuming events
|
||||
- finite and continuous probe runs
|
||||
- human, simple, machine-readable, and RTT-only output modes
|
||||
- optional local summary statistics
|
||||
|
||||
Server support is not implemented.
|
||||
|
||||
## Install
|
||||
|
||||
Requires Rust 1.75 or newer.
|
||||
|
||||
From a local checkout:
|
||||
|
||||
```sh
|
||||
git clone https://github.com/Lochnair/irtt-rs.git
|
||||
cd irtt-rs
|
||||
cargo install --path crates/irtt-cli
|
||||
```
|
||||
|
||||
Or run it directly without installing:
|
||||
|
||||
```sh
|
||||
cargo run -p irtt-cli -- <server>
|
||||
```
|
||||
|
||||
## CLI usage
|
||||
|
||||
Basic test:
|
||||
|
||||
```sh
|
||||
irtt-cli <server>
|
||||
```
|
||||
|
||||
Set duration and interval:
|
||||
|
||||
```sh
|
||||
irtt-cli <server> --duration 30s --interval 100ms
|
||||
```
|
||||
|
||||
Run continuously:
|
||||
|
||||
```sh
|
||||
irtt-cli <server> --duration 0
|
||||
```
|
||||
|
||||
Use a specific output mode:
|
||||
|
||||
```sh
|
||||
irtt-cli <server> --output human
|
||||
irtt-cli <server> --output simple
|
||||
irtt-cli <server> --output machine
|
||||
irtt-cli <server> --output rtt-us
|
||||
```
|
||||
|
||||
For available options:
|
||||
|
||||
```sh
|
||||
irtt-cli --help
|
||||
```
|
||||
|
||||
## Machine output
|
||||
|
||||
Use `--output machine` for line-oriented `key=value` output intended for scripts, monitoring, and autorate consumers.
|
||||
|
||||
Example:
|
||||
|
||||
```sh
|
||||
irtt-cli <server> --duration 0 --interval 250ms --output machine
|
||||
```
|
||||
|
||||
Each line represents one client event and starts with an `event` field, for example:
|
||||
|
||||
```text
|
||||
event=echo_reply seq=4 logical_seq=4 remote=203.0.113.10:2112 raw_rtt_us=12400 effective_rtt_us=12100 adjusted_rtt_us=12100 server_processing_us=300 dscp=0 ecn=0 kernel_rx_ns=none
|
||||
```
|
||||
|
||||
Consumers should match on `event=...` and read the fields they need. Unknown fields should be ignored.
|
||||
|
||||
For consumers that only need RTT values, use:
|
||||
|
||||
```sh
|
||||
irtt-cli <server> --output rtt-us
|
||||
```
|
||||
|
||||
## Library usage
|
||||
|
||||
`irtt-client` can be used directly from Rust code.
|
||||
|
||||
Example `Cargo.toml` dependency from a local checkout:
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
irtt-client = { path = "crates/irtt-client" }
|
||||
```
|
||||
|
||||
Minimal managed-client example:
|
||||
|
||||
```rust
|
||||
use std::time::Duration;
|
||||
|
||||
use irtt_client::{
|
||||
ClientConfig, ClientEvent, ManagedClient, SubscriberConfig,
|
||||
};
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let config = ClientConfig {
|
||||
server_addr: "netperf-eu.bufferbloat.net:2112".to_owned(),
|
||||
duration: Some(Duration::from_secs(10)),
|
||||
interval: Duration::from_secs(1),
|
||||
..ClientConfig::default()
|
||||
};
|
||||
|
||||
let (session, events) =
|
||||
ManagedClient::start_with_subscription(config, SubscriberConfig::default())?;
|
||||
|
||||
while let Ok(event) = events.recv() {
|
||||
match event {
|
||||
ClientEvent::EchoReply { seq, rtt, .. } => {
|
||||
println!("seq={seq} rtt_us={}", rtt.effective.as_micros());
|
||||
}
|
||||
ClientEvent::SessionClosed { .. } => break,
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
let outcome = session.join()?;
|
||||
println!("session ended: {:?}", outcome.end_reason);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
Reference in new issue
Block a user