use std::time::Duration;
use netring::monitor::Monitor;
use netring::prelude::TracingSink;
use netring::protocol::builtin::Tcp;
use netring::protocol::event_typed::FlowEnded;
#[tokio::main]
async fn main() -> Result<(), netring::Error> {
let filter = tracing_subscriber::EnvFilter::try_from_default_env()
.unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info"));
tracing_subscriber::fmt()
.json()
.with_env_filter(filter)
.with_current_span(false)
.init();
let iface = std::env::args().nth(1).unwrap_or_else(|| "lo".to_string());
let monitor = Monitor::builder()
.interface(&iface)
.name("tracing-json-demo")
.protocol::<Tcp>()
.sink(TracingSink::default())
.on::<FlowEnded<Tcp>>(|f: &FlowEnded<Tcp>| {
tracing::info!(
target: "netring.flow",
src = %f.key.a,
dst = %f.key.b,
packets = f.stats.packets_initiator + f.stats.packets_responder,
bytes = f.stats.bytes_initiator + f.stats.bytes_responder,
reason = ?f.reason,
"tcp flow ended"
);
Ok(())
})
.on_capture_stats(Duration::from_secs(2), |t, _ctx| {
tracing::info!(
target: "netring.telemetry",
source = t.source.0,
packets = t.packets,
drops = t.drops,
freezes = t.freezes,
"capture telemetry"
);
Ok(())
})
.build()?;
println!("# logging TCP flows + telemetry as JSON on {iface} (Ctrl-C to stop)");
monitor.run_until_signal().await
}