Bläddra i källkod

initial commit

Chris Mague 6 år sedan
incheckning
f5a5fd313f
6 ändrade filer med 134 tillägg och 0 borttagningar
  1. 2 0
      .gitignore
  2. 78 0
      GrafanaDatastoreServer.py
  3. 3 0
      README.md
  4. 8 0
      add_events.sh
  5. 34 0
      example.py
  6. 9 0
      requirements.txt

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+timeseries/*
+.vscode/*

+ 78 - 0
GrafanaDatastoreServer.py

@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+
+import argparse
+import redis
+import flask
+import calendar
+import dateutil.parser
+from gevent.wsgi import WSGIServer
+from flask import Flask, jsonify
+from flask_cors import CORS, cross_origin
+
+app = Flask(__name__)
+CORS(app)
+
+REDIS_POOL = None
+
+@app.route('/')
+@cross_origin()
+def hello_world():
+    return 'OK'
+
+@app.route('/search', methods=["POST", 'GET'])
+@cross_origin()
+def search():
+    redis_client = redis.Redis(connection_pool=REDIS_POOL)
+    return jsonify(redis_client.keys())
+
+def process_targets(targets, redis_client):
+    result = []
+    for target in targets:
+        if '*' in target:
+            result.extend(redis_client.keys(target))
+        else:
+            result.append(target)
+    return result
+
+@app.route('/query', methods=["POST", 'GET'])
+def query():
+    request = flask.request.get_json()
+    response = []
+
+    stime = calendar.timegm(dateutil.parser.parse(request['range']['from']).timetuple())
+    etime = calendar.timegm(dateutil.parser.parse(request['range']['to']).timetuple())
+
+    redis_client = redis.Redis(connection_pool=REDIS_POOL)
+    targets = process_targets([t['target'] for t in request['targets']], redis_client)
+
+    for target in targets:
+        args = ['ts.range', target, int(stime), int(etime)]
+        if 'intervalMs' in request and request['intervalMs'] > 0 and request['intervalMs']/1000 > 1:
+            args += ['avg', int(round(request['intervalMs']/1000))]
+        print(args)
+        redis_resp = redis_client.execute_command(*args)
+        datapoints = [(x2.decode("ascii"), x1*1000) for x1, x2 in redis_resp]
+        response.append(dict(target=target, datapoints=datapoints))
+    return jsonify(response)
+
+
+@app.route('/annotations')
+def annotations():
+    return jsonify([])
+
+def main():
+    global REDIS_POOL
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--host", help="server address to listen to", default="0.0.0.0")
+    parser.add_argument("--port", help="port number to listen to", default=8080, type=int)
+    parser.add_argument("--redis-server", help="redis server address", default="localhost")
+    parser.add_argument("--redis-port", help="redis server port", default=6379, type=int)
+    args = parser.parse_args()
+
+    REDIS_POOL = redis.ConnectionPool(host=args.redis_server, port=args.redis_port)
+
+    http_server = WSGIServer(('', args.port), app)
+    http_server.serve_forever()
+
+if __name__ == '__main__':
+    main()

+ 3 - 0
README.md

@@ -0,0 +1,3 @@
+docker run -p 6379:6379 -it --rm redislabs/redistimeseries
+docker run  --rm   -p 3000:3000   --name=grafana   -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource"   grafana/grafana
+

+ 8 - 0
add_events.sh

@@ -0,0 +1,8 @@
+#!/bin/bash
+
+declare -a arr=("registration" "login" "logout" "view")
+
+while true; do
+	echo "xadd mystream \"*\" event_type ${arr[$(($RANDOM % 4))]} user chris" | redis-cli
+	sleep 0.1
+done

+ 34 - 0
example.py

@@ -0,0 +1,34 @@
+#!/usr/bin/env python
+
+from redistimeseries.client import Client as RedisTimeSeries
+import redis
+import time
+
+redis_host = "localhost"
+redis_port = 6379
+
+rts = RedisTimeSeries(host=redis_host, port=redis_port)
+
+
+
+pool = redis.ConnectionPool(host=redis_host, port=redis_port)
+r = redis.Redis(connection_pool=pool)
+
+try:
+    r.xgroup_create("mystream", "consumerGroup", '$')
+except:
+    print("group already exists")
+
+while True:
+    msgs = r.xreadgroup("consumerGroup", "consumerName", streams={"mystream": '>'}, count=10, block=1000, noack=False)
+    for msg in msgs:
+        for m in msg[1]:
+            evnt = m[1]['event_type']
+            try:
+                rts.info(evnt)
+            except:
+                rts.create(evnt, retentionSecs=60, labels={'event_type': evnt})
+                rts.create(evnt+"_minute", retentionSecs=0, labels={'event_type': evnt})
+                rts.createrule(evnt, evnt+"_minute", 'count', 60)
+
+            rts.incrby(evnt,1)

+ 9 - 0
requirements.txt

@@ -0,0 +1,9 @@
+git+git://github.com/RedisTimeSeries/redistimeseries-py
+hiredis>=0.2.0
+redis>=2.10
+rmtest>=0.2
+six>=1.10.0
+gevent==1.2.1
+Flask>=0.12
+Flask-Cors==3.0.2
+python-dateutil==2.6.0