GrafanaDatastoreServer.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/env python
  2. import argparse
  3. import redis
  4. import flask
  5. import calendar
  6. import dateutil.parser
  7. from gevent.wsgi import WSGIServer
  8. from flask import Flask, jsonify
  9. from flask_cors import CORS, cross_origin
  10. app = Flask(__name__)
  11. CORS(app)
  12. REDIS_POOL = None
  13. @app.route('/')
  14. @cross_origin()
  15. def hello_world():
  16. return 'OK'
  17. @app.route('/search', methods=["POST", 'GET'])
  18. @cross_origin()
  19. def search():
  20. redis_client = redis.Redis(connection_pool=REDIS_POOL)
  21. return jsonify(redis_client.keys())
  22. def process_targets(targets, redis_client):
  23. result = []
  24. for target in targets:
  25. if '*' in target:
  26. result.extend(redis_client.keys(target))
  27. else:
  28. result.append(target)
  29. return result
  30. @app.route('/query', methods=["POST", 'GET'])
  31. def query():
  32. request = flask.request.get_json()
  33. response = []
  34. stime = calendar.timegm(dateutil.parser.parse(request['range']['from']).timetuple())
  35. etime = calendar.timegm(dateutil.parser.parse(request['range']['to']).timetuple())
  36. redis_client = redis.Redis(connection_pool=REDIS_POOL)
  37. targets = process_targets([t['target'] for t in request['targets']], redis_client)
  38. for target in targets:
  39. args = ['ts.range', target, int(stime), int(etime)]
  40. if 'intervalMs' in request and request['intervalMs'] > 0 and request['intervalMs']/1000 > 1:
  41. args += ['avg', int(round(request['intervalMs']/1000))]
  42. print(args)
  43. redis_resp = redis_client.execute_command(*args)
  44. datapoints = [(x2.decode("ascii"), x1*1000) for x1, x2 in redis_resp]
  45. response.append(dict(target=target, datapoints=datapoints))
  46. return jsonify(response)
  47. @app.route('/annotations')
  48. def annotations():
  49. return jsonify([])
  50. def main():
  51. global REDIS_POOL
  52. parser = argparse.ArgumentParser()
  53. parser.add_argument("--host", help="server address to listen to", default="0.0.0.0")
  54. parser.add_argument("--port", help="port number to listen to", default=8080, type=int)
  55. parser.add_argument("--redis-server", help="redis server address", default="localhost")
  56. parser.add_argument("--redis-port", help="redis server port", default=6379, type=int)
  57. args = parser.parse_args()
  58. REDIS_POOL = redis.ConnectionPool(host=args.redis_server, port=args.redis_port)
  59. http_server = WSGIServer(('', args.port), app)
  60. http_server.serve_forever()
  61. if __name__ == '__main__':
  62. main()