You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
smart-top/src/api/index.py

113 lines
2.6 KiB
Python

"""
This is a RESTful interface implemented using Flask micro framework.
The API is driven by configuration that is organized in terms of the monitoring classes
We designed the classes to be reusable (and powered by labels):
'monitoring-type':
'class':'<class-name>'
'config':<labeled-class-specific-configuration>'
"""
from flask import Flask, session, request, redirect, Response
from flask.templating import render_template
from flask_session import Session
import time
import sys
import os
import json
import re
import monitor
import Queue
from utils.transport import *
PARAMS = {'context':''}
if len(sys.argv) > 1:
N = len(sys.argv)
for i in range(1,N):
value = None
if sys.argv[i].startswith('--'):
key = sys.argv[i].replace('-','')
if i + 1 < N:
value = sys.argv[i + 1] = sys.argv[i+1].strip()
if key and value:
PARAMS[key] = value
i += 2
app = Flask(__name__)
f = open(PARAMS['path'])
CONFIG = json.loads(f.read())
HANDLERS= {}
for key in CONFIG :
if key == "monitor":
continue
className = CONFIG[key]['class']
ref = "".join(["monitor.",className,"()"])
ref = eval(ref)
#ref.init(CONFIG[key]['config'])
HANDLERS[key] = {"class":ref,"config":CONFIG[key]["config"]}
f.close()
#
#
from threading import Thread, RLock
p = {'uri':'http://localhost:5984','dbname':'monitor','uid':'logs','filename':'logs.JSON'}
factory = DataSourceFactory()
gWriter = factory.instance(type='CouchdbWriter',args=p)
gReader = factory.instance(type='CouchdbReader',args=p)
mthread = monitor.Monitor(HANDLERS,gWriter,'processes',)
mthread.start()
#(Timer(10,mthread.run)).start()
#mthread = Process(target=monitor.Monitor,args=(HANDLERS,ProcessQueue,'processes'))
#mthread.start()
@app.route('/get/<id>')
def procs(id):
try:
d = gReader.basic_read()
r = {}
for label in d :
index = len(d[label]) - 1
r[label] = d[label][index]
except Exception, e:
print e
r = []
return json.dumps(r)
@app.route('/trends')
def trends ():
id = request.args.get('id')
r = gReader.basic_read()
if id in r:
r = r[id]
series = {}
for row in r:
for item in row:
id = item['label']
if id not in series :
series[id] = []
series[id].append(item)
if len(series[id]) > 24 :
beg = len(series[id]) - 25
series[id] = series[id][beg:]
return json.dumps(series)
else:
return "[]"
@app.route('/dashboard')
def dashboard():
context = PARAMS['context']
return render_template('dashboard.html',context=context)
if __name__== '__main__':
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX=?RT'
app.run(host='0.0.0.0',debug=True,threaded=True)