diff --git a/plugins/disk/btrfs_device_stats b/plugins/disk/btrfs_device_stats
new file mode 100755
index 00000000..0959381e
--- /dev/null
+++ b/plugins/disk/btrfs_device_stats
@@ -0,0 +1,175 @@
+#!/usr/bin/env python3
+
+
+"""
+=pod
+
+=head1 NAME
+
+btrfs_device_stats - Script to monitor btrfs device statistics
+
+=head1 CONFIGURATION
+
+Simply create a symlink in your plugins directory like with any other plugin.
+Must be run as root.
+
+[btrfs_device_stats]
+user root
+
+=head2 DEFAULT CONFIGURATION
+
+=head1 BUGS
+
+=head1 AUTHOR
+
+2019, 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 .
+
+
+import btrfs
+import sys
+
+
+def munin_config(fs):
+ fsid = str(fs.fsid).replace('-', '_')
+ print("multigraph btrfs_device_stats_" + fsid)
+ print("graph_args --base 1000 -l 0")
+ print("graph_vlabel total btrfs attribute value")
+ print("graph_title btrfs total device stats for " + fs.path)
+ print("graph_category disk")
+ print("graph_info This graph shows the total stats of devices used by btrfs")
+
+ print("corruption_errs_total.label Corruption Errors")
+ print("flush_errs_total.label Flush Errors")
+ print("generation_errs_total.label Generation Errors")
+ print("read_errs_total.label Read Errors")
+ print("write_errs_total.label Write Errors")
+ print("nr_items_total.label Nr. of Items")
+ print("flags_total.label Nr. of Flags")
+
+ print("")
+
+ 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("multigraph btrfs_device_stats_" + fsid + "." + str(this_device.devid))
+ print("graph_args --base 1000 -l 0")
+ print("graph_vlabel btrfs attribute value")
+ print("graph_title btrfs device stats for " + this_dev_name)
+ print("graph_category disk")
+ print("graph_info This graph shows stats of devices used by btrfs")
+
+ print("corruption_errs.label Corruption Errors")
+ print("corruption_errs.warming 1")
+ print("flush_errs.label Flush Errors")
+ print("flush_errs.warming 1")
+ print("generation_errs.label Generation Errors")
+ print("generation_errs.warming 1")
+ print("read_errs.label Read Errors")
+ print("read_errs.warming 1")
+ print("write_errs.label Write Errors")
+ print("write_errs.warming 1")
+ print("nr_items.label Nr. of Items")
+ print("flags.label Nr. of Flags")
+ print("flags.warming 1")
+
+ print("")
+
+
+def munin_values(fs):
+ corruption_errs_total = 0
+ flush_errs_total = 0
+ generation_errs_total = 0
+ read_errs_total = 0
+ write_errs_total = 0
+ nr_items_total = 0
+ flags_total = 0
+
+ fsid = str(fs.fsid).replace('-', '_')
+ devices = fs.devices()
+
+ for this_device in devices:
+ this_dev_stat = fs.dev_stats(this_device.devid, False)
+
+ corruption_errs = this_dev_stat.corruption_errs
+ flush_errs = this_dev_stat.flush_errs
+ generation_errs = this_dev_stat.generation_errs
+ read_errs = this_dev_stat.read_errs
+ write_errs = this_dev_stat.write_errs
+ nr_items = this_dev_stat.nr_items
+ flags = this_dev_stat.flags
+
+ corruption_errs_total = corruption_errs_total + corruption_errs
+ flush_errs_total = flush_errs_total + flush_errs
+ generation_errs_total = generation_errs_total + generation_errs
+ read_errs_total = read_errs_total + read_errs
+ write_errs_total = write_errs_total + write_errs
+ nr_items_total = nr_items_total + nr_items
+ flags_total = flags_total + flags
+
+ print("multigraph btrfs_device_stats_" + fsid + "." + str(this_device.devid))
+
+ print("corruption_errs.value " + str(corruption_errs))
+ print("flush_errs.value " + str(flush_errs))
+ print("generation_errs.value " + str(generation_errs))
+ print("read_errs.value " + str(read_errs))
+ print("write_errs.value " + str(write_errs))
+ print("nr_items.value " + str(nr_items))
+ print("flags.value " + str(flags))
+
+ print("")
+
+ print("multigraph btrfs_device_stats_" + fsid)
+
+ print("corruption_errs_total.value " + str(corruption_errs_total))
+ print("flush_errs_total.value " + str(flush_errs_total))
+ print("generation_errs_total.value " + str(generation_errs_total))
+ print("read_errs_total.value " + str(read_errs_total))
+ print("write_errs_total.value " + str(write_errs_total))
+ print("nr_items_total.value " + str(nr_items_total))
+ print("flags_total.value " + str(flags_total))
+
+ 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)
diff --git a/plugins/disk/btrfs_device_usage b/plugins/disk/btrfs_device_usage
new file mode 100755
index 00000000..c5c7238f
--- /dev/null
+++ b/plugins/disk/btrfs_device_usage
@@ -0,0 +1,140 @@
+#!/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
+
+=head2 DEFAULT CONFIGURATION
+
+=head1 BUGS
+
+=head1 AUTHOR
+
+2019, 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 .
+
+
+import btrfs
+import sys
+
+
+def munin_config(fs):
+ fsid = str(fs.fsid).replace('-', '_')
+
+ 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)
+
+ 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 95")
+ print("btrfs_percent_" + fsid + "_" + str(this_device.devid) + ".critical 98")
+
+ 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)
+ 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)))
+
+ 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)