#!/usr/bin/env python3 import argparse from pprint import pprint from subprocess import check_output import nagiosplugin def lvs_output(): return [ line.strip().split(":", 5) for line in check_output( [ "sudo", "lvs", "--noheadings", "--separator", ":", "--select", "lv_attr =~ ^t", "-o", "lvattr,lv_name,vg_name,data_percent,metadata_percent", ], env={"LC_ALL": "C"}, encoding="UTF-8", ).splitlines() ] class LVMThinPools(nagiosplugin.Resource): def __init__(self): self.pool_data = lvs_output() def get_lv_names(self): return [f"{vg_name}/{lv_name}" for _, lv_name, vg_name, _, _ in self.pool_data] def probe(self): data_max = 0.0 metadata_max = 0.0 metrics = [] for lv_attr, lv_name, vg_name, data_percent, metadata_percent in self.pool_data: metrics += [ nagiosplugin.Metric( f"data_{vg_name}/{lv_name}", float(data_percent), "%", 0, 100, ), nagiosplugin.Metric( f"meta_{vg_name}/{lv_name}", float(metadata_percent), "%", 0, 100, ), ] data_max = max(data_max, float(data_percent)) metadata_max = max(metadata_max, float(metadata_percent)) metrics += [ nagiosplugin.Metric("data_percent", data_max, "%", 0, 100), nagiosplugin.Metric("metadata_percent", metadata_max, "%", 0, 100), ] return metrics def parse_args(): argp = argparse.ArgumentParser() argp.add_argument("--dpw", "--data-warning-percent", metavar="RANGE", default="70") argp.add_argument("--dpc", "--data-critical-percent", metavar="RANGE", default="90") argp.add_argument( "--mpw", "--metadata-warning-percent", metavar="RANGE", default="70" ) argp.add_argument( "--mpc", "--metadata-critical-percent", metavar="RANGE", default="90" ) argp.add_argument( "-v", "--verbose", action="count", default=0, help="increase output verbosity (use up to 3 times)", ) return argp.parse_args() @nagiosplugin.guarded def main(): args = parse_args() pools = LVMThinPools() check = nagiosplugin.Check( pools, nagiosplugin.ScalarContext("data_percent", args.dpw, args.dpc), nagiosplugin.ScalarContext("metadata_percent", args.mpw, args.mpc), ) for lv_full_name in pools.get_lv_names(): check.add(nagiosplugin.ScalarContext(f"data_{lv_full_name}", args.dpw, args.dpc, "data percent (%s) is {valueunit}" % lv_full_name)) check.add(nagiosplugin.ScalarContext(f"meta_{lv_full_name}", args.dpw, args.dpc, "meta data percent (%s) is {valueunit}" % lv_full_name)) check.main(args.verbose) if __name__ == "__main__": main()