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

121 lines
2.9 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['monitor'] :
className = CONFIG['monitor'][key]['class']
ref = "".join(["monitor.",className,"()"])
ref = eval(ref)
HANDLERS[key] = {"class":ref,"config":CONFIG['monitor'][key]["config"]}
f.close()
#
#
from threading import Thread, RLock
p = {'uri':'http://dev.the-phi.com: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',)
@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)
"""
This function/endpoint will assess n-virtual environments and return the results
@TODO: Should this be stored for future mining (I don't think so but could be wrong)
"""
@app.route('/sandbox')
def sandbox():
if 'sandbox' in HANDLERS:
handler = HANDLERS['sandbox']['class']
conf = HANDLERS['sandbox']['config']
r = []
for id in conf:
handler.init(conf[id])
r.append (dict(handler.composite(),**{"label":id}))
else:
print 'Oops'
r = []
return json.dumps(r)
@app.route('/trends')
def trends ():
id = request.args.get('id')
app = request.args.get('app').strip()
r = gReader.basic_read()
if id in r:
r = r[id] #--matrix
series = []
for row in r:
series += [item for item in row if str(item['label'])== app]
if len(series) > 24 :
beg = len(series) - 25
series = series[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__':
mthread.start()
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX=?RT'
app.run(host='0.0.0.0',debug=True,threaded=True)