SentrySender   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 19
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 19
rs 10
c 1
b 0
f 0
wmc 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A send() 0 9 1
A __init__() 0 5 1
1
import logging
2
3
from django.conf import settings
4
5
from raven import Client
6
from celery import signature
7
8
from omaha_server.utils import add_extra_to_log_message
9
10
11
class BaseSender(object):
12
    name = None
13
    client = None
14
15
    def send(self, message, extra={}, tags={}, sentry_data={}, crash_obj=None):
16
        pass
17
18
19
class SentrySender(BaseSender):
20
    name="Sentry"
21
22
    def __init__(self):
23
        self.client = Client(
24
            getattr(settings, 'RAVEN_DSN_STACKTRACE', None),
25
            name=getattr(settings, 'HOST_NAME', None),
26
            release=getattr(settings, 'APP_VERSION', None)
27
        )
28
29
    def send(self, message, extra={}, tags={}, sentry_data={}, crash_obj=None):
30
        event_id = self.client.capture(
31
            'raven.events.Message',
32
            message=message,
33
            extra=extra,
34
            tags=tags,
35
            data=data
36
        )
37
        signature("tasks.get_sentry_link", args=(crash_obj.pk, event_id)).apply_async(queue='private', countdown=1)
38
39
40
class ELKSender(BaseSender):
41
    name="ELK"
42
    handler = None
43
44
    def send(self, message, extra={}, tags={}, sentry_data={}, crash_obj=None):
45
            logger = logging.getLogger('crashes')
46
47
            extra.update(tags)
48
            extra['app_version'] = tags['ver'] if 'ver' in tags else 'unknown'
49
50
            # We don't want "sentry.interfaces" or other sentry specific things as part of any field name.
51
            extra['exception'] = str(sentry_data.get('sentry.interfaces.Exception'))
52
            extra['user'] = sentry_data.get('sentry.interfaces.User') # will be 'None' if no user in sentry_data.
53
            # User is passed in as "dict(id=crash.userid)". Unpack.
54
            if type(extra['user']) is dict:
55
                extra['user'] = extra['user'].get('id')
56
57
            # The "message" is actually a crash signature, not appropriate for the ELK "message" field.
58
            extra['signature'] = message
59
            # All ELK messages are expected to include logger_name.
60
            extra['logger_name'] = 'omaha_server'
61
62
            # Send message with logger.
63
            logger.info(add_extra_to_log_message("received crash report", extra=extra))
64
65
senders_dict = {
66
    "Sentry": SentrySender,
67
    "ELK": ELKSender,
68
}
69
70
71
def get_sender(tracker_name=None):
72
    if not tracker_name:
73
        tracker_name = getattr(settings, 'CRASH_TRACKER', 'Sentry')
74
    try:
75
        sender_class = senders_dict[tracker_name]
76
    except KeyError:
77
        raise KeyError("Unknown tracker, use one of %s" % senders_dict.keys())
78
    return sender_class()