You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

114 lines
3.2 KiB
Python

#!/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()