Hello,
I needed a script to pump Disk IO metrics into ganglia, so I wrote
one that hooks in to Performance CoPilot to get the read/write metrics
and then pumps them out to Ganglia. You'll need Performance CoPilot and
a base python install. Thought I would post it in case someone else had
the same itch.
Best Regards,
Jason Williams
>>>>>>>>SCRIPT: gmetric_diskio.py
#!/usr/bin/python
###############################################################
# gmetric For Disk IO
###############################################################
# REQs: pminfo, gmetric
# DATE: 21 December 2004
# (C)2004 DigiTar, All Rights Reserved
###############################################################
import os, re, time
### Set Sampling Interval (in secs)
interval = 1
### Set PCP Config Parameters
cmdPminfo = "/usr/bin/pminfo -f "
reDiskIO = re.compile(r'"(\w+)"] value (\d+)\n') # RegEx To Compute
Value
### Set Ganglia Config Parameters
gangliaMetricType = "uint32"
gangliaMcastPort = "8649"
### NOTE: To add a new PCP disk metric, add the appropriate entry to
each dictionary item of gangliaMetrics
### Each "vertical" column of the dictionary is a different metric
entry group.
gangliaMetrics = { "pcpmetric": ["disk.dev.read", "disk.dev.write",
"disk.dev.blkread", "disk.dev.blkwrite"], \
"name": ["diskio_readbytes", "diskio_writebytes",
"diskio_readblks", "diskio_writeblks"], \
"unit": ["Kbytes/s", "Kbytes/s", "Blocks/s", "Blocks/s"], \
"type": ["uint32", "uint32", "uint32", "uint32"]}
cmdGmetric = "/usr/bin/gmetric"
### Zero Sample Lists
### NOTE: Make sure each sample array has as many (device) sub-arrays as
there are pcpmetrics being sampled
### NOTE: Sub-arrays are artificially sized at 4 disk devices...if you
have more disk devices than 4, increase this size.
lastSample = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
currSample = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
### Read PCP Metrics
while(1):
# Interate Through Each PCP Disk IO Metric Desired
for x in range(0, len(gangliaMetrics["pcpmetric"])):
pminfoInput, pminfoOutput = os.popen2(cmdPminfo +
gangliaMetrics["pcpmetric"][x], 't')
deviceLines = pminfoOutput.readlines()
pminfoInput.close()
pminfoOutput.close()
# Output Metric Data For Each Device Returned By The PCP Metric
deviceIndex = 2 # Skip the first two lines in the buffer
while(deviceIndex < len(deviceLines)):
result = reDiskIO.search(deviceLines[deviceIndex])
if(result):
currSample[x][deviceIndex] = int(result.group(2))
cmdExec = cmdGmetric + " --name=" + gangliaMetrics["name"][x] + "_"
+ \
result.group(1) + " --value=" + str((currSample[x][deviceIndex]
- lastSample[x][deviceIndex])) + \
" --type=" + gangliaMetrics["type"][x] + " --units=\"" +
gangliaMetrics["unit"][x] + "\"" + \
" --mcast_port=" + gangliaMcastPort
gmetricResult = os.system(cmdExec)
lastSample[x][deviceIndex] = currSample[x][deviceIndex]
deviceIndex = deviceIndex + 1
time.sleep(interval)
gmetric_diskio.py
Description: gmetric_diskio.py
