import collectd import btrfs PLUGIN = 'btrfs' TYPE_STATS = "stats" mount_paths = [] def configure_callback(conf): """ Populate mount_paths """ global mount_paths mount_paths = [path for path in btrfs.utils.mounted_filesystem_paths()] collectd.info("btrfs: config done. mount_paths: {}".format(mount_paths)) def read_callback(): """Read Btrfs device information and dispatch values to collectd.""" metric = collectd.Values() metric.plugin = PLUGIN for path in mount_paths: try: with btrfs.FileSystem(path) as fs: for device in list(fs.devices()): stats = fs.dev_stats(device.devid) dev_info = fs.dev_info(device.devid) metric.plugin_instance = dev_info.path for counter, value in stats.counters.items(): metric.type_instance = counter metric.dispatch(TYPE_STATS, [value]) except Exception as e: collectd.error("btrfs: read_callback: {}".format(e)) collectd.debug("btrfs: read done") if __name__ != "__main__": # Register callbacks collectd.register_config(configure_callback) collectd.register_read(read_callback)