minor cleanup

This commit is contained in:
Robin Appelman 2021-03-28 22:04:04 +02:00
commit b607a3d8fb
2 changed files with 23 additions and 27 deletions

View file

@ -5,7 +5,6 @@ use crate::sensors::temperatures;
use crate::sensors::*; use crate::sensors::*;
use crate::zfs::pools; use crate::zfs::pools;
use color_eyre::Result; use color_eyre::Result;
use std::collections::HashSet;
use std::fmt::Write; use std::fmt::Write;
pub async fn get_metrics() -> Result<String> { pub async fn get_metrics() -> Result<String> {
@ -52,7 +51,7 @@ pub async fn get_metrics() -> Result<String> {
.ok(); .ok();
} }
for network in networks { for network in networks {
let network: IOStats = network; let network: IoStats = network;
if network.bytes_received > 0 || network.bytes_sent > 0 { if network.bytes_received > 0 || network.bytes_sent > 0 {
writeln!( writeln!(
&mut result, &mut result,
@ -69,7 +68,7 @@ pub async fn get_metrics() -> Result<String> {
} }
} }
for disk in disks { for disk in disks {
let disk: IOStats = disk; let disk: IoStats = disk;
if disk.bytes_received > 0 && disk.bytes_sent > 0 { if disk.bytes_received > 0 && disk.bytes_sent > 0 {
writeln!( writeln!(
&mut result, &mut result,
@ -86,24 +85,21 @@ pub async fn get_metrics() -> Result<String> {
} }
} }
let mut found_sizes = HashSet::new();
for disk in disk_usage { for disk in disk_usage {
let disk: DiskUsage = disk; let disk: DiskUsage = disk;
if disk.size > 0 { if disk.size > 0 {
if found_sizes.insert((disk.size, disk.free)) { writeln!(
writeln!( &mut result,
&mut result, "disk_size{{host=\"{}\", disk=\"{}\"}} {}",
"disk_size{{host=\"{}\", disk=\"{}\"}} {}", hostname, disk.name, disk.size
hostname, disk.name, disk.size )
) .ok();
.ok(); writeln!(
writeln!( &mut result,
&mut result, "disk_free{{host=\"{}\", disk=\"{}\"}} {}",
"disk_free{{host=\"{}\", disk=\"{}\"}} {}", hostname, disk.name, disk.free
hostname, disk.name, disk.free )
) .ok();
.ok();
}
} }
} }
for (label, temp) in temperatures { for (label, temp) in temperatures {

View file

@ -12,7 +12,7 @@ use std::os::unix::ffi::OsStrExt;
#[derive(Debug, Clone, Hash, Eq, PartialEq, Display)] #[derive(Debug, Clone, Hash, Eq, PartialEq, Display)]
#[display(style = "lowercase")] #[display(style = "lowercase")]
pub enum TemperatureLabel { pub enum TemperatureLabel {
CPU, Cpu,
} }
#[derive(Debug, Clone, Default)] #[derive(Debug, Clone, Default)]
@ -23,7 +23,7 @@ pub struct Memory {
} }
#[derive(Debug, Clone, Default)] #[derive(Debug, Clone, Default)]
pub struct IOStats { pub struct IoStats {
pub interface: String, pub interface: String,
pub bytes_sent: u64, pub bytes_sent: u64,
pub bytes_received: u64, pub bytes_received: u64,
@ -49,7 +49,7 @@ pub fn temperatures() -> Result<HashMap<TemperatureLabel, f32>> {
.flat_map(|(name, dir)| { .flat_map(|(name, dir)| {
read_dir(dir.path()) read_dir(dir.path())
.into_iter() .into_iter()
.flat_map(|dir| dir) .flatten()
.filter_map(Result::ok) .filter_map(Result::ok)
.filter_map(move |item: DirEntry| { .filter_map(move |item: DirEntry| {
let file_name = item.file_name(); let file_name = item.file_name();
@ -64,7 +64,7 @@ pub fn temperatures() -> Result<HashMap<TemperatureLabel, f32>> {
}) })
.filter_map( .filter_map(
|(name, label, item)| match (name.as_slice(), label.as_slice()) { |(name, label, item)| match (name.as_slice(), label.as_slice()) {
(b"k10temp\n", b"Tdie\n") => Some((TemperatureLabel::CPU, item)), (b"k10temp\n", b"Tdie\n") => Some((TemperatureLabel::Cpu, item)),
_ => None, _ => None,
}, },
) )
@ -112,7 +112,7 @@ pub fn cpu_time() -> Result<u64> {
let line = stat let line = stat
.lines() .lines()
.next() .next()
.ok_or(Report::msg("Invalid /proc/stat"))??; .ok_or_else(|| Report::msg("Invalid /proc/stat"))??;
let mut parts = line.split_ascii_whitespace(); let mut parts = line.split_ascii_whitespace();
if let (_cpu, Some(user), _nice, Some(system)) = if let (_cpu, Some(user), _nice, Some(system)) =
(parts.next(), parts.next(), parts.next(), parts.next()) (parts.next(), parts.next(), parts.next(), parts.next())
@ -125,7 +125,7 @@ pub fn cpu_time() -> Result<u64> {
} }
} }
pub fn network_stats() -> Result<impl Iterator<Item = IOStats>> { pub fn network_stats() -> Result<impl Iterator<Item = IoStats>> {
let stat = BufReader::new(File::open("/proc/net/dev")?); let stat = BufReader::new(File::open("/proc/net/dev")?);
Ok(stat Ok(stat
.lines() .lines()
@ -154,7 +154,7 @@ pub fn network_stats() -> Result<impl Iterator<Item = IOStats>> {
parts.next(), parts.next(),
parts.next(), parts.next(),
) { ) {
Some(IOStats { Some(IoStats {
interface: interface.trim_end_matches(':').into(), interface: interface.trim_end_matches(':').into(),
bytes_sent: bytes_sent.parse().ok()?, bytes_sent: bytes_sent.parse().ok()?,
bytes_received: bytes_received.parse().ok()?, bytes_received: bytes_received.parse().ok()?,
@ -171,7 +171,7 @@ pub fn hostname() -> Result<String> {
.map_err(|_| Report::msg("non utf8 hostname")) .map_err(|_| Report::msg("non utf8 hostname"))
} }
pub fn disk_stats() -> Result<impl Iterator<Item = IOStats>> { pub fn disk_stats() -> Result<impl Iterator<Item = IoStats>> {
static DISK_REGEX: Lazy<Regex> = static DISK_REGEX: Lazy<Regex> =
Lazy::new(|| Regex::new(r" ([sv]d[a-z]+|nvme\dn\d) ").unwrap()); Lazy::new(|| Regex::new(r" ([sv]d[a-z]+|nvme\dn\d) ").unwrap());
@ -190,7 +190,7 @@ pub fn disk_stats() -> Result<impl Iterator<Item = IOStats>> {
let _write_count = parts.next(); let _write_count = parts.next();
let _write_merged_count = parts.next(); let _write_merged_count = parts.next();
let write_bytes = parts.next()?.parse().ok()?; let write_bytes = parts.next()?.parse().ok()?;
Some(IOStats { Some(IoStats {
interface: name, interface: name,
bytes_sent: write_bytes, bytes_sent: write_bytes,
bytes_received: read_bytes, bytes_received: read_bytes,