1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-21 18:41:03 +00:00
Munin-Contrib/plugins/disk/btrfs_device_usage
HaseHarald 16d38264aa [btrfs_device_usage] fix division by zero when btrfs pool is unhealthy
During certain situations, a device in the btrfs pool can show a total
capacity of 0 bytes. This is aspecially true when replacing or removing a
failed disk.

This fix stops the plugin from crashing in that situation but just report
the devices percentage as unknown (U). That way other devices in the pool
stil can be monitored.
2021-12-12 13:20:43 +01:00

182 lines
5.7 KiB
Python
Executable file

#!/usr/bin/env python3
"""
=pod
=head1 NAME
btrfs_device_usage - Script to monitor usage of btrfs devices
=head1 CONFIGURATION
Simply create a symlink in your plugins directory like with any other plugin.
Must be run as root.
[btrfs_device_usage]
user root
You can optionaly configure the warning and critical limits for byte and
percentage graphs. By default percent_warning is set to 95 and percent_critical
is 98. For the byte-graphs there are no default limits set. You can set the
limits either for the entire graph (byte_ percent_) or per individual filesystem
using it's UUID (replace minus with underscore). The individual values take
precedence over the general ones. See the following example:
btrfs_device_usage]
user root
env.byte_warning 400300200100
env.percent_critical 97
env.percent_10164f3f_6670_4982_a941_bffb50d27f29_warning 23
env.byte_10164f3f_6670_4982_a941_bffb50d27f29_critical 5000000000
=head2 DEFAULT CONFIGURATION
=head1 BUGS
=head1 AUTHOR
2019-2021, HaseHarald
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf
=head1 LICENSE
LGPLv3
=cut
"""
# This file contains a munin-plugin to gather btrfs statistics per device.
#
# This is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this plugin. If not, see <http://www.gnu.org/licenses/>.
import btrfs
import os
import sys
def munin_config(fs):
fsid = str(fs.fsid).replace('-', '_')
byte_warning = os.getenv('byte_warning', default=False)
byte_critical = os.getenv('byte_critical', default=False)
byte_warning = os.getenv('byte_' + fsid + '_warning',
default=byte_warning)
byte_critical = os.getenv('byte_' + fsid + '_critical',
default=byte_critical)
percent_warning = os.getenv('percent_warning', default=95)
percent_critical = os.getenv('percent_critical', default=98)
percent_warning = os.getenv('percent_' + fsid + '_warning',
default=percent_warning)
percent_critical = os.getenv('percent_' + fsid + '_critical',
default=percent_critical)
print("multigraph btrfs_device_usage_byte_" + fsid)
print("graph_title btrfs usage by device in bytes on " + fs.path)
print("graph_args --base 1024 -l 0")
print("graph_scale yes")
print("graph_vlabel bytes")
print("graph_category disk")
print("graph_info This graph shows bytes used by btrfs on every device")
devices = fs.devices()
for this_device in devices:
this_dev_info = fs.dev_info(this_device.devid)
this_dev_name = this_dev_info.path.replace('/dev/', '')
print("btrfs_bytes_" + fsid + "_" + str(this_device.devid) +
".label " + this_dev_name)
if byte_warning:
print("btrfs_bytes_" + fsid + "_" + str(this_device.devid) +
".warning " + str(byte_warning))
if byte_critical:
print("btrfs_bytes_" + fsid + "_" + str(this_device.devid) +
".critical " + str(byte_critical))
print("")
print("multigraph btrfs_device_usage_percent_" + fsid)
print("graph_title btrfs usage by device in percent on " + fs.path)
print("graph_args --base 1000 -l 0")
print("graph_scale no")
print("graph_vlabel %")
print("graph_category disk")
print("graph_info This graph shows percentage used by btrfs on every \
device. Maesured in percentage of device capacity.")
devices = fs.devices()
for this_device in devices:
this_dev_info = fs.dev_info(this_device.devid)
this_dev_name = this_dev_info.path.replace('/dev/', '')
print("btrfs_percent_" + fsid + "_" + str(this_device.devid) +
".label " + this_dev_name)
print("btrfs_percent_" + fsid + "_" + str(this_device.devid) +
".warning " + str(percent_warning))
print("btrfs_percent_" + fsid + "_" + str(this_device.devid) +
".critical " + str(percent_critical))
print("")
def munin_values(fs):
fsid = str(fs.fsid).replace('-', '_')
devices = fs.devices()
print("multigraph btrfs_device_usage_byte_" + fsid)
for this_device in devices:
this_dev_info = fs.dev_info(this_device.devid)
print("btrfs_bytes_" + fsid + "_" + str(this_device.devid) +
".value " + str(this_dev_info.bytes_used))
print("")
# Reset device iterator
devices = fs.devices()
print("multigraph btrfs_device_usage_percent_" + fsid)
for this_device in devices:
this_dev_info = fs.dev_info(this_device.devid)
if this_dev_info.total_bytes > 0:
usage = 100.0 * this_dev_info.bytes_used / this_dev_info.total_bytes
print("btrfs_percent_" + fsid + "_" + str(this_device.devid) +
".value " + str(round(usage, 2)))
else:
print("btrfs_percent_" + fsid + "_" + str(this_device.devid) +
".value U")
print("")
def main():
for path in btrfs.utils.mounted_filesystem_paths():
with btrfs.FileSystem(path) as fs:
if len(sys.argv) > 1 and sys.argv[1] == "config":
munin_config(fs)
else:
munin_values(fs)
if __name__ == "__main__":
main()
exit(0)