/python/nginxstats.py
Python | 89 lines | 68 code | 20 blank | 1 comment | 14 complexity | 3d67df91b545e58c8877e70de08d90c2 MD5 | raw file
Possible License(s): MIT, LGPL-2.1, MPL-2.0-no-copyleft-exception, GPL-3.0, AGPL-1.0
- #!/usr/bin/env python
- import re
- import sys
- import time
- import urllib
- TIME_SLEEP = 30
- def get_data(url):
- data = urllib.urlopen(url)
- data = data.read()
- result = {}
- match1 = re.search(r'Active connections:\s+(\d+)', data)
- match2 = re.search(r'\s*(\d+)\s+(\d+)\s+(\d+)', data)
- match3 = re.search(r'Reading:\s*(\d+)\s*Writing:\s*(\d+)\s*'
- 'Waiting:\s*(\d+)', data)
- if not match1 or not match2 or not match3:
- raise Exception('Unable to parse %s' % url)
- result['connections'] = int(match1.group(1))
- result['accepted'] = int(match2.group(1))
- result['handled'] = int(match2.group(2))
- result['requests'] = int(match2.group(3))
- result['reading'] = int(match3.group(1))
- result['writing'] = int(match3.group(2))
- result['waiting'] = int(match3.group(3))
- return result
- def main():
- url = sys.argv[1]
- prev = None
- next = time.time() + TIME_SLEEP
- total = None
- count = 0
- try:
- while True:
- data = get_data(url)
- if prev:
- result = print_stat(prev, data)
- if total is None:
- total = list(result)
- else:
- for i, v in enumerate(result):
- total[i] += v
- count += 1
- else:
- print_head()
- prev = data
- time.sleep(next - time.time())
- next += TIME_SLEEP
- except KeyboardInterrupt:
- if total:
- print_foot(total, count)
- def print_foot(total, count):
- total = [v / count for v in total]
- print '-------- ---------- ---------- ----- ----- -----'
- print '%8d %10.2f %10.2f %5d %5d %5d' % tuple(total)
- def print_head():
- print '%-8s %-10s %-10s %-5s %-5s %-5s' % (
- 'Conn', 'Conn/s', 'Request/s', 'Read', 'Write', 'Wait')
- print '-------- ---------- ---------- ----- ----- -----'
- def print_stat(prev, data):
- result = (
- data['connections'],
- float(data['accepted'] - prev['accepted']) / TIME_SLEEP,
- float(data['requests'] - prev['requests']) / TIME_SLEEP,
- data['reading'],
- data['writing'],
- data['waiting'])
- print '%8d %10.2f %10.2f %5d %5d %5d' % result
- return result
-
- if __name__ == '__main__':
- main()