2014-03-19 1 views
0

우리의 프로젝트에서는 까마귀가 작성되어 Sentry에게 메시지를 보내는 데 많은 시간이 걸립니다. 프레임에 대한 데이터를 만들 때 많은 시간 비용을 조사했지만 모든 프레임에 대한 데이터는 자주 필요하지 않습니다. 그것은 가능하고 예외 또는 오류가있는 프레임의 마지막 2-3 프레임 전 모든 프레임에 대한 데이터를 작성하지 않고 까마귀가 보초로 보내는 방법입니다. 또는 메시지 레벨에 의존성 전체 스택/부분 스택을 만들 수 있습니까? 즉 임계 또는 예외 또는 오류 수준에서 전체 스택을 보내고 프레임의 일부만 디버그 또는 경고 수준으로 보냅니다.파이썬 까마귀. 프레임의 일부분 보내기

답변

0

사용 장고에 대해이 핸들러 :

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