0

In our project raven costs many time for create and send message to Sentry. We checked out many time costs for create data about frames, but we don't need data about all frames often. Is it possible and how create data about not all frames just about last 2-3 frames before frame with exception or error and send it into sentry by raven. Or may be possible create dependency full stack / partly stack on message level? i.e. in critical or exception or error level send full stack and in debug or warning levels just part of frames.

Alexey
  • 812
  • 13
  • 22

1 Answers1

0

Use this handler for 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
warvariuc
  • 57,116
  • 41
  • 173
  • 227