#!/usr/bin/env python3 from subprocess import check_output pools = check_output( ['/usr/sbin/zpool', 'list', '-Hpo', 'name,free,size'], env={ 'LC_ALL': 'C', }, ).decode('UTF-8') datasets = check_output( ['/usr/sbin/zfs', 'list', '-Hpo', 'name,usedbydataset,usedsnap,compressratio'], env={ 'LC_ALL': 'C', }, ).decode('UTF-8') zpools = {} for line in pools.splitlines(): name, free, total = line.split() zpools[name] = { 'free': free, 'total': total, } print('zfs_pool,pool={} size={}i,free={}i'.format(name, total, free)) for line in datasets.splitlines(): name, used, usedsnap, compressratio = line.split() pool = name.split('/')[0] if '/' not in name: # covered by pool metrics above continue if pool not in zpools: raise Exception('BUG: {} in datasets, but {} not in pools'.format(name, pool)) if compressratio[-1] == 'x': compressratio = compressratio[:-1] print('zfs_dataset,pool={},dataset={} used={}i,usedsnap={}i,compressratio={}'.format( pool, name, used, usedsnap, compressratio, ))