Skip to content

Instantly share code, notes, and snippets.

@iromli
Created April 29, 2013 06:53
Show Gist options
  • Save iromli/5480102 to your computer and use it in GitHub Desktop.
Save iromli/5480102 to your computer and use it in GitHub Desktop.
Flask extension to send data to FnordMetric
# -*- 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