Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
Version 8.15 (Unreleased)
-------------------------

- Refactor usage of ``sentry.app`` to use individual modules.

API Changes
~~~~~~~~~~~

Expand Down
3 changes: 1 addition & 2 deletions bin/load-mocks
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ from pytz import utc
from random import randint
from uuid import uuid4

from sentry import roles
from sentry.app import tsdb, buffer
from sentry import buffer, tsdb, roles
from sentry.models import (
Activity, Broadcast, File, GroupMeta, Organization, OrganizationAccessRequest,
OrganizationMember, Project, Release, ReleaseFile, Team, User, UserReport,
Expand Down
9 changes: 5 additions & 4 deletions src/sentry/api/base.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from __future__ import absolute_import

import logging
import six
import time
from datetime import datetime, timedelta

import six
from datetime import datetime, timedelta
from django.conf import settings
from django.utils.http import urlquote
from django.views.decorators.csrf import csrf_exempt
Expand All @@ -16,7 +16,8 @@
from rest_framework.response import Response
from rest_framework.views import APIView

from sentry.app import raven, tsdb
from sentry import tsdb
from sentry.app import raven
from sentry.models import ApiKey, AuditLogEntry
from sentry.utils.cursors import Cursor
from sentry.utils.dates import to_datetime
Expand Down Expand Up @@ -233,7 +234,7 @@ def _parse_args(self, request):
resolution = request.GET.get('resolution')
if resolution:
resolution = self._parse_resolution(resolution)
assert resolution in tsdb.rollups
assert resolution in tsdb.get_rollups()

end = request.GET.get('until')
if end:
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/group_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from rest_framework import serializers
from rest_framework.response import Response

from sentry.app import tsdb
from sentry import tsdb
from sentry.api import client
from sentry.api.base import DocSection
from sentry.api.bases import GroupEndpoint
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/group_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from rest_framework.response import Response

from sentry.app import tsdb
from sentry import tsdb
from sentry.api.base import StatsMixin
from sentry.api.bases.group import GroupEndpoint

Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/internal_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from rest_framework.response import Response

from sentry.app import tsdb
from sentry import tsdb
from sentry.api.base import Endpoint, StatsMixin
from sentry.api.permissions import SuperuserPermission

Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/organization_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

from rest_framework.response import Response

from sentry import tsdb
from sentry.api.base import DocSection, StatsMixin
from sentry.api.bases.organization import OrganizationEndpoint
from sentry.app import tsdb
from sentry.models import Project, Team
from sentry.utils.apidocs import attach_scenarios, scenario

Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/project_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from sentry.api.decorators import sudo_required
from sentry.api.serializers import serialize
from sentry.api.serializers.models.plugin import PluginSerializer
from sentry.app import digests
from sentry.digests import backend as digests
from sentry.models import (
AuditLogEntryEvent, Group, GroupStatus, Project, ProjectBookmark,
ProjectStatus, UserOption, DEFAULT_SUBJECT_TEMPLATE
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/project_group_index.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@
from rest_framework import serializers
from rest_framework.response import Response

from sentry import search
from sentry.api.base import DocSection
from sentry.api.bases.project import ProjectEndpoint, ProjectEventPermission
from sentry.api.fields import UserField
from sentry.api.serializers import serialize
from sentry.api.serializers.models.group import (
SUBSCRIPTION_REASON_MAP, StreamGroupSerializer
)
from sentry.app import search
from sentry.constants import DEFAULT_SORT_OPTION
from sentry.db.models.query import create_or_update
from sentry.models import (
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/project_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from rest_framework.response import Response

from sentry.app import tsdb
from sentry import tsdb
from sentry.api.base import DocSection, StatsMixin
from sentry.api.bases.project import ProjectEndpoint
from sentry.utils.apidocs import scenario, attach_scenarios
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/team_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from rest_framework.response import Response
from six.moves import range

from sentry.app import tsdb
from sentry import tsdb
from sentry.api.base import DocSection, StatsMixin
from sentry.api.bases.team import TeamEndpoint
from sentry.models import Project
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/serializers/models/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
from django.db.models import Q
from django.utils import timezone

from sentry import tsdb
from sentry.api.serializers import Serializer, register, serialize
from sentry.app import tsdb
from sentry.constants import LOG_LEVELS
from sentry.models import (
Group, GroupAssignee, GroupBookmark, GroupMeta, GroupResolution,
Expand Down
43 changes: 10 additions & 33 deletions src/sentry/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,11 @@

from threading import local

from django.conf import settings
from raven.contrib.django.models import client

from sentry.utils import redis
from sentry.utils.imports import import_string
from sentry.utils.locking.backends.redis import RedisLockBackend
from sentry.utils.locking.manager import LockManager
from sentry.utils import warnings


class State(local):
Expand All @@ -25,36 +22,16 @@ class State(local):

env = State()


def get_instance(attribute, options, dangerous=()):
value = getattr(settings, attribute)

cls = import_string(value)
if cls in dangerous:
warnings.warn(
warnings.UnsupportedBackend(
u'The {!r} backend for {} is not recommended '
'for production use.'.format(value, attribute)
)
)

return cls(**options)


# TODO(dcramer): this is getting heavy, we should find a better way to structure
# this
buffer = get_instance('SENTRY_BUFFER', settings.SENTRY_BUFFER_OPTIONS)

from sentry.digests.backends.dummy import DummyBackend
digests = get_instance('SENTRY_DIGESTS', settings.SENTRY_DIGESTS_OPTIONS, (DummyBackend,))
quotas = get_instance('SENTRY_QUOTAS', settings.SENTRY_QUOTA_OPTIONS)
nodestore = get_instance('SENTRY_NODESTORE', settings.SENTRY_NODESTORE_OPTIONS)
ratelimiter = get_instance('SENTRY_RATELIMITER', settings.SENTRY_RATELIMITER_OPTIONS)
search = get_instance('SENTRY_SEARCH', settings.SENTRY_SEARCH_OPTIONS)
newsletter = get_instance('SENTRY_NEWSLETTER', settings.SENTRY_NEWSLETTER_OPTIONS)

from sentry.tsdb.dummy import DummyTSDB
tsdb = get_instance('SENTRY_TSDB', settings.SENTRY_TSDB_OPTIONS, (DummyTSDB,))
# COMPAT
from .buffer import backend as buffer # NOQA
from .digests import backend as digests # NOQA
from .newsletter import backend as newsletter # NOQA
from .nodestore import backend as nodestore # NOQA
from .quotas import backend as quotas # NOQA
from .ratelimits import backend as ratelimiter # NOQA
from .search import backend as search # NOQA
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gotta reimplement this real quick

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resolved

from .tsdb import backend as tsdb # NOQA

raven = client

locks = LockManager(RedisLockBackend(redis.clusters.get('default')))
16 changes: 9 additions & 7 deletions src/sentry/buffer/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
"""
sentry.buffer
~~~~~~~~~~~~~

:copyright: (c) 2010-2014 by the Sentry Team, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
"""
from __future__ import absolute_import

from django.conf import settings

from sentry.utils.functional import LazyBackendWrapper

from .base import Buffer # NOQA


backend = LazyBackendWrapper(Buffer, settings.SENTRY_BUFFER,
settings.SENTRY_BUFFER_OPTIONS)
backend.expose(locals())
1 change: 1 addition & 0 deletions src/sentry/buffer/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ class Buffer(object):
This is useful in situations where a single event might be happening so fast that the queue cant
keep up with the updates.
"""
__all__ = ('incr', 'process', 'process_pending', 'validate')

def incr(self, model, columns, filters, extra=None):
"""
Expand Down
7 changes: 1 addition & 6 deletions src/sentry/db/models/fields/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from django.db.models.signals import post_delete
from south.modelsinspector import add_introspection_rules

from sentry import nodestore
from sentry.utils.cache import memoize
from sentry.utils.compat import pickle
from sentry.utils.strings import decompress, compress
Expand Down Expand Up @@ -81,8 +82,6 @@ def copy(self):

@memoize
def data(self):
from sentry.app import nodestore

if self._node_data is not None:
return self._node_data

Expand Down Expand Up @@ -131,8 +130,6 @@ def contribute_to_class(self, cls, name):
weak=False)

def on_delete(self, instance, **kwargs):
from sentry.app import nodestore

value = getattr(instance, self.name)
if not value.id:
return
Expand All @@ -159,8 +156,6 @@ def to_python(self, value):
return NodeData(self, node_id, data)

def get_prep_value(self, value):
from sentry.app import nodestore

if not value and self.null:
# save ourselves some storage
return None
Expand Down
3 changes: 1 addition & 2 deletions src/sentry/db/models/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
post_save, post_delete, post_init, class_prepared)
from django.utils.encoding import smart_text

from sentry import nodestore
from sentry.utils.cache import cache
from sentry.utils.hashlib import md5_text

Expand Down Expand Up @@ -292,8 +293,6 @@ def create_or_update(self, **kwargs):
return create_or_update(self.model, **kwargs)

def bind_nodes(self, object_list, *node_names):
from sentry.app import nodestore

object_node_list = []
for name in node_names:
object_node_list.extend((
Expand Down
11 changes: 11 additions & 0 deletions src/sentry/digests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
from __future__ import absolute_import

from collections import namedtuple
from django.conf import settings

from sentry.utils.dates import to_datetime
from sentry.utils.functional import LazyBackendWrapper

from .backends.base import Backend # NOQA
from .backends.dummy import DummyBackend # NOQA


backend = LazyBackendWrapper(Backend, settings.SENTRY_DIGESTS,
settings.SENTRY_DIGESTS_OPTIONS,
(DummyBackend,))
backend.expose(locals())


class Record(namedtuple('Record', 'key value timestamp')):
Expand Down
5 changes: 5 additions & 0 deletions src/sentry/digests/backends/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ class Backend(object):
be preempted by a new record being added to the timeline, requiring it to
be transitioned to "waiting" instead.)
"""
__all__ = (
'add', 'delete', 'digest', 'enabled', 'maintenance', 'schedule',
'validate'
)

def __init__(self, **options):
# The ``minimum_delay`` option defines the default minimum amount of
# time (in seconds) to wait between scheduling digests for delivery
Expand Down
5 changes: 3 additions & 2 deletions src/sentry/event_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
from hashlib import md5
from uuid import uuid4

from sentry import eventtypes, features
from sentry.app import buffer, tsdb
from sentry import eventtypes, features, buffer
# we need a bunch of unexposed functions from tsdb
from sentry.tsdb import backend as tsdb
from sentry.constants import (
CLIENT_RESERVED_ATTRS, LOG_LEVELS, DEFAULT_LOGGER_NAME, MAX_CULPRIT_LENGTH
)
Expand Down
3 changes: 1 addition & 2 deletions src/sentry/models/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@
from django.utils import timezone
from django.utils.translation import ugettext_lazy as _

from sentry import eventtypes
from sentry.app import buffer
from sentry import buffer, eventtypes
from sentry.constants import (
DEFAULT_LOGGER_NAME, EVENT_ORDERING_KEY, LOG_LEVELS, MAX_CULPRIT_LENGTH
)
Expand Down
11 changes: 11 additions & 0 deletions src/sentry/newsletter/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,12 @@
from __future__ import absolute_import

from django.conf import settings

from sentry.utils.functional import LazyBackendWrapper

from .base import Newsletter # NOQA


backend = LazyBackendWrapper(Newsletter, settings.SENTRY_NEWSLETTER,
settings.SENTRY_NEWSLETTER_OPTIONS)
backend.expose(locals())
3 changes: 3 additions & 0 deletions src/sentry/newsletter/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@


class Newsletter(object):
__all__ = ('is_enabled', 'get_subscriptions', 'update_subscription',
'create_or_update_subscription')

DEFAULT_LIST_ID = 1

enabled = False
Expand Down
17 changes: 10 additions & 7 deletions src/sentry/nodestore/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
"""
sentry.nodestore
~~~~~~~~~~~~~~~~
from __future__ import absolute_import

:copyright: (c) 2010-2014 by the Sentry Team, see AUTHORS for more details.
:license: BSD, see LICENSE for more details.
"""
from django.conf import settings

from __future__ import absolute_import
from sentry.utils.functional import LazyBackendWrapper

from .base import NodeStorage # NOQA


backend = LazyBackendWrapper(NodeStorage, settings.SENTRY_NODESTORE,
settings.SENTRY_NODESTORE_OPTIONS)
backend.expose(locals())
3 changes: 3 additions & 0 deletions src/sentry/nodestore/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@


class NodeStorage(local):
__all__ = ('create', 'delete', 'delete_multi', 'get', 'get_multi', 'set',
'set_multi', 'generate_id', 'cleanup', 'validate')

def validate(self):
"""
Validates the settings for this backend (i.e. such as proper connection
Expand Down
Loading