0

私たちのプロジェクトでは、raven はメッセージの作成と Sentry への送信に多くの時間を要します。フレームに関するデータを作成するための多くの時間コストを調べましたが、すべてのフレームに関するデータが頻繁に必要になるわけではありません。例外またはエラーのあるフレームの前の最後の2〜3フレームだけでなく、すべてのフレームに関するデータを作成し、レイヴンによって歩哨に送信する方法はありますか。または、メッセージレベルで依存関係の完全なスタック/部分的なスタックを作成することは可能ですか? つまり、重大または例外またはエラー レベルでは完全なスタックを送信し、デバッグまたは警告レベルではフレームの一部のみを送信します。

4

1 に答える 1

0

Django には次のハンドラーを使用します。

from raven.contrib.django.handlers import SentryHandler as BaseSentryHandler
from raven.utils.stacks import iter_stack_frames


class SentryHandler(BaseSentryHandler):

    def emit(self, record):
        if not getattr(record, 'stack', None):
            record.stack = self._get_stack(record)

        return super(SentryHandler, self).emit(record)

    def _get_targetted_stack(self, stack):
        return stack

    def _get_stack(self, record):
        """Remove non-interesting parts of the stack.
        """
        stack = iter_stack_frames()

        frames = []

        for item in stack:
            if isinstance(item, (list, tuple)):
                frame, lineno = item
            else:
                frame, lineno = item, item.f_lineno

            frames.append((frame, lineno))

        # remove parts after the `logging` module was entered
        for frame_no in reversed(xrange(len(frames))):
            frame, line_no = frames[frame_no]
            module_name = getattr(frame, 'f_globals', {}).get('__name__', '')
            if module_name.startswith('logging'):
                del frames[:frame_no + 1]
                break
        else:
            # the entry point to `logging` module was not found
            return frames

        return frames
于 2014-04-18T09:13:53.053 に答える