From 19a49604469da375a147ea4b1fa00d6911d6aaa8 Mon Sep 17 00:00:00 2001 From: Amit Saha Date: Sat, 29 Apr 2017 21:02:25 +1000 Subject: [PATCH] flask app prometheus update --- .gitignore | 3 ++ flask_app_promethus/Dockerfile.py2 | 4 +-- flask_app_promethus/Dockerfile.py3 | 4 +-- flask_app_promethus/README.md | 14 ++++----- flask_app_promethus/flask_app.py | 30 ------------------- flask_app_promethus/src/flask_app.py | 21 +++++++++++++ flask_app_promethus/src/middleware.py | 23 ++++++++++++++ .../{ => src}/requirements.txt | 0 8 files changed, 56 insertions(+), 43 deletions(-) delete mode 100644 flask_app_promethus/flask_app.py create mode 100644 flask_app_promethus/src/flask_app.py create mode 100644 flask_app_promethus/src/middleware.py rename flask_app_promethus/{ => src}/requirements.txt (100%) diff --git a/.gitignore b/.gitignore index 72364f9..fd582e6 100644 --- a/.gitignore +++ b/.gitignore @@ -87,3 +87,6 @@ ENV/ # Rope project settings .ropeproject + +# Misc +.DS_Store diff --git a/flask_app_promethus/Dockerfile.py2 b/flask_app_promethus/Dockerfile.py2 index 13446e0..f8ab4de 100644 --- a/flask_app_promethus/Dockerfile.py2 +++ b/flask_app_promethus/Dockerfile.py2 @@ -7,8 +7,8 @@ RUN set -e; \ libc-dev \ linux-headers \ ; \ - pip install -r requirements.txt; \ + pip install -r src/requirements.txt; \ apk del .build-deps; EXPOSE 5000 -RUN python --version +VOLUME /application CMD uwsgi --http :5000 --manage-script-name --mount /myapplication=flask_app:app --enable-threads --processes 5 diff --git a/flask_app_promethus/Dockerfile.py3 b/flask_app_promethus/Dockerfile.py3 index ac3ecea..46d7efa 100644 --- a/flask_app_promethus/Dockerfile.py3 +++ b/flask_app_promethus/Dockerfile.py3 @@ -7,8 +7,8 @@ RUN set -e; \ libc-dev \ linux-headers \ ; \ - pip install -r requirements.txt; \ + pip install -r src/requirements.txt; \ apk del .build-deps; EXPOSE 5000 -RUN python --version +VOLUME /application CMD uwsgi --http :5000 --manage-script-name --mount /myapplication=flask_app:app --enable-threads --processes 5 diff --git a/flask_app_promethus/README.md b/flask_app_promethus/README.md index 363c95f..c9f844d 100644 --- a/flask_app_promethus/README.md +++ b/flask_app_promethus/README.md @@ -1,3 +1,7 @@ +# Example Flask application + +See ``src`` for the application code. + ## Building Docker image Python 3: @@ -6,18 +10,10 @@ Python 3: $ docker build -t amitsaha/flask_app -f Dockerfile.py3 . ``` -Python 2: - -``` -$ docker build -t amitsaha/flask_app -f Dockerfile.py2 . -``` - ## Running the application ``` -$ docker run -P amitsaha/flask_app - -$ docker ps # will show the mapped port on the host +$ docker run -ti -p 5000:5000 -v `pwd`/src:/application amitsaha/flask_app ``` ## Bringing up the web application, along with prometheus diff --git a/flask_app_promethus/flask_app.py b/flask_app_promethus/flask_app.py deleted file mode 100644 index d98cbb3..0000000 --- a/flask_app_promethus/flask_app.py +++ /dev/null @@ -1,30 +0,0 @@ -from flask import Flask, request, Response -import prometheus_client -from prometheus_client import start_http_server, Counter - -REQUEST_COUNT = Counter('request_count', 'App Request Count', - ['app_name', 'method', 'endpoint', 'http_status']) -app = Flask(__name__) - -CONTENT_TYPE_LATEST = str('text/plain; version=0.0.4; charset=utf-8') - -@app.after_request -def increment_request_count(response): - REQUEST_COUNT.labels('test_app', request.method, request.path, - response.status_code).inc() - return response - - -# Expose a metrics endpoint to return -# prometheus metrics -@app.route('/metrics') -def metrics(): - return Response(prometheus_client.generate_latest(), - mimetype=CONTENT_TYPE_LATEST) - -@app.route('/test') -def test(): - return 'rest' - -if __name__ == '__main__': - app.run(debug=True) diff --git a/flask_app_promethus/src/flask_app.py b/flask_app_promethus/src/flask_app.py new file mode 100644 index 0000000..29e9546 --- /dev/null +++ b/flask_app_promethus/src/flask_app.py @@ -0,0 +1,21 @@ +from flask import Flask +from middleware import setup_metrics + +app = Flask(__name__) +setup_metrics(app) + +@app.route('/test/') +def test(): + return 'rest' + +@app.route('/test1/') +def test1(): + 1/0 + return 'rest' + +@app.errorhandler(500) +def handle_500(error): + return str(error), 500 + +if __name__ == '__main__': + app.run() diff --git a/flask_app_promethus/src/middleware.py b/flask_app_promethus/src/middleware.py new file mode 100644 index 0000000..60bb845 --- /dev/null +++ b/flask_app_promethus/src/middleware.py @@ -0,0 +1,23 @@ +from flask import request +import time +import sys + +def start_timer(): + request.start_time = time.time() + +def stop_timer(response): + resp_time = time.time() - request.start_time + sys.stderr.write("Response time: %ss\n" % resp_time) + return response + +def record_request_data(response): + sys.stderr.write("Request path: %s Request method: %s Response status: %s\n" % + (request.path, request.method, response.status_code)) + return response + +def setup_metrics(app): + app.before_request(start_timer) + # The order here matters since we want stop_timer + # to be executed first + app.after_request(record_request_data) + app.after_request(stop_timer) diff --git a/flask_app_promethus/requirements.txt b/flask_app_promethus/src/requirements.txt similarity index 100% rename from flask_app_promethus/requirements.txt rename to flask_app_promethus/src/requirements.txt