Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# ignore trace files in the root directory (produced by examples etc.)
*.bin
# except the demo trace
!dial9-tokio-telemetry/trace_viewer/demo-trace.bin
!dial9-viewer/ui/demo-trace.bin
target/
.claude/
7 changes: 3 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,11 @@ If you modify the trace format (event structure, encoding, parser, etc.), you MU
Or manually:

```bash
cd dial9-tokio-telemetry
rm -f trace_viewer/demo-trace.bin
rm -f dial9-viewer/ui/demo-trace.bin
cargo build --release -p metrics-service
AWS_PROFILE=your-profile cargo run --release -p metrics-service --bin metrics-service -- --trace-path sched-trace.bin --demo
cp sched-trace.*.bin trace_viewer/demo-trace.bin
git add trace_viewer/demo-trace.bin
cp sched-trace.*.bin dial9-viewer/ui/demo-trace.bin
git add dial9-viewer/ui/demo-trace.bin
git commit -m "Regenerate demo trace after format changes"
```

Expand Down
109 changes: 109 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ members = [
"dial9-tokio-telemetry",
"dial9-trace-format",
"dial9-trace-format-derive",
"dial9-viewer",
"perf-self-profile",
"examples/metrics-service",
]
Expand Down
2 changes: 1 addition & 1 deletion dial9-tokio-telemetry/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ cargo run --example analyze_trace --features analysis -- /tmp/my_traces/trace.0.
cargo run --example trace_to_jsonl --features analysis -- /tmp/my_traces/trace.0.bin.gz output.jsonl
```

There's also an interactive HTML trace viewer — open `trace_viewer/index.html` and drag in a `.bin` file. [Here's a demo.](https://www.youtube.com/watch?v=zJOzU_6Mf7Q)
There's also an interactive HTML trace viewer — open `../dial9-viewer/ui/index.html` and drag in a `.bin` file. [Here's a demo.](https://www.youtube.com/watch?v=zJOzU_6Mf7Q)

See [TRACE_ANALYSIS_GUIDE.md](/dial9-tokio-telemetry/TRACE_ANALYSIS_GUIDE.md) for a walkthrough of diagnosing scheduling delays and CPU hotspots from trace data.

Expand Down
2 changes: 1 addition & 1 deletion dial9-tokio-telemetry/design/tokio-telemetry-system.md
Original file line number Diff line number Diff line change
Expand Up @@ -402,5 +402,5 @@ examples/
design/
└── tokio-telemetry-system.md # This document

trace_viewer.html # Interactive HTML viewer (standalone, no build required)
trace_viewer/ # Interactive HTML viewer (see dial9-viewer crate)
```
6 changes: 4 additions & 2 deletions dial9-tokio-telemetry/serve.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#!/usr/bin/env python3
import http.server, os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
print("Serving at http://localhost:3000")
# Serve from the dial9-viewer/ui directory (files moved from trace_viewer/)
ui_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "dial9-viewer", "ui")
os.chdir(ui_dir)
print(f"Serving {ui_dir} at http://localhost:3000")
http.server.HTTPServer(("", 3000), http.server.SimpleHTTPRequestHandler).serve_forever()
12 changes: 9 additions & 3 deletions dial9-tokio-telemetry/tests/js_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,13 @@ fn test_js_parser_matches_rust() {

eprintln!("Exported JSONL to {}", jsonl_path.display());

// Run JS parser test (use CARGO_MANIFEST_DIR to find trace_viewer)
// Run JS parser test (use CARGO_MANIFEST_DIR to find ui directory)
let manifest_dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
let test_script = std::path::Path::new(&manifest_dir)
.join("trace_viewer")
.parent()
.unwrap()
.join("dial9-viewer")
.join("ui")
.join("test_parser.js");

let test_output = Command::new("node")
Expand Down Expand Up @@ -159,7 +162,10 @@ if (!sym || sym.symbol !== "my_function") {{
console.log("OK: " + result.events.length + " events, symbol resolved");
"#,
viewer = std::path::Path::new(&manifest_dir)
.join("trace_viewer")
.parent()
.unwrap()
.join("dial9-viewer")
.join("ui")
.display(),
trace = trace_path.display(),
);
Expand Down
6 changes: 3 additions & 3 deletions dial9-trace-format/examples/format_comparison.rs
Original file line number Diff line number Diff line change
Expand Up @@ -680,9 +680,9 @@ fn main() {
let path = std::env::args().nth(1).unwrap_or_else(|| {
// Try relative paths from likely CWDs
for p in &[
"../../dial9-tokio-telemetry/trace_viewer/demo-trace.bin",
"../dial9-tokio-telemetry/trace_viewer/demo-trace.bin",
"dial9-tokio-telemetry/trace_viewer/demo-trace.bin",
"../../dial9-viewer/ui/demo-trace.bin",
"../dial9-viewer/ui/demo-trace.bin",
"dial9-viewer/ui/demo-trace.bin",
] {
if std::path::Path::new(p).exists() {
return p.to_string();
Expand Down
48 changes: 48 additions & 0 deletions dial9-viewer/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
[package]
name = "dial9-viewer"
version = "0.1.0"
edition.workspace = true
license.workspace = true
repository.workspace = true
description = "CLI trace viewer and S3 browser for dial9-tokio-telemetry"

[features]
dev-server = ["dep:s3s", "dep:s3s-fs", "dep:s3s-aws", "dep:tempfile"]

[[bin]]
name = "dial9-viewer"
path = "src/main.rs"

[[bin]]
name = "dev-server"
path = "src/bin/dev_server.rs"
required-features = ["dev-server"]

[dependencies]
axum = "0.8"
axum-extra = { version = "0.10", features = ["query"] }
clap = { version = "4", features = ["derive"] }
flate2 = "1"
futures = "0.3"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1", features = ["rt-multi-thread", "macros", "signal"] }
tower-http = { version = "0.6", features = ["fs"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
aws-config = { version = "1", features = ["behavior-version-latest"] }
aws-sdk-s3 = { version = "1", features = ["behavior-version-latest"] }
anyhow = "1"
s3s = { version = "0.13.0", optional = true }
s3s-fs = { version = "0.13.0", optional = true }
s3s-aws = { version = "0.13.0", optional = true }
tempfile = { version = "3", optional = true }

[dev-dependencies]
assert2 = { workspace = true }
reqwest = { version = "0.12", default-features = false, features = ["json"] }
s3s = "0.13.0"
s3s-fs = "0.13.0"
s3s-aws = "0.13.0"
tempfile = "3"
urlencoding = "2"
Loading
Loading