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

89 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python
import os
import re
import errno
import subprocess
USING_COLLECTD=0
try:
import collectd
USING_COLLECTD=1
except:
pass
# ===============================================================================
# [2012-06-19 21:37:04] Checking ring md5sum's on 3 hosts...
# 3/3 hosts matched, 0 error[s] while checking hosts.
# ===============================================================================
def get_md5sums():
retval = 0
output = subprocess.Popen(['swift-recon', '--objmd5'], stdout=subprocess.PIPE).communicate()[0]
for line in output.split("\n"):
result = re.search("([0-9]+) error", line)
if result:
retval = result.group(1)
return retval
# ===============================================================================
# [2012-06-19 21:36:27] Checking replication times on 3 hosts...
# [Replication Times] shortest: 0.00546943346659, longest: 0.00739345153173, avg: 0.00669538444943
# ===============================================================================
def get_replication_times():
retval = {}
output = subprocess.Popen(['swift-recon', '-r'], stdout=subprocess.PIPE).communicate()[0]
for line in output.split("\n"):
result = re.search("shortest: ([0-9\.]+), longest: ([0-9\.]+), avg: ([0-9\.]+)", line)
if result:
retval['shortest'] = float(result.group(1))
retval['longest'] = float(result.group(2))
retval['average'] = float(result.group(3))
return retval
def get_all():
stats = {}
stats['md5sums'] = get_md5sums()
stats['replication_times'] = get_replication_times()
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'
if type(value[subvalue]) == type("string"):
val.values = [int(value[subvalue])]
else:
val.values = value[subvalue]
val.dispatch()
if not USING_COLLECTD:
stats = get_all()
print stats
else:
collectd.register_config(config_callback)
collectd.register_read(read_callback)