diff --git a/setup/start/collectd/collectd.conf b/setup/start/collectd/collectd.conf index fa531d23f..75d559f8b 100644 --- a/setup/start/collectd/collectd.conf +++ b/setup/start/collectd/collectd.conf @@ -243,8 +243,19 @@ LoadPlugin write_graphite Import "du" - Path boxdata "/home/yellowtent/boxdata" - Path platformdata "/home/yellowtent/platformdata" + + Instance maildata + Dir "/home/yellowtent/boxdata/mail" + + + Instance boxdata + Dir "/home/yellowtent/boxdata" + Exclude "mail" + + + Instance platformdata + Dir "/home/yellowtent/platformdata" + diff --git a/setup/start/collectd/du.py b/setup/start/collectd/du.py index cebff1aef..ed3b9d8ad 100644 --- a/setup/start/collectd/du.py +++ b/setup/start/collectd/du.py @@ -1,39 +1,55 @@ -import collectd,os,subprocess +import collectd,os,subprocess,sys # https://www.programcreek.com/python/example/106897/collectd.register_read -PATHS = [] -INTERVAL = 60 * 60 * 24 +PATHS = [] # { name, dir, exclude } +INTERVAL = 60 * 60 * 24 # every day -def du(path): - return subprocess.check_output(['du','-Dsb', path]).split()[0].decode('utf-8') +def du(pathinfo): + cmd = 'timeout 1800 du -Dsb "{}"'.format(pathinfo['dir']) + if pathinfo['exclude'] != '': + cmd += ' --exclude "{}"'.format(pathinfo['exclude']) -def init(): - global PATHS - collectd.info('custom du plugin initialized with %s' % PATHS) + collectd.info('computing size with command: %s' % cmd); + try: + size = subprocess.check_output(cmd, shell=True).split()[0].decode('utf-8') + collectd.info('\tsize of %s is %s' % (pathinfo['dir'], size)) + return size + except Exception as e: + collectd.info('\terror getting the size of %s: %s' % (pathinfo['dir'], str(e))) + return -1 -# configure is called for each module block +# configure is called for each module block. this is called before init def configure(config): global PATHS - for node in config.children: - key = node.key - - if key == 'Path': - PATHS.append({ 'name': node.values[0], 'path': node.values[1] }) - collectd.info('du plugin: monitoring %s' % node.values[1]) - else: + for child in config.children: + if child.key != 'Path': collectd.info('du plugin: Unknown config key "%s"' % key) + continue + + pathinfo = { 'name': '', 'dir': '', 'exclude': '' } + for node in child.children: + if node.key == 'Instance': + pathinfo['name'] = node.values[0] + elif node.key == 'Dir': + pathinfo['dir'] = node.values[0] + elif node.key == 'Exclude': + pathinfo['exclude'] = node.values[0] + + PATHS.append(pathinfo); + collectd.info('du plugin: monitoring %s' % pathinfo['dir']); + +def init(): + global PATHS + collectd.info('custom du plugin initialized with %s %s' % (PATHS, sys.version)) def read(): - for p in PATHS: - path = p['path'] - collectd.info('computing size of %s' % path) - size = du(path) - collectd.info('du plugin: size of %s is %s' % (path, size)) + for pathinfo in PATHS: + size = du(pathinfo) # type comes from https://github.com/collectd/collectd/blob/master/src/types.db - val = collectd.Values(type='capacity', plugin='du', plugin_instance=p['name']) + val = collectd.Values(type='capacity', plugin='du', plugin_instance=pathinfo['name']) val.dispatch(values=[size], type_instance='usage') diff --git a/src/cloudron.js b/src/cloudron.js index 9d60201e3..a52cd64d0 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -185,6 +185,7 @@ function getDisks(callback) { const disks = { disks: ext4Disks, // root disk is first boxDataDisk: values[1].filesystem, + mailDataDisk: values[1].filesystem, platformDataDisk: values[2].filesystem, appsDataDisk: values[3].filesystem, apps: {} diff --git a/src/collectd.config.ejs b/src/collectd.config.ejs index 2d72edab0..ab5d2ce49 100644 --- a/src/collectd.config.ejs +++ b/src/collectd.config.ejs @@ -33,7 +33,10 @@ LoadPlugin "table" - Path "<%= appId %>" "<%= appDataDir %>" + + Instance "<%= appId %>" + Dir "<%= appDataDir %>" +