Skip to content

Commit

Permalink
More general cleanup and compatibility with Flask. sentry.db.backend …
Browse files Browse the repository at this point in the history
…is now sentry.db
  • Loading branch information
dcramer committed May 8, 2011
1 parent a76c926 commit 74ecfbd
Show file tree
Hide file tree
Showing 12 changed files with 98 additions and 78 deletions.
11 changes: 6 additions & 5 deletions .gitignore
@@ -1,14 +1,15 @@
/build
/dist
/*.egg-info
*.egg
*.db
*.egg
*.pid
*.pyc
*.log
pip-log.txt
.DS_Store
/build
/dist
/*.egg-info
/example_project/local_settings.py
/docs/html
/docs/doctrees
/sentry_index
/sentry/sentry_index/
/sentry/sentry_index/
14 changes: 12 additions & 2 deletions sentry/__init__.py
Expand Up @@ -84,12 +84,22 @@

try:
VERSION = __import__('pkg_resources') \
.get_distribution('django-sentry').version
.get_distribution('sentry').version
except Exception, e:
VERSION = 'unknown'

from flask import Flask
from flask import Flask

from sentry.db import get_backend
from sentry.web.views import frontend

app = Flask(__name__)

# Build configuration
app.config.from_object('sentry.conf.SentryConfig')
app.config.from_envvar('SENTRY_SETTINGS', silent=True)

# Register views
app.register_module(frontend)

db = get_backend(app)
2 changes: 1 addition & 1 deletion sentry/client/__init__.py
@@ -1,4 +1,4 @@
from flask import current_app as app
from sentry import app

_client = (None, None)

Expand Down
2 changes: 1 addition & 1 deletion sentry/client/base.py
Expand Up @@ -7,7 +7,7 @@
import time
import urllib2

from flask import current_app as app
from sentry import app

import sentry
from sentry.helpers import construct_checksum, force_unicode, get_signature, \
Expand Down
2 changes: 1 addition & 1 deletion sentry/client/django/models.py
Expand Up @@ -7,7 +7,7 @@
from django.core.signals import got_request_exception
from django.db import transaction

from flask import current_app as app
from sentry import app

from sentry.client import get_client

Expand Down
11 changes: 7 additions & 4 deletions sentry/conf/__init__.py
Expand Up @@ -10,8 +10,7 @@
class SentryConfig(object):
ROOT = os.path.normpath(os.path.join(os.path.dirname(__file__), os.pardir))

# Allow local testing of Sentry even if DEBUG is enabled
DEBUG = False
DEBUG = True

DATABASE_USING = None

Expand Down Expand Up @@ -89,12 +88,16 @@ class SentryConfig(object):
'event': 'sentry.events.QueryEvent',
},
}

DATASTORE = {
'ENGINE': 'sentry.db.backends.redis.RedisBackend',
}

SERVER_EMAIL = None

## The following settings refer to the built-in webserver

WEB_HOST = 'localhost'
WEB_PORT = 9000
WEB_LOG_FILE = '/var/log/sentry.log'
WEB_PID_FILE = '/var/run/sentry.pid'
WEB_LOG_FILE = 'sentry.log'
WEB_PID_FILE = 'sentry.pid'
21 changes: 5 additions & 16 deletions sentry/db/__init__.py
@@ -1,16 +1,5 @@
import datetime
import hashlib

from sentry import conf

_backend = (None, None)

def get_backend():
global _backend
if _backend[0] != conf.BACKEND:
engine = conf.BACKEND['ENGINE']
module, class_name = engine.rsplit('.', 1)
_backend = (conf.BACKEND, getattr(__import__(module, {}, {}, class_name), class_name)(**conf.BACKEND.get('OPTIONS', {})))
return _backend[1]

backend = get_backend()
def get_backend(app):
setting = app.config['DATASTORE']
engine = setting['ENGINE']
module, class_name = engine.rsplit('.', 1)
return getattr(__import__(module, {}, {}, class_name), class_name)(**setting.get('OPTIONS', {}))
28 changes: 14 additions & 14 deletions sentry/db/models.py
Expand Up @@ -7,7 +7,7 @@
except ImportError:
import pickle

from sentry.db import backend
from sentry import db

def map_field_values(model, values):
result = {}
Expand Down Expand Up @@ -40,18 +40,18 @@ def sort_by(self, index, offset=0, limit=100):
index = index[1:]
else:
desc = False
return [self.model(pk, **data) for pk, data in backend.list(self.model, index, offset, limit, desc)]
return [self.model(pk, **data) for pk, data in db.list(self.model, index, offset, limit, desc)]

def get(self, pk):
data = backend.get(self.model, pk)
data = db.get(self.model, pk)
return self.model(pk, **data)

def create(self, **values):
pk = values.pop('pk', None)
if pk:
backend.set(self.model, pk, **map_field_values(self.model, values))
db.set(self.model, pk, **map_field_values(self.model, values))
else:
pk = backend.add(self.model, **map_field_values(self.model, values))
pk = db.add(self.model, **map_field_values(self.model, values))

instance = self.model(pk, **values)

Expand All @@ -68,7 +68,7 @@ def create(self, **values):
return instance

def update(self, pk, **values):
result = backend.set(self.model, pk, **map_field_values(self.model, values))
result = db.set(self.model, pk, **map_field_values(self.model, values))

for index in self.model._meta.indexes:
if index in values:
Expand All @@ -80,18 +80,18 @@ def update(self, pk, **values):
def set_meta(self, pk, **values):
if not values:
return
backend.set_meta(self.model, pk, **map_field_values(self.model, values))
db.set_meta(self.model, pk, **map_field_values(self.model, values))

def get_meta(self, pk):
return backend.get_meta(self.model, pk)
return db.get_meta(self.model, pk)

def add_to_index(self, pk, index, score):
return backend.add_to_index(self.model, pk, index, score)
return db.add_to_index(self.model, pk, index, score)

def get_or_create(self, defaults={}, **index):
# return (instance, created)

pk = backend.get_by_cindex(self.model, **map_field_values(self.model, index))
pk = db.get_by_cindex(self.model, **map_field_values(self.model, index))
if pk:
return self.get(pk), False

Expand All @@ -100,7 +100,7 @@ def get_or_create(self, defaults={}, **index):

inst = self.create(**defaults)

backend.add_to_cindex(self.model, inst.pk, **map_field_values(self.model, index))
db.add_to_cindex(self.model, inst.pk, **map_field_values(self.model, index))

return inst, True

Expand Down Expand Up @@ -178,7 +178,7 @@ def __unicode__(self):
return self.pk

def incr(self, key, amount=1):
result = backend.incr(self.__class__, self.pk, key, amount)
result = db.incr(self.__class__, self.pk, key, amount)
setattr(self, key, result)
return result

Expand All @@ -194,10 +194,10 @@ def get_meta(self):
return self.objects.get_meta(self.pk)

def add_relation(self, instance, score):
return backend.add_relation(self.__class__, self.pk, instance.__class__, instance.pk, score)
return db.add_relation(self.__class__, self.pk, instance.__class__, instance.pk, score)

def get_relations(self, model, offset=0, limit=100):
return [model(pk, **data) for pk, data in backend.list_relations(self.__class__, self.pk, model, offset, limit)]
return [model(pk, **data) for pk, data in db.list_relations(self.__class__, self.pk, model, offset, limit)]

def _get_data(self):
return self.get_meta() or {}
Expand Down
2 changes: 1 addition & 1 deletion sentry/filters.py
Expand Up @@ -2,7 +2,7 @@
from __future__ import absolute_import

from collections import OrderedDict
from flask import current_app as app
from sentry import app
from jinja2 import Markup, escape

class Widget(object):
Expand Down
31 changes: 22 additions & 9 deletions sentry/scripts/runner.py
Expand Up @@ -7,25 +7,32 @@
from daemon.daemon import DaemonContext
from daemon.runner import DaemonRunner, make_pidlockfile
from eventlet import wsgi
from flask import current_app as app
from optparse import OptionParser
from sentry import VERSION
from sentry.wsgi import application

from sentry import VERSION, app

class SentryServer(DaemonRunner):
pidfile_timeout = 10
start_message = u"started with pid %(pid)d"

def __init__(self, host=None, port=None, pidfile=None,
logfile=None):
logfile=None, daemonize=False):
if not logfile:
logfile = app.config['WEB_LOG_FILE']

self.daemon_context = DaemonContext()
logfile = os.path.realpath(logfile)
pidfile = os.path.realpath(pidfile or app.config['WEB_PID_FILE'])

if daemonize:
detach_process = True
else:
detach_process = False

self.daemon_context = DaemonContext(detach_process=detach_process)
self.daemon_context.stdout = open(logfile, 'w+')
self.daemon_context.stderr = open(logfile, 'w+', buffering=0)

self.pidfile = make_pidlockfile(pidfile or app.config['WEB_PID_FILE'], self.pidfile_timeout)
self.pidfile = make_pidlockfile(pidfile, self.pidfile_timeout)

self.daemon_context.pidfile = self.pidfile

Expand All @@ -37,11 +44,15 @@ def __init__(self, host=None, port=None, pidfile=None,

def execute(self, action):
self.action = action
self.do_action()
if self.daemon_context.detach_process is False and self.action == 'start':
# HACK:
self.run()
else:
self.do_action()

def run(self):
upgrade()
wsgi.server(eventlet.listen((self.host, self.port)), application)
wsgi.server(eventlet.listen((self.host, self.port)), app)

def cleanup(days=30, logger=None, site=None, server=None):
from sentry.models import GroupedMessage, Message
Expand Down Expand Up @@ -92,6 +103,7 @@ def main():
parser.add_option('--host', metavar='HOSTNAME')
parser.add_option('--port', type=int, metavar='PORT')
parser.add_option('--daemon', action='store_true', default=False, dest='daemonize')
parser.add_option('--no-daemon', action='store_false', default=False, dest='daemonize')
parser.add_option('--pidfile', dest='pidfile')
parser.add_option('--logfile', dest='logfile')
elif args[1] == 'stop':
Expand Down Expand Up @@ -122,7 +134,8 @@ def main():

elif args[0] == 'start':
app = SentryServer(host=options.host, port=options.port,
pidfile=options.pidfile, logfile=options.logfile)
pidfile=options.pidfile, logfile=options.logfile,
daemonize=options.daemonize)
app.execute(args[0])

elif args[0] == 'restart':
Expand Down

0 comments on commit 74ecfbd

Please sign in to comment.