Completed
Push — master ( 97e35d...b2374c )
by
unknown
45s
created

get_sender()   A

Complexity

Conditions 3

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
dl 0
loc 8
rs 9.4285
c 1
b 0
f 0
1
import logging
2
3
from django.conf import settings
4
5
from raven import Client
6
from celery import signature
7
from logstash import TCPLogstashHandler
8
9
10
class BaseSender(object):
11
    name = None
12
    client = None
13
14
    def send(self, message, extra={}, tags={}, data={}, crash_obj=None):
15
        pass
16
17
18
class SentrySender(BaseSender):
19
    name="Sentry"
20
21
    def __init__(self):
22
        self.client = Client(
23
            getattr(settings, 'RAVEN_DSN_STACKTRACE', None),
24
            name=getattr(settings, 'HOST_NAME', None),
25
            release=getattr(settings, 'APP_VERSION', None)
26
        )
27
28
    def send(self, message, extra={}, tags={}, data={}, crash_obj=None):
29
        event_id = self.client.capture(
30
            'raven.events.Message',
31
            message=message,
32
            extra=extra,
33
            tags=tags,
34
            data=data
35
        )
36
        signature("tasks.get_sentry_link", args=(crash_obj.pk, event_id)).apply_async(queue='private', countdown=1)
37
38
39
class ELKSender(BaseSender):
40
    name="ELK"
41
    handler = None
42
43
    def __init__(self):
44
        host = getattr(settings, 'LOGSTASH_HOST', None)
45
        port = getattr(settings, 'LOGSTASH_PORT', None)
46
        if host and port:
47
            self.handler = TCPLogstashHandler(host, int(port))
48
        else:
49
            logging.error("Logstash settings are not configured")
50
51
    def send(self, message, extra={}, tags={}, data={}, crash_obj=None):
52
        if self.handler:
53
            logger = self._prepare_logger()
54
            extra.update(tags)
55
            extra.update(data)
56
            logger.info(message, extra=extra)
57
        else:
58
            logging.error("Logstash settings are not configured")
59
60
    def _prepare_logger(self):
61
        """It's a workaround.
62
63
        If we do it in __init__ then logger won't send messages to Logstash
64
        """
65
        logger = logging.getLogger('crash_sender')
66
        logger.setLevel(logging.INFO)
67
        logger.handlers = []
68
        logger.addHandler(self.handler)
69
        return logger
70
71
72
senders_dict = {
73
    "Sentry": SentrySender,
74
    "ELK": ELKSender,
75
}
76
77
78
def get_sender(tracker_name=None):
79
    if not tracker_name:
80
        tracker_name = getattr(settings, 'CRASH_TRACKER', 'Sentry')
81
    try:
82
        sender_class = senders_dict[tracker_name]
83
    except KeyError:
84
        raise KeyError("Unknown tracker, use one of %s" % senders_dict.keys())
85
    return sender_class()