|
@@ -0,0 +1,62 @@
|
|
|
|
|
+#!/usr/bin/env python
|
|
|
|
|
+
|
|
|
|
|
+import errno
|
|
|
|
|
+import json
|
|
|
|
|
+import os
|
|
|
|
|
+from os import path
|
|
|
|
|
+import struct
|
|
|
|
|
+
|
|
|
|
|
+import gevent.pywsgi
|
|
|
|
|
+
|
|
|
|
|
+DATA_DIR = path.expanduser('~/sysvitals_data')
|
|
|
|
|
+
|
|
|
|
|
+def application(environ, start_response):
|
|
|
|
|
+ split = environ['PATH_INFO'][1:].split('/')
|
|
|
|
|
+ if split[0] == 'v1':
|
|
|
|
|
+ handler = handlers.get(split[2])
|
|
|
|
|
+ if handler:
|
|
|
|
|
+ start_response('200 OK', [('Content-type', 'text/plain')])
|
|
|
|
|
+ return [handler(split, environ)]
|
|
|
|
|
+ else:
|
|
|
|
|
+ print 'no handler for', split
|
|
|
|
|
+ else:
|
|
|
|
|
+ print 'split was', split
|
|
|
|
|
+
|
|
|
|
|
+formats = {
|
|
|
|
|
+ 'cpu': 'f',
|
|
|
|
|
+ 'mem': 'l',
|
|
|
|
|
+ 'net': 'l',
|
|
|
|
|
+ 'disk': 'l',
|
|
|
|
|
+}
|
|
|
|
|
+def datum(split, environ):
|
|
|
|
|
+ group = int(split[1])
|
|
|
|
|
+ body = json.load(environ['wsgi.input'])
|
|
|
|
|
+ client_id = body['client_id']
|
|
|
|
|
+ group_dir = path.join(DATA_DIR, str(group))
|
|
|
|
|
+ try:
|
|
|
|
|
+ os.makedirs(group_dir)
|
|
|
|
|
+ except OSError as e:
|
|
|
|
|
+ if e.errno != errno.EEXIST:
|
|
|
|
|
+ raise
|
|
|
|
|
+ with open(path.join(group_dir, str(client_id)), 'w') as f:
|
|
|
|
|
+ for stat_group, stats in body.items():
|
|
|
|
|
+ if stat_group == 'client_id':
|
|
|
|
|
+ continue
|
|
|
|
|
+ format_code = formats[stat_group]
|
|
|
|
|
+ for stat, data in stats.items():
|
|
|
|
|
+ key = '%s.%s' % (stat_group, stat)
|
|
|
|
|
+ write_stat(f, key.encode('utf-8'), format_code, data)
|
|
|
|
|
+ return '{"status": "ok"}'
|
|
|
|
|
+
|
|
|
|
|
+def write_stat(f, key, format_code, data):
|
|
|
|
|
+ fmt = '%dp 1440%s' % (len(key) + 1, format_code)
|
|
|
|
|
+ array = [0] * 1440
|
|
|
|
|
+ array[0] = data
|
|
|
|
|
+ f.write(struct.pack(fmt, key, *array))
|
|
|
|
|
+
|
|
|
|
|
+handlers = {
|
|
|
|
|
+ 'datum': datum,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+server = gevent.pywsgi.WSGIServer(('0.0.0.0', 8892), application)
|
|
|
|
|
+server.serve_forever()
|