diff --git a/setup/start/collectd/du.py b/setup/start/collectd/du.py index ed3b9d8ad..14e5b0568 100644 --- a/setup/start/collectd/du.py +++ b/setup/start/collectd/du.py @@ -1,4 +1,4 @@ -import collectd,os,subprocess,sys +import collectd,os,subprocess,sys,re # https://www.programcreek.com/python/example/106897/collectd.register_read @@ -17,7 +17,23 @@ def du(pathinfo): return size except Exception as e: collectd.info('\terror getting the size of %s: %s' % (pathinfo['dir'], str(e))) - return -1 + return 0 + +def parseSize(size): + units = {"B": 1, "KB": 10**3, "MB": 10**6, "GB": 10**9, "TB": 10**12} + number, unit, _ = re.split('([a-zA-Z]+)', size.upper()) + return int(float(number)*units[unit]) + +def dockerSize(): + # use --format '{{json .}}' to dump the string. '{{if eq .Type "Images"}}{{.Size}}{{end}}' still creates newlines + cmd = 'timeout 1800 docker system df --format "{{.Size}}" | head -n1' + try: + size = subprocess.check_output(cmd, shell=True).strip().decode('utf-8') + collectd.info('\tsize of docker images is %s' % size) + return parseSize(size) + except Exception as e: + collectd.info('\terror getting docker images size : %s' % str(e)) + return 0 # configure is called for each module block. this is called before init def configure(config): @@ -50,9 +66,14 @@ def read(): # type comes from https://github.com/collectd/collectd/blob/master/src/types.db val = collectd.Values(type='capacity', plugin='du', plugin_instance=pathinfo['name']) - val.dispatch(values=[size], type_instance='usage') + size = dockerSize() + val = collectd.Values(type='capacity', plugin='du', plugin_instance='docker') + val.dispatch(values=[size], type_instance='usage') + + + collectd.register_init(init) collectd.register_config(configure) collectd.register_read(read, INTERVAL)