2013-12-12 01:33:01 +00:00

99 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python
import os
import errno
from resource import getpagesize
USING_COLLECTD=0
try:
import collectd
USING_COLLECTD=1
except:
pass
def get_unmounts(mountpath="/srv/node/"):
try:
candidates = [ x for x in os.listdir(mountpath) if os.path.isdir(mountpath + x) ]
except OSError as e:
if e.errno != errno.ENOENT:
raise
return 0
mounts = []
with open('/proc/mounts', 'r') as procmounts:
for line in procmounts:
_, mounted_path, _, _, _, _ = line.rstrip().split()
if mounted_path.startswith(mountpath):
mounts.append(mounted_path.split('/')[-1])
return len(set(candidates) - set(mounts))
def get_sockstats():
sockstat = {}
try:
with open('/proc/net/sockstat') as proc_sockstat:
for entry in proc_sockstat:
if entry.startswith("TCP: inuse"):
tcpstats = entry.split()
sockstat['tcp_in_use'] = int(tcpstats[2])
sockstat['orphan'] = int(tcpstats[4])
sockstat['time_wait'] = int(tcpstats[6])
sockstat['tcp_mem_allocated_bytes'] = \
int(tcpstats[10]) * getpagesize()
except OSError as e:
if e.errno != errno.ENOENT:
raise
try:
with open('/proc/net/sockstat6') as proc_sockstat6:
for entry in proc_sockstat6:
if entry.startswith("TCP6: inuse"):
sockstat['tcp6_in_use'] = int(entry.split()[2])
except IOError as e:
if e.errno != errno.ENOENT:
raise
return sockstat
def get_all():
stats = {}
stats['socket'] = get_sockstats()
stats['unmounts'] = get_unmounts()
return stats
def config_callback(conf):
pass
def read_callback():
stats = get_all()
if not stats:
return
# blarg, this should be fixed
for key in stats.keys():
path = "%s" % key
value = stats[key]
if type(value) != type({}):
# must be an int
val = collectd.Values(plugin=path)
val.type = 'gauge'
val.values = [int(value)]
val.dispatch()
else:
# must be a hash
for subvalue in value.keys():
path = '%s.%s' % (key, subvalue)
val = collectd.Values(plugin=path)
val.type = 'gauge'
val.values = [int(value[subvalue])]
val.dispatch()
if not USING_COLLECTD:
stats = get_all()
print stats
else:
collectd.register_config(config_callback)
collectd.register_read(read_callback)