#cat > /usr/lib64/ganglia/python_modules/Hdfsmetrics.py <<EOF
import re
# Handler of Metrics
def Hdfsmetrics_handler(name):
log_file = "/var/log/hadoop/hdfsmetrics.log"
tmp_file = "/tmp/hdfs_"+name+".log"
olog = ""
nlog = ""
# Read old data
try:
fp = open( tmp_file )
olog = fp.read(2000)
fp.close()
except:
pass
# Read new data
try:
fp = open( log_file )
# Read the last 2000 byte of the log file.
fp.seek(0, 2)
if fp.tell() > 2000:
fp.seek(-2000, 2)
else:
fp.seek(0,0)
nlog = fp.read(2000)
fp.close()
except:
pass
# Look for the 'name' value.
r = re.compile( '([A-Za-z_]+)=([0-9]*)' )
result = 0
# Check old data
l = r.findall(olog)
for v in l:
if v[0] == name:
result = int(v[1])
# Check new data
l = r.findall(nlog)
for v in l:
if v[0] == name:
result = int(v[1])
try:
fp = open( tmp_file, 'w' )
fp.write(nlog)
fp.close()
except:
pass
return result
# The list of descriptors
_descriptors = []
# Make descriptor
def make_descriptor(name, units):
descriptor = {'call_back': Hdfsmetrics_handler,
'time_max': 60,
'value_type': 'uint',
'slope': 'both',
'format': '%u',
'groups': 'Hdfsmetrics'}
descriptor['name'] = name
descriptor['description'] = name
descriptor['units'] = units
return descriptor
# This method is called first and returns descriptors
def metric_init(params):
global _descriptors
_descriptors = []
_descriptors.append( make_descriptor('BlocksTotal', 'blocks') )
_descriptors.append( make_descriptor('CapacityRemainingGB', 'GB') )
_descriptors.append( make_descriptor('CapacityTotalGB', 'GB') )
_descriptors.append( make_descriptor('CapacityUsedGB', 'GB') )
_descriptors.append( make_descriptor('FilesTotal', 'files') )
_descriptors.append( make_descriptor('PendingReplicationBlocks', 'blocks') )
_descriptors.append( make_descriptor('ScheduledReplicationBlocks', 'blocks') )
_descriptors.append( make_descriptor('UnderReplicatedBlocks', 'blocks') )
return _descriptors
# Nothing to do
def metric_cleanup():
pass
#This code is for debugging and unit testing
if __name__ == '__main__':
metric_init(None)
for d in _descriptors:
v = d['call_back'](d['name'])
print 'value for %s is %u [%s]' % (d['name'], v, d['units'])
EOF