Created
April 29, 2013 06:53
-
-
Save iromli/5480102 to your computer and use it in GitHub Desktop.
Flask extension to send data to FnordMetric
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
flask_fnordmetric | |
~~~~~~~~~~~~~~~~~ | |
:copyright: (c) 2013 by Isman Firmansyah. | |
:license: MIT, see LICENSE.txt for more details. | |
""" | |
import os | |
import json | |
import base64 | |
from redis import from_url as redis_from_url | |
class FnordMetric(object): | |
"""A class that acts as data shipper to FnordMetric Classic. | |
Typical usage: | |
.. code-block:: python | |
from flask import Flask | |
from flask.ext.fnordmetric import FnordMetric | |
FNORDMETRIC_REDIS_URL = 'redis://user:passwd@127.0.0.1:6379/0' | |
FNORDMETRIC_REDIS_PREFIX = 'fnordmetric' | |
app = Flask(__name__) | |
app.config.from_object(__name__) | |
fnord = FnordMetric(app) | |
# If you're using application factory: | |
# fnord = FnordMetric() | |
# fnord.init_app(app) | |
@app.route('/') | |
def foobar(): | |
extras = {'value': 1, 'gauge': 'sales_per_minute'} | |
fnord.push_event('_incr', extras=extras) | |
return 'sales_per_minute gauge has been incremented' | |
app.run(debug=True) | |
""" | |
def __init__(self, app=None): | |
self.redis = None | |
self.prefix = None | |
self.app = app | |
if app is not None: | |
self.init_app(app) | |
def init_app(self, app): | |
app.config.setdefault( | |
'FNORDMETRIC_REDIS_URL', 'redis://127.0.0.1:6379/0') | |
app.config.setdefault('FNORDMETRIC_REDIS_PREFIX', 'fnordmetric') | |
self.prefix = app.config['FNORDMETRIC_REDIS_PREFIX'] | |
self.redis = redis_from_url(app.config['FNORDMETRIC_REDIS_URL']) | |
if not hasattr(app, 'extensions'): | |
app.extensions = {} | |
app.extensions['fnordmetric'] = self | |
def push_event(self, event_type, extras=None): | |
assert self.app, \ | |
'FnordMetric extension is not initialized properly. ' \ | |
'Please make sure to call init_app() first.' | |
data = {'_type': event_type} | |
if isinstance(extras, dict): | |
data.update(extras) | |
event_id = base64.urlsafe_b64encode(os.urandom(33)) | |
self.redis.set( | |
'{0}-event-{1}'.format(self.prefix, event_id), json.dumps(data)) | |
self.redis.expire( | |
'{0}-event-{1}'.format(self.prefix, event_id), 60) | |
self.redis.lpush('{0}-queue'.format(self.prefix), event_id) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment