#![allow(clippy::unwrap_used)]
use renacer::brick_tracer::{BrickEscalationThresholds, BrickTracer, EscalationReason};
use std::time::Duration;
fn simulate_compute_brick(iterations: u64) -> u64 {
let mut result = 0u64;
for i in 0..iterations {
result = result.wrapping_add(i);
}
result
}
fn simulate_io_brick(sleep_us: u64) -> String {
std::thread::sleep(Duration::from_micros(sleep_us));
"io_complete".to_string()
}
fn main() {
println!("=== Renacer Brick Tracing Demo ===\n");
let tracer = BrickTracer::new_local();
println!("1. Testing escalation thresholds\n");
println!(" Default thresholds: CV > 15%, efficiency < 25%");
println!(" Should trace (CV=20%, eff=80%): {}", tracer.should_trace(20.0, 80.0));
println!(" Should trace (CV=5%, eff=10%): {}", tracer.should_trace(5.0, 10.0));
println!(" Should trace (CV=5%, eff=80%): {}", tracer.should_trace(5.0, 80.0));
println!();
println!("2. Tracing compute-bound brick\n");
let result = tracer.trace("MatMulBrick", 1000, || simulate_compute_brick(1_000_000));
let meta = result.metadata.as_ref().unwrap();
println!(" Result: {}", result.result);
println!(" Duration: {} us", result.duration_us);
println!(" Budget: {} us", meta.budget_us);
println!(" Efficiency: {:.2}%", meta.efficiency * 100.0);
println!(" Over budget: {}", meta.over_budget);
println!(" Dominant syscall: {}", result.syscall_breakdown.dominant_syscall());
println!();
println!("3. Tracing I/O-bound brick\n");
let result = tracer.trace("DiskReadBrick", 500, || simulate_io_brick(1000));
let meta = result.metadata.as_ref().unwrap();
println!(" Result: {}", result.result);
println!(" Duration: {} us", result.duration_us);
println!(" Budget: {} us", meta.budget_us);
println!(" Efficiency: {:.2}%", meta.efficiency * 100.0);
println!(" Over budget: {}", meta.over_budget);
println!();
println!("4. Escalation reason detection\n");
let reason = tracer.escalation_reason(20.0, 10.0);
println!(" CV=20%, eff=10% -> {}", reason);
let reason = tracer.escalation_reason(5.0, 10.0);
println!(" CV=5%, eff=10% -> {}", reason);
let reason = tracer.escalation_reason(20.0, 80.0);
println!(" CV=20%, eff=80% -> {}", reason);
println!();
println!("5. Custom thresholds\n");
let thresholds = BrickEscalationThresholds::default()
.with_cv(10.0) .with_efficiency(50.0) .with_rate_limit(10); let tracer = BrickTracer::new_local().with_thresholds(thresholds);
println!(" Custom: CV > 10%, efficiency < 50%");
println!(" Should trace (CV=12%, eff=80%): {}", tracer.should_trace(12.0, 80.0));
println!(" Should trace (CV=5%, eff=40%): {}", tracer.should_trace(5.0, 40.0));
println!();
println!("6. Trace with explicit escalation reason\n");
let result = tracer.trace_with_reason("DebugBrick", 10000, EscalationReason::Manual, || {
simulate_compute_brick(100)
});
println!(" Reason: {:?}", result.escalation_reason);
println!();
println!("=== Demo Complete ===\n");
println!("For OTLP export to Jaeger/Tempo, use:");
println!(" let tracer = BrickTracer::new(\"http://localhost:4317\")?;");
}