2014-03-19 53 views
0

在我們的項目中,烏鴉花費了很多時間來創建併發送消息給Sentry。我們檢出了創建有關幀的數據的許多時間成本,但我們並不需要經常關於所有幀的數據。是否有可能以及如何創建有關幀之前的最後2-3幀的所有幀的數據,併發送異常或錯誤,並將其發送到烏鴉的哨兵。或者可能在消息級別上創建依賴性完整堆棧/部分堆棧?即處於嚴重或異常或錯誤級別發送完整堆棧,並在調試或警告級別中僅部分幀。Python烏鴉。發送部分幀

回答

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