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
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()
|