/disk/diskio.py/diskio.py
Python | 58 lines | 32 code | 7 blank | 19 comment | 4 complexity | c2f54280d6970628f1c7362d2bf95522 MD5 | raw file
- #!/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)