From ed0fdbc36688e8eedb534408448bc1e8d5c309a5 Mon Sep 17 00:00:00 2001 From: Dennis Schwerdel Date: Fri, 29 May 2020 10:04:14 +0200 Subject: [PATCH] Change stats output format ot yaml --- src/cloud.rs | 8 ++++--- src/ethernet.rs | 12 ++++++++--- src/ip.rs | 15 ++++++++++--- src/traffic.rs | 57 +++++++++++++++++++++++++++++++++++++++++++------ src/util.rs | 9 ++++++++ 5 files changed, 85 insertions(+), 16 deletions(-) diff --git a/src/cloud.rs b/src/cloud.rs index 10238fe..0fe0cc3 100644 --- a/src/cloud.rs +++ b/src/cloud.rs @@ -28,7 +28,7 @@ use super::{ traffic::TrafficStats, types::{Error, HeaderMagic, NodeId, Protocol, Range, Table}, udpmessage::{decode, encode, Message}, - util::{resolve, CtrlC, Duration, Time, TimeSource} + util::{addr_nice, resolve, CtrlC, Duration, Time, TimeSource} }; pub type Hash = BuildHasherDefault; @@ -199,10 +199,10 @@ impl PeerList { #[inline] fn write_out(&self, out: &mut W) -> Result<(), io::Error> { - writeln!(out, "Peers:")?; + writeln!(out, "peers:")?; let now = TS::now(); for (addr, data) in &self.peers { - writeln!(out, " - {} (ttl: {} s)", addr, data.timeout - now)?; + writeln!(out, " - \"{}\": {{ ttl_secs: {} }}", addr_nice(*addr), data.timeout - now)?; } Ok(()) } @@ -631,6 +631,7 @@ impl GenericCloud GenericCloud Table for SwitchTable { /// Write out the table fn write_out(&self, out: &mut W) -> Result<(), io::Error> { let now = TS::now(); - writeln!(out, "Switch table:")?; + writeln!(out, "switch_table:")?; for (addr, val) in &self.table { - writeln!(out, " - {} => {} (ttl: {} s)", addr, val.address, val.timeout - now)?; + writeln!( + out, + " - \"{}\": {{ peer: \"{}\", ttl_secs: {} }}", + addr, + addr_nice(val.address), + val.timeout - now + )?; } Ok(()) } diff --git a/src/ip.rs b/src/ip.rs index bd65123..f7ff15b 100644 --- a/src/ip.rs +++ b/src/ip.rs @@ -11,7 +11,10 @@ use std::{ use fnv::FnvHasher; -use super::types::{Address, Error, Protocol, Table}; +use super::{ + types::{Address, Error, Protocol, Table}, + util::addr_nice +}; /// An IP packet dissector @@ -153,10 +156,16 @@ impl Table for RoutingTable { /// Write out the table fn write_out(&self, out: &mut W) -> Result<(), io::Error> { - writeln!(out, "Routing table:")?; + writeln!(out, "routing_table:")?; for entries in self.0.values() { for entry in entries { - writeln!(out, " - {}/{} => {}", entry.bytes, entry.prefix_len, entry.address)?; + writeln!( + out, + " - \"{}/{}\": {{ peer: \"{}\" }}", + entry.bytes, + entry.prefix_len, + addr_nice(entry.address) + )?; } } Ok(()) diff --git a/src/traffic.rs b/src/traffic.rs index a4b5cb8..9c9ecd4 100644 --- a/src/traffic.rs +++ b/src/traffic.rs @@ -8,7 +8,11 @@ use std::{ net::SocketAddr }; -use super::{cloud::Hash, types::Address, util::Bytes}; +use super::{ + cloud::Hash, + types::Address, + util::{addr_nice, Bytes} +}; #[derive(Default)] @@ -58,7 +62,8 @@ impl TrafficEntry { #[derive(Default)] pub struct TrafficStats { peers: HashMap, - payload: HashMap<(Address, Address), TrafficEntry, Hash> + payload: HashMap<(Address, Address), TrafficEntry, Hash>, + dropped: TrafficEntry } impl TrafficStats { @@ -82,6 +87,14 @@ impl TrafficStats { self.payload.entry((remote, local)).or_insert_with(TrafficEntry::default).count_in(bytes); } + pub fn count_invalid_protocol(&mut self, bytes: usize) { + self.dropped.count_in(bytes) + } + + pub fn count_dropped_payload(&mut self, bytes: usize) { + self.dropped.count_out(bytes) + } + pub fn period(&mut self, cleanup_idle: Option) { for entry in self.peers.values_mut() { entry.period(); @@ -89,6 +102,7 @@ impl TrafficStats { for entry in self.payload.values_mut() { entry.period(); } + self.dropped.period(); if let Some(periods) = cleanup_idle { self.peers.retain(|_, entry| entry.idle_periods < periods); self.payload.retain(|_, entry| entry.idle_periods < periods); @@ -105,26 +119,55 @@ impl TrafficStats { #[inline] pub fn write_out(&self, out: &mut W) -> Result<(), io::Error> { - writeln!(out, "Peer traffic:")?; + writeln!(out, "peer_traffic:")?; let mut peers: Vec<_> = self.get_peer_traffic().collect(); peers.sort_unstable_by_key(|(_, data)| (data.out_bytes + data.in_bytes)); for (addr, data) in peers.iter().rev() { - writeln!(out, " - {}: in={}/s, out={}/s", addr, Bytes(data.in_bytes / 60), Bytes(data.out_bytes / 60))?; + writeln!( + out, + " - peer: \"{}\"\n in: {{ display: \"{}/s\", bytes: {}, packets: {} }}\n out: {{ display: \"{}/s\", bytes: {}, packets: {} }}", + addr_nice(**addr), + Bytes(data.in_bytes / 60), + data.in_bytes, + data.in_packets, + Bytes(data.out_bytes / 60), + data.out_bytes, + data.out_packets + )?; } writeln!(out)?; - writeln!(out, "Payload traffic:")?; + writeln!(out, "payload_traffic:")?; let mut payload: Vec<_> = self.get_payload_traffic().collect(); payload.sort_unstable_by_key(|(_, data)| (data.out_bytes + data.in_bytes)); for ((remote, local), data) in payload.iter().rev() { writeln!( out, - " - {} <-> {}: in={}/s, out={}/s", + " - addrs: [\"{}\", \"{}\"]\n in: {{ display: \"{}/s\", bytes: {}, packets: {} }}\n out: {{ display: \"{}/s\", bytes: {}, packets: {} }}", remote, local, Bytes(data.in_bytes / 60), - Bytes(data.out_bytes / 60) + data.in_bytes, + data.in_packets, + Bytes(data.out_bytes / 60), + data.out_bytes, + data.out_packets )?; } + writeln!(out)?; + writeln!( + out, + "invalid_protocol_traffic: {{ display: \"{}/s\", bytes: {}, packets: {} }}", + Bytes(self.dropped.in_bytes / 60), + self.dropped.in_bytes, + self.dropped.in_packets + )?; + writeln!( + out, + "dropped_payload_traffic: {{ display: \"{}/s\", bytes: {}, packets: {} }}", + Bytes(self.dropped.out_bytes / 60), + self.dropped.out_bytes, + self.dropped.out_packets + )?; Ok(()) } } diff --git a/src/util.rs b/src/util.rs index 9badabc..7444a1d 100644 --- a/src/util.rs +++ b/src/util.rs @@ -31,6 +31,15 @@ pub fn bytes_to_hex(bytes: &[u8]) -> String { s } +pub fn addr_nice(addr: SocketAddr) -> SocketAddr { + if let SocketAddr::V6(v6addr) = addr { + if let Some(ip) = v6addr.ip().to_ipv4() { + return (ip, addr.port()).into() + } + } + addr +} + pub struct Encoder;