-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
executable file
·75 lines (65 loc) · 2.53 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python
"""
Demo microservice that records player events.
"""
import os
from optparse import OptionParser
from flask import request
from flask_api import FlaskAPI, exceptions
from cassandra.cluster import Cluster
from structures import DynamicActionArray
from util import parse_timesamp, parse_action, cassandra_insert
import settings
parser = OptionParser()
parser.add_option("-p", "--port", dest="port",
default=settings.LOCAL_SERVER_PORT,
help="Port to listen on", type="int")
parser.add_option("-l", "--listen", dest="listen",
default=settings.LOCAL_SERVER_IP,
help="Address to listen on", type="string")
# FlaskAPI has an eye candy browser view
app = FlaskAPI(__name__)
data = DynamicActionArray(settings.ACTION_ARRAY_INIT_SIZE,
settings.ACTION_GROW_FACTOR,
settings.SCORE_VALUES)
# Cassandra startup
if settings.CASSANDRA_SUPPORT:
cluster = Cluster(settings.CASSANDRA_CLUSTER_IPS)
session = cluster.connect(settings.CASSANDRA_KEYSPACE)
@app.route('/', methods=['GET'])
def server_status():
"""
Display server status!
"""
return {'description': 'Stats Microservice',
'records': data.length,
'load': os.getloadavg()}
@app.route('/user/<int:uid>/', methods=['GET', 'POST'])
def user_stats(uid):
"""
Insert and query user events.
"""
if request.method == 'POST':
try:
timestamp = parse_timesamp(request.data.get('timestamp', ''))
action = parse_action(request.data.get('action', ''), min_action=1,
max_action=len(settings.SCORE_VALUES))
data.append(uid, action, timestamp)
if settings.CASSANDRA_SUPPORT:
cassandra_insert(session, uid, action, timestamp)
return {'message': 'ok'}
except Exception as ex:
raise exceptions.ParseError(
detail='{}: {}'.format(ex.__class__.__name__, ex.message))
if request.method == 'GET':
try:
start = parse_timesamp(request.args.get('start', ''))
end = parse_timesamp(request.args.get('end', ''))
return data.query(uid, start, end)
except Exception as ex:
raise exceptions.ParseError(
detail='{}: {}'.format(ex.__class__.__name__, ex.message))
if __name__ == '__main__':
app.debug = settings.LOCAL_SERVER_DEBUG
(options, args) = parser.parse_args()
app.run(host=options.listen, port=options.port)