Source code for flask_stats
# -*- coding: utf-8 -*-
import time
import flask
from flask import request
from statsd import StatsClient
__author__ = 'Chris Trotman'
__email__ = 'chris@trotman.io'
__version__ = '0.1.0'
class _StatsClient(StatsClient):
def flask_time_start(self):
if not hasattr(flask.g, 'extensions'):
flask.g.extensions = {}
flask.g.extensions.setdefault('stats', {})
flask.g.extensions['stats'][self] = time.time()
def flask_time_end(self, response):
end_time = time.time()
start_time = flask.g.extensions['stats'][self]
total_time = end_time - start_time
time_in_ms = total_time * 1000
endpoint = str(request.endpoint)
with self.pipeline() as pipeline:
if request.endpoint is not None:
pipeline.timing(endpoint, time_in_ms)
pipeline.incr(
'%s.http_%s' % (endpoint, response.status_code)
)
return response
[docs]class Stats(object):
def __init__(self, app=None):
if app:
self.app = app
self.client = self.init_app(app)
else:
self.app = None
self.client = None
[docs] def init_app(self, app):
"""Inititialise the extension with the app object.
:param app: Your application object
"""
host = app.config.get('STATS_HOSTNAME', 'localhost')
port = app.config.get('STATS_PORT', 8125)
base_key = app.config.get('STATS_BASE_KEY', app.name)
client = _StatsClient(
host=host,
port=port,
prefix=base_key,
)
app.before_request(client.flask_time_start)
app.after_request(client.flask_time_end)
if not hasattr(app, 'extensions'):
app.extensions = {}
app.extensions.setdefault('stats', {})
app.extensions['stats'][self] = client
return client
def __getattr__(self, name):
return getattr(self.client, name, None)