Files
weave-scope/extras/example/app/app.py
2017-07-13 16:11:59 +00:00

94 lines
2.5 KiB
Python

import socket
import sys
import requests
import threading
import logging
import argparse
from concurrent.futures import ThreadPoolExecutor
from flask import Flask
from redis import Redis
from werkzeug.serving import WSGIRequestHandler
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
pool = ThreadPoolExecutor(max_workers=10)
sessions = threading.local()
args = None
def do_redis():
redis.incr('hits')
return redis.get('hits')
def do_qotd():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.settimeout(args.timeout)
s.connect((args.qotd, 4446))
s.send("Hello")
return s.recv(1024)
finally:
s.close()
def do_search():
if getattr(sessions, 'session', None) is None:
sessions.session = requests.Session()
r = sessions.session.get(args.search, timeout=args.timeout)
return r.text
def do_echo(text):
if getattr(sessions, 'session', None) is None:
sessions.session = requests.Session()
r = sessions.session.get(args.echo, data=text, timeout=args.timeout)
return r.text
def ignore_error(f):
try:
return str(f())
except:
logging.error("Error executing function", exc_info=sys.exc_info())
return "Error"
# this root is for the tracing demo
@app.route('/hello')
def hello():
qotd_msg = do_qotd()
qotd_msg = do_echo(qotd_msg)
return qotd_msg
# this is for normal demos
@app.route('/')
def root():
counter_future = pool.submit(do_redis)
search_future = pool.submit(do_search)
qotd_future = pool.submit(do_qotd)
echo_future = pool.submit(lambda: do_echo("foo"))
result = 'Hello World! I have been seen %s times.' % ignore_error(
counter_future.result)
result += ignore_error(search_future.result)
result += ignore_error(qotd_future.result)
result += ignore_error(echo_future.result)
return result
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-redis', default="redis.weave.local")
parser.add_argument('-search', default="http://search.weave.local:80/")
parser.add_argument('-qotd', default="qotd.weave.local")
parser.add_argument('-echo', default="http://echo.weave.local:80/")
parser.add_argument('-timeout', default=0.5, type=float)
args = parser.parse_args()
logfmt = '%(asctime)s %(levelname)s %(filename)s:%(lineno)d - %(message)s'
logging.basicConfig(format=logfmt, level=logging.INFO)
WSGIRequestHandler.protocol_version = "HTTP/1.1"
app.run(host="0.0.0.0", port=80, debug=True)