Skip to content

Commit

Permalink
Docker monitoring plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
vfuse committed Mar 7, 2018
1 parent b8ba4f7 commit d07593f
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 1 deletion.
2 changes: 1 addition & 1 deletion nixstatsagent/nixstatsagent.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
import urllib2


__version__ = '1.1.39'
__version__ = '1.1.40'

__FILEABSDIRNAME__ = os.path.dirname(os.path.abspath(__file__))

Expand Down
74 changes: 74 additions & 0 deletions nixstatsagent/plugins/docker.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import plugins
import time


class Plugin(plugins.BasePlugin):
__name__ = 'docker'

def run(self, config):
'''
Docker monitoring, needs sudo access!
Instructions at:
https://help.nixstats.com/en/article/monitoring-docker-9st778/
'''
containers = {}
last_value = {}
prev_cache = self.get_agent_cache() # Get absolute values from previous check
try:
lines = [s.split(' / ') for s in os.popen('sudo docker stats --no-stream --no-trunc --format "{{.CPUPerc}} / {{.Name}} / {{.ID}} / {{.MemUsage}} / {{.NetIO}} / {{.BlockIO}} / {{.MemPerc}}"').read().splitlines()]
for row in lines:
container = {}
container['cpu'] = row[0].strip('%')
name = row[1]
container_id = row[2]
container['mem_usage_bytes'] = self.computerReadable(row[3])
container['mem_total_bytes'] = self.computerReadable(row[4])
container['net_in_bytes'] = self.absolute_to_per_second('%s_%s' % (name, 'net_in_bytes'), self.computerReadable(row[5]), prev_cache)
container['net_out_bytes'] = self.absolute_to_per_second('%s_%s' % (name, 'net_out_bytes'), self.computerReadable(row[6]), prev_cache)
container['disk_in_bytes'] = self.absolute_to_per_second('%s_%s' % (name, 'disk_in_bytes'), self.computerReadable(row[7]), prev_cache)
container['disk_out_bytes'] = self.absolute_to_per_second('%s_%s' % (name, 'disk_out_bytes'), self.computerReadable(row[8]), prev_cache)
container['mem_pct'] = row[9].strip('%')

last_value['%s_%s' % (name, 'mem_usage_bytes')] = self.computerReadable(row[3])
last_value['%s_%s' % (name, 'net_in_bytes')] = self.computerReadable(row[5])
last_value['%s_%s' % (name, 'net_out_bytes')] = self.computerReadable(row[6])
last_value['%s_%s' % (name, 'disk_in_bytes')] = self.computerReadable(row[7])
last_value['%s_%s' % (name, 'disk_out_bytes')] = self.computerReadable(row[8])
containers[name] = container
except Exception as e:
return e.message
containers['containers'] = len(containers)
last_value['ts'] = time.time()
self.set_agent_cache(last_value)

return containers

def computerReadable(self, value):
if value[-3:] == 'KiB':
return float(value[:-3])*1024
elif value[-3:] == 'MiB':
return float(value[:-3])*1024*1024
elif value[-3:] == 'GiB':
return float(value[:-3])*1024*1024*1024
elif value[-3:] == 'TiB':
return float(value[:-3])*1024*1024*1024*1024
elif value[-3:] == 'PiB':
return float(value[:-3])*1024*1024*1024*1024*1024
elif value[-2:] == 'kB':
return float(value[:-2])*1024
elif value[-2:] == 'MB':
return float(value[:-2])*1024*1024
elif value[-2:] == 'GB':
return float(value[:-2])*1024*1024*1024
elif value[-2:] == 'TB':
return float(value[:-2])*1024*1024*1024*1024
elif value[-2:] == 'PB':
return float(value[:-2])*1024*1024*1024*1024*1024
elif value[-1:] == 'B':
return float(value[:-1])

if __name__ == '__main__':
Plugin().execute()

0 comments on commit d07593f

Please sign in to comment.