Протоколирование в Sentry для Twisted

При настройке протоколирования в Sentry для наших проектов возник интересный вопрос: как лучше передавать сообщения об ошибках из Twisted. Простое гугление подсказало один из очевидных вариантов, но он имел свои недостатки: ошибки протоколировались в лучшем случае в непотребном виде:

'Traceback (most recent call last):\n  File "/usr/lib/python2.7/dist-packages/XXX/XXX/XXX/xxx.py", line 180, in connect\n    connection = cx_Oracle.connect(**self.dsn)\nDatabaseError: ORA-12170: TNS:\xd0\xb8\xd1\x81\xd1\x82\xd0\xb5\xd0\xba\xd0\xbb\xd0\xbe \xd0\xb2\xd1\x80\xd0\xb5\xd0\xbc\xd1\x8f \xd0\xbe\xd0\xb6\xd0\xb8\xd0\xb4\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f \xd1\x81\xd0\xbe\xd0\xb5\xd0\xb4\xd0\xb8\xd0\xbd\xd0\xb5\xd0\xbd\xd0\xb8\xd1\x8f\n\n'

Понятно, что для практических целей это трудноприменимо, поэтому путем экспериментов и чтения документации Twisted был найден следующий более оптимальный вариант:

import ast
from twisted.python import log
from raven import Client

client = Client('YOUR_DSN_HERE');

def log_sentry(event):
    u"""
    Протоколирование в Sentry
    """
    if event.get('isError'):

        try:
            if 'failure' in event:
                client.captureException((
                    event['failure'].type,
                    event['failure'].value,
                    event['failure'].getTracebackObject()))
            else:
                if 'format' in event:
                    message = event['format'] % event
                else:
                    message = ast.literal_eval(''.join(event['message']))
                client.captureMessage(message)
        except Exception, ex:
            log.msg('Sentry connection error: %s' % (ex,))

log.addObserver(log_sentry)

Применение такого варианта даёт нормальный журнал с записями вроде:

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/XXX/XXX/XXX/xxx.py", line 180, in connect
    connection = cx_Oracle.connect(**self.dsn)
DatabaseError: ORA-12170: TNS:истекло время ожидания соединения

PS: Не забывайте что raven умеет использовать неблокирующие вызовы в twisted, если в начало DSN вместо http:// прописать twisted+http://

Leave a Reply