Skip to content

Commit 7c78f9d

Browse files
committed
feat: add tracing support
Signed-off-by: Wenxuan Zhang <[email protected]>
1 parent a69bdaa commit 7c78f9d

File tree

7 files changed

+225
-22
lines changed

7 files changed

+225
-22
lines changed

Cargo.lock

Lines changed: 149 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ name = "rlt"
1919
path = "src/lib.rs"
2020

2121
[features]
22-
default = ["http", "rate_limit"]
23-
http = ["dep:http"]
24-
log = ["dep:log", "dep:tui-logger"]
22+
default = ["log", "rate_limit", "http"]
23+
log = ["dep:log", "dep:tracing", "dep:tui-logger"]
2524
rate_limit = ["dep:governor"]
25+
http = ["dep:http"]
2626

2727
[dependencies]
2828
anyhow = "1"
@@ -41,14 +41,18 @@ async-trait = "0.1"
4141
hdrhistogram = "7.5"
4242
itertools = "0.12"
4343
tabled = "0.15"
44-
http = { version = "1.1", optional = true }
45-
tui-logger = { version = "0.11", optional = true }
46-
log = { version = "0.4", optional = true }
4744
cfg-if = "1"
4845
parking_lot = "0.12"
49-
governor = { version = "0.6", optional = true }
5046
nonzero_ext = "0.3"
5147

48+
http = { version = "1.1", optional = true }
49+
governor = { version = "0.6", optional = true }
50+
log = { version = "0.4", optional = true }
51+
tracing = { version = "0.1", optional = true }
52+
tui-logger = { version = "0.11", optional = true, features = [
53+
"tracing-support",
54+
] }
55+
5256
[dev-dependencies]
5357
tokio = { version = "1.36", features = ["rt-multi-thread"] }
5458
bytes = "1.6"
@@ -63,3 +67,4 @@ hyper-util = { version = "0.1", features = [
6367
] }
6468
reqwest = "0.12"
6569
tokio-postgres = "0.7"
70+
tracing-subscriber = { version = "0.3", features = ["env-filter"] }

examples/logging.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
use anyhow::Result;
2+
use async_trait::async_trait;
3+
use clap::Parser;
4+
use rlt::{cli::BenchCli, IterInfo, IterReport, StatelessBenchSuite, Status, StatusKind};
5+
use tokio::time::{Duration, Instant};
6+
7+
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter};
8+
9+
#[derive(Clone)]
10+
struct SimpleBench;
11+
12+
#[async_trait]
13+
impl StatelessBenchSuite for SimpleBench {
14+
async fn bench(&mut self, info: &IterInfo) -> Result<IterReport> {
15+
let t = Instant::now();
16+
17+
// simulate some work
18+
tokio::time::sleep(Duration::from_micros(info.runner_seq % 30)).await;
19+
let duration = t.elapsed();
20+
21+
// simulate status code
22+
let seq = info.runner_seq;
23+
let status = match seq % 10 {
24+
8..=10 => Status::server_error(500),
25+
6..=7 => Status::client_error(400),
26+
_ => Status::success(200),
27+
};
28+
29+
match status.kind() {
30+
StatusKind::Success => tracing::info!(?status, seq),
31+
StatusKind::ClientError => tracing::warn!(?status, seq),
32+
StatusKind::ServerError | StatusKind::Error => tracing::error!(?status, seq),
33+
};
34+
35+
Ok(IterReport { duration, status, bytes: 0, items: 1 })
36+
}
37+
}
38+
39+
#[tokio::main]
40+
async fn main() -> Result<()> {
41+
let opt = BenchCli::parse();
42+
match opt.collector() {
43+
rlt::cli::Collector::Tui => {
44+
tracing_subscriber::registry()
45+
.with(EnvFilter::from_default_env())
46+
.with(rlt::tui_tracing_subscriber_layer())
47+
.init();
48+
}
49+
rlt::cli::Collector::Silent => {
50+
tracing_subscriber::fmt()
51+
.with_env_filter(EnvFilter::from_default_env())
52+
.init();
53+
}
54+
}
55+
56+
rlt::cli::run(opt, SimpleBench).await
57+
}

examples/simple_stateless.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@ impl StatelessBenchSuite for SimpleBench {
2929
// simulate items processed in current iteration
3030
let items = info.worker_seq % 100;
3131

32-
#[cfg(feature = "log")]
33-
// press `l` to see log output
34-
if status.kind() != rlt::StatusKind::Success {
35-
log::warn!("duration: {:?}, status: {}, items: {}", duration, status, items);
36-
}
37-
3832
Ok(IterReport { duration, status, bytes: items * 1024, items })
3933
}
4034
}

src/cli.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ impl BenchCli {
166166
}
167167
}
168168

169-
pub(crate) fn collector(&self) -> Collector {
169+
/// Get the actual collector type.
170+
pub fn collector(&self) -> Collector {
170171
match self.collector {
171172
Some(collector) => collector,
172173
None if self.quiet || !stdout().is_tty() => Collector::Silent,

src/collector/tui.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,6 @@ mod tui_log {
653653
use super::*;
654654

655655
use log::LevelFilter;
656-
use std::str::FromStr;
657656
use tui_logger::{TuiLoggerLevelOutput, TuiLoggerSmartWidget, TuiWidgetState};
658657

659658
pub(crate) struct LogState {
@@ -663,13 +662,8 @@ mod tui_log {
663662

664663
impl LogState {
665664
pub(crate) fn from_env() -> Result<Self> {
666-
let log_level = match std::env::var("RUST_LOG") {
667-
Ok(log_level) => LevelFilter::from_str(&log_level).unwrap_or(LevelFilter::Info),
668-
Err(_) => LevelFilter::Info,
669-
};
670-
tui_logger::init_logger(log_level).map_err(|e| anyhow::anyhow!(e))?;
671-
tui_logger::set_default_level(log_level);
672-
let state = TuiWidgetState::new().set_default_display_level(log_level);
665+
tui_logger::set_default_level(LevelFilter::Trace);
666+
let state = TuiWidgetState::new().set_default_display_level(LevelFilter::Info);
673667
Ok(Self { inner: state, display: false })
674668
}
675669
}

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,6 @@ pub use crate::{
7272
runner::{BenchSuite, StatelessBenchSuite},
7373
status::{Status, StatusKind},
7474
};
75+
76+
#[cfg(feature = "log")]
77+
pub use tui_logger::tracing_subscriber_layer as tui_tracing_subscriber_layer;

0 commit comments

Comments
 (0)