Skip to content

Commit

Permalink
[fileset/prom] shows max and alloc inodes only if inode space owner
Browse files Browse the repository at this point in the history
  • Loading branch information
wookietreiber committed Aug 9, 2024
1 parent 634ff8c commit f937838
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 53 deletions.
2 changes: 1 addition & 1 deletion src/bin/mmoxi/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ fn run_prom_fileset(args: &ArgMatches) -> Result<()> {
filesets.extend(mmoxi::fileset::filesets(&fs)?);
}

mmoxi::prom::write_fileset_metrics(&filesets, &mut output)?;
filesets.to_prom(&mut output)?;

Ok(())
}
Expand Down
2 changes: 2 additions & 0 deletions src/fileset-example.in
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ mmlsfileset::HEADER:version:reserved:reserved:filesystemName:filesetName:id:root
mmlsfileset::0:1:::gpfs1:public:271:73014444035:Linked:%2Fgpfs1%2Fpublic:0:Fri Oct 29 14%3A18%3A40 2021:-:-::off:-:-:-:-:-:-:-:-:-:-:-:-:136:1:20971520:5251072:66846720:-:-:-:-:-:-:-:-:0:-:-:-:chmodAndSetacl:-:4719472:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:no:inheritAclOnly:-:-:default:
mmlsfileset::0:1:::gpfs1:work:269:72477573123:Linked:%2Fgpfs1%2Fwork:0:Fri Oct 29 14%3A07%3A35 2021:-:-::off:-:-:-:-:-:-:-:-:-:-:-:-:135:1:295313408:260063232:66846720:-:-:-:-:-:-:-:-:0:-:-:-:chmodAndSetacl:-:151587111:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:no:inheritAclOnly:-:-:default:
mmlsfileset::0:1:::gpfs1:data_foo:126:103079215107:Linked:%2Fgpfs1%2Fdata%2Ffoo:0:Tue Dec 5 10%3A44%3A05 2023:-:-:end of project%3A 2026-11:off:-:-:-:-:-:-:-:-:-:-:-:-:192:1:20000768:1032192:66846720:-:-:-:-:-:-:-:-:0:-:-:-:chmodAndSetacl:-:1031235:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:no:inheritAclOnly:-:-:-:-:-:-:-:-:default:
mmlsfileset::0:1:::gpfs1:data_db:49:13421772803:Linked:%2Fgpfs1%2Fdata%2Fdb:0:Fri Oct 29 13%3A47%3A02 2021:-:-:end of project%3A 2042-12:off:-:-:-:-:-:-:-:-:-:-:-:-:25:1:20971520:5251072:66846720:-:-:-:-:-:-:-:-:0:-:-:-:chmodAndSetacl:-:3342079:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:no:inheritAclOnly:-:-:-:-:-:-:-:-:-:-:-:-:-:-:default:
mmlsfileset::0:1:::gpfs1:data_db_foo:84:13422254080:Linked:%2Fgpfs1%2Fdata%2Fdb%2Ffoo:49:Mon Mar 18 13%3A41%3A34 2024:-:-:end of project%3A 2030-12:off:-:-:-:-:-:-:-:-:-:-:-:-:25:0:0:0:66846720:-:-:-:-:-:-:-:-:0:-:-:-:chmodAndSetacl:-:0:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:no:inheritAclOnly:-:-:-:-:-:-:-:-:-:-:-:-:-:-:default:
88 changes: 87 additions & 1 deletion src/fileset.rs
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
//! `mmlsfileset` parsing.
use std::io::BufRead;
use std::io::{BufRead, Write};
use std::process::Command;

use anyhow::{anyhow, Context, Result};

use crate::prom::ToText;
use crate::util::MMBool;

/// A fileset.
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct Fileset {
filesystem_name: String,
fileset_name: String,
is_inode_space_owner: bool,
max_inodes: u64,
alloc_inodes: u64,
comment: Option<String>,
Expand All @@ -28,6 +32,12 @@ impl Fileset {
self.fileset_name.as_ref()
}

/// Returns if this fileset is the owner of its inode space.
#[must_use]
pub const fn is_inode_space_owner(&self) -> bool {
self.is_inode_space_owner
}

/// Returns the maximum number of inodes.
#[must_use]
pub const fn max_inodes(&self) -> u64 {
Expand All @@ -47,6 +57,44 @@ impl Fileset {
}
}

impl ToText for Vec<Fileset> {
fn to_prom(&self, output: &mut impl Write) -> Result<()> {
writeln!(
output,
"# HELP gpfs_fileset_max_inodes GPFS fileset maximum inodes"
)?;
writeln!(output, "# TYPE gpfs_fileset_max_inodes gauge")?;

for fileset in self.iter().filter(|f| f.is_inode_space_owner()) {
writeln!(
output,
"gpfs_fileset_max_inodes{{fs=\"{}\",fileset=\"{}\"}} {}",
fileset.filesystem_name(),
fileset.fileset_name(),
fileset.max_inodes(),
)?;
}

writeln!(
output,
"# HELP gpfs_fileset_alloc_inodes GPFS fileset allocated inodes"
)?;
writeln!(output, "# TYPE gpfs_fileset_alloc_inodes gauge")?;

for fileset in self.iter().filter(|f| f.is_inode_space_owner()) {
writeln!(
output,
"gpfs_fileset_alloc_inodes{{fs=\"{}\",fileset=\"{}\"}} {}",
fileset.filesystem_name(),
fileset.fileset_name(),
fileset.alloc_inodes(),
)?;
}

Ok(())
}
}

/// Returns all filesets of the given file system.
///
/// # Errors
Expand Down Expand Up @@ -104,6 +152,7 @@ pub fn fileset(fs: &str, fileset: &str) -> Result<Fileset> {
struct Index {
filesystem_name: Option<usize>,
fileset_name: Option<usize>,
is_inode_space_owner: Option<usize>,
max_inodes: Option<usize>,
alloc_inodes: Option<usize>,
comment: Option<usize>,
Expand Down Expand Up @@ -141,6 +190,14 @@ fn from_tokens(tokens: &[&str], index: &Index) -> Result<Fileset> {
.ok_or_else(|| anyhow!("no filesetName index"))?;
let fileset_name = tokens[fileset_name_index].into();

let is_inode_space_owner_index = index
.is_inode_space_owner
.ok_or_else(|| anyhow!("no isInodeSpaceOwner index"))?;
let is_inode_space_owner = tokens[is_inode_space_owner_index]
.parse::<MMBool>()
.with_context(|| "parsing isInodeSpaceOwner value")?
.as_bool();

let max_inodes_index = index
.max_inodes
.ok_or_else(|| anyhow!("no maxInodes index"))?;
Expand All @@ -163,6 +220,7 @@ fn from_tokens(tokens: &[&str], index: &Index) -> Result<Fileset> {
Ok(Fileset {
filesystem_name,
fileset_name,
is_inode_space_owner,
max_inodes,
alloc_inodes,
comment,
Expand All @@ -174,6 +232,7 @@ fn header_to_index(tokens: &[&str], index: &mut Index) {
match *token {
"filesystemName" => index.filesystem_name = Some(i),
"filesetName" => index.fileset_name = Some(i),
"isInodeSpaceOwner" => index.is_inode_space_owner = Some(i),
"maxInodes" => index.max_inodes = Some(i),
"allocInodes" => index.alloc_inodes = Some(i),
"comment" => index.comment = Some(i),
Expand Down Expand Up @@ -202,6 +261,7 @@ mod tests {
Some(Fileset {
filesystem_name: "gpfs1".into(),
fileset_name: "public".into(),
is_inode_space_owner: true,
max_inodes: 20_971_520,
alloc_inodes: 5_251_072,
comment: None,
Expand All @@ -213,6 +273,7 @@ mod tests {
Some(Fileset {
filesystem_name: "gpfs1".into(),
fileset_name: "work".into(),
is_inode_space_owner: true,
max_inodes: 295_313_408,
alloc_inodes: 260_063_232,
comment: None,
Expand All @@ -224,12 +285,37 @@ mod tests {
Some(Fileset {
filesystem_name: "gpfs1".into(),
fileset_name: "data_foo".into(),
is_inode_space_owner: true,
max_inodes: 20_000_768,
alloc_inodes: 1_032_192,
comment: Some("end of project: 2026-11".into()),
})
);

assert_eq!(
filesets.next(),
Some(Fileset {
filesystem_name: "gpfs1".into(),
fileset_name: "data_db".into(),
is_inode_space_owner: true,
max_inodes: 20_971_520,
alloc_inodes: 5_251_072,
comment: Some("end of project: 2042-12".into()),
})
);

assert_eq!(
filesets.next(),
Some(Fileset {
filesystem_name: "gpfs1".into(),
fileset_name: "data_db_foo".into(),
is_inode_space_owner: false,
max_inodes: 0,
alloc_inodes: 0,
comment: Some("end of project: 2030-12".into()),
})
);

assert_eq!(filesets.next(), None);
}
}
49 changes: 0 additions & 49 deletions src/prom.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ use std::path::Path;

use anyhow::{anyhow, Result};

use crate::fileset::Fileset;
use crate::nsd::FsPoolId;
use crate::sysfs;

Expand All @@ -21,54 +20,6 @@ pub trait ToText {
fn to_prom(&self, output: &mut impl Write) -> Result<()>;
}

/// Writes the filesets' information as prometheus metrics to `output`.
///
/// # Errors
///
/// This function uses [`writeln`] to write to `output`. It can only fail if
/// any of these [`writeln`] fails.
pub fn write_fileset_metrics<O>(
filesets: &[Fileset],
output: &mut O,
) -> Result<()>
where
O: Write,
{
writeln!(
output,
"# HELP gpfs_fileset_max_inodes GPFS fileset maximum inodes"
)?;
writeln!(output, "# TYPE gpfs_fileset_max_inodes gauge")?;

for fileset in filesets {
writeln!(
output,
"gpfs_fileset_max_inodes{{fs=\"{}\",fileset=\"{}\"}} {}",
fileset.filesystem_name(),
fileset.fileset_name(),
fileset.max_inodes(),
)?;
}

writeln!(
output,
"# HELP gpfs_fileset_alloc_inodes GPFS fileset allocated inodes"
)?;
writeln!(output, "# TYPE gpfs_fileset_alloc_inodes gauge")?;

for fileset in filesets {
writeln!(
output,
"gpfs_fileset_alloc_inodes{{fs=\"{}\",fileset=\"{}\"}} {}",
fileset.filesystem_name(),
fileset.fileset_name(),
fileset.alloc_inodes(),
)?;
}

Ok(())
}

/// Returns block device metrics grouped by pool.
///
/// # Errors
Expand Down
4 changes: 2 additions & 2 deletions src/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ impl FromStr for MMBool {

fn from_str(s: &str) -> Result<Self> {
match s.to_lowercase().as_str() {
"no" => Ok(Self::No),
"yes" => Ok(Self::Yes),
"no" | "0" => Ok(Self::No),
"yes" | "1" => Ok(Self::Yes),
unknown => Err(anyhow!("unknown boolean value: {unknown}")),
}
}
Expand Down

0 comments on commit f937838

Please sign in to comment.