def group(request, group_id): group = get_object_or_404(GroupedMessage, pk=group_id) try: obj = group.message_set.all().order_by("-id")[0] except IndexError: # It's possible that a message would not be created under certain circumstances # (such as a post_save signal failing) obj = Message(group=group, data=group.data) if "__sentry__" in obj.data and "exc" in obj.data["__sentry__"]: module, args, frames = obj.data["__sentry__"]["exc"] obj.class_name = str(obj.class_name) # We fake the exception class due to many issues with imports/builtins/etc exc_type = type(obj.class_name, (Exception,), {}) exc_value = exc_type(obj.message) exc_value.args = args reporter = ImprovedExceptionReporter( obj.request, exc_type, exc_value, frames, obj.data["__sentry__"].get("template") ) traceback = mark_safe(reporter.get_traceback_html()) version_data = obj.data["__sentry__"].get("versions", {}).iteritems() elif group.traceback: traceback = mark_safe("<pre>%s</pre>" % (group.traceback,)) version_data = None else: traceback = None version_data = None return render_to_response( "sentry/group/details.html", { "page": "details", "group": group, "json_data": iter_data(obj), "traceback": traceback, "version_data": version_data, }, )
def group(request, group_id): group = get_object_or_404(GroupedMessage, pk=group_id) try: obj = group.message_set.all().order_by('-id')[0] except IndexError: # It's possible that a message would not be created under certain circumstances # (such as a post_save signal failing) obj = Message(group=group, data=group.data) if '__sentry__' in obj.data and 'exc' in obj.data['__sentry__']: module, args, frames = obj.data['__sentry__']['exc'] obj.class_name = str(obj.class_name) # We fake the exception class due to many issues with imports/builtins/etc exc_type = type(obj.class_name, (Exception, ), {}) exc_value = exc_type(obj.message) exc_value.args = args reporter = ImprovedExceptionReporter( obj.request, exc_type, exc_value, frames, obj.data['__sentry__'].get('template')) traceback = mark_safe(reporter.get_traceback_html()) version_data = obj.data['__sentry__'].get('versions', {}).iteritems() elif group.traceback: traceback = mark_safe('<pre>%s</pre>' % (group.traceback, )) version_data = None def iter_data(obj): for k, v in obj.data.iteritems(): if k.startswith('_') or k in ['url']: continue yield k, v json_data = iter_data(obj) page = 'details' return render_to_response('sentry/group/details.html', locals())
def group(request, group_id): group = get_object_or_404(GroupedMessage, pk=group_id) try: obj = group.message_set.all().order_by('-id')[0] except IndexError: # It's possible that a message would not be created under certain circumstances # (such as a post_save signal failing) obj = Message(group=group, data=group.data) if '__sentry__' in obj.data and 'exc' in obj.data['__sentry__']: module, args, frames = obj.data['__sentry__']['exc'] obj.class_name = str(obj.class_name) # We fake the exception class due to many issues with imports/builtins/etc exc_type = type(obj.class_name, (Exception,), {}) exc_value = exc_type(obj.message) exc_value.args = args reporter = ImprovedExceptionReporter(obj.request, exc_type, exc_value, frames, obj.data['__sentry__'].get('template')) traceback = mark_safe(reporter.get_traceback_html()) version_data = obj.data['__sentry__'].get('versions', {}).iteritems() elif group.traceback: traceback = mark_safe('<pre>%s</pre>' % (group.traceback,)) version_data = None def iter_data(obj): for k, v in obj.data.iteritems(): if k.startswith('_') or k in ['url']: continue yield k, v json_data = iter_data(obj) page = 'details' return render_to_response('sentry/group/details.html', locals(), context_instance=RequestContext(request))
def from_kwargs(self, **kwargs): from sentry.models import Message, GroupedMessage, FilterValue URL_MAX_LENGTH = Message._meta.get_field_by_name('url')[0].max_length now = kwargs.pop('timestamp', None) or datetime.datetime.now() view = kwargs.pop('view', None) logger_name = kwargs.pop('logger', 'root') url = kwargs.pop('url', None) server_name = kwargs.pop('server_name', settings.CLIENT) site = kwargs.pop('site', None) data = kwargs.pop('data', {}) or {} message_id = kwargs.pop('message_id', None) if url: data['url'] = url url = url[:URL_MAX_LENGTH] checksum = kwargs.pop('checksum', None) if not checksum: checksum = construct_checksum(**kwargs) mail = False try: kwargs['data'] = {} if 'url' in data: kwargs['data']['url'] = data['url'] if 'version' in data.get('__sentry__', {}): kwargs['data']['version'] = data['__sentry__']['version'] if 'module' in data.get('__sentry__', {}): kwargs['data']['module'] = data['__sentry__']['module'] group_kwargs = kwargs.copy() group_kwargs.update({ 'last_seen': now, 'first_seen': now, }) group, created = GroupedMessage.objects.get_or_create( view=view, logger=logger_name, checksum=checksum, # we store some sample data for rendering defaults=group_kwargs ) kwargs.pop('data', None) if not created: # HACK: maintain appeared state if group.status == 1: mail = True silence_timedelta = now - group.last_seen silence = silence_timedelta.days * 86400 + silence_timedelta.seconds group.status = 0 group.last_seen = now group.times_seen += 1 GroupedMessage.objects.filter(pk=group.pk).update( times_seen=F('times_seen') + 1, status=0, last_seen=now, score=ScoreClause(group), ) signals.post_save.send(sender=GroupedMessage, instance=group, created=False) else: GroupedMessage.objects.filter(pk=group.pk).update( score=ScoreClause(group), ) silence = 0 mail = True instance = Message( message_id=message_id, view=view, logger=logger_name, data=data, url=url, server_name=server_name, site=site, checksum=checksum, group=group, datetime=now, **kwargs ) if not settings.SAMPLE_DATA or group.times_seen % min(count_limit(group.times_seen), time_limit(silence)) == 0: instance.save() # rounded down to the nearest interval if settings.MINUTE_NORMALIZATION: minutes = (now.minute - (now.minute % settings.MINUTE_NORMALIZATION)) else: minutes = now.minute normalized_datetime = now.replace(second=0, microsecond=0, minute=minutes) try: affected = group.messagecountbyminute_set.filter(date=normalized_datetime).update(times_seen=F('times_seen') + 1) if not affected: group.messagecountbyminute_set.create( date=normalized_datetime, times_seen=1, ) for key, value in ( ('server_name', server_name), ('site', site), ('logger', logger_name), ): if not value: continue FilterValue.objects.get_or_create(key=key, value=value) affected = group.messagefiltervalue_set.filter(key=key, value=value).update(times_seen=F('times_seen') + 1) if not affected: group.messagefiltervalue_set.create( key=key, value=value, times_seen=1, ) except Exception: return instance except Exception, exc: # TODO: should we mail admins when there are failures? try: logger.exception(u'Unable to process log entry: %s' % (exc,)) except Exception, exc: warnings.warn(u'Unable to process log entry: %s' % (exc,))
def from_kwargs(self, **kwargs): from sentry.models import Message, GroupedMessage, FilterValue URL_MAX_LENGTH = Message._meta.get_field_by_name('url')[0].max_length now = kwargs.pop('timestamp', None) or datetime.datetime.now() view = kwargs.pop('view', None) logger_name = kwargs.pop('logger', 'root') url = kwargs.pop('url', None) server_name = kwargs.pop('server_name', settings.CLIENT) site = kwargs.pop('site', None) data = kwargs.pop('data', {}) or {} message_id = kwargs.pop('message_id', None) if url: data['url'] = url url = url[:URL_MAX_LENGTH] checksum = kwargs.pop('checksum', None) if not checksum: checksum = construct_checksum(**kwargs) mail = False try: kwargs['data'] = {} if 'url' in data: kwargs['data']['url'] = data['url'] if 'version' in data.get('__sentry__', {}): kwargs['data']['version'] = data['__sentry__']['version'] if 'module' in data.get('__sentry__', {}): kwargs['data']['module'] = data['__sentry__']['module'] group_kwargs = kwargs.copy() group_kwargs.update({ 'last_seen': now, 'first_seen': now, }) group, created = GroupedMessage.objects.get_or_create( view=view, logger=logger_name, checksum=checksum, # we store some sample data for rendering defaults=group_kwargs ) kwargs.pop('data', None) if not created: # HACK: maintain appeared state if group.status == 1: mail = True silence_timedelta = now - group.last_seen silence = silence_timedelta.days * 86400 + silence_timedelta.seconds group.status = 0 group.last_seen = now group.times_seen += 1 GroupedMessage.objects.filter(pk=group.pk).update( times_seen=F('times_seen') + 1, status=0, last_seen=now, score=ScoreClause(group), ) signals.post_save.send(sender=GroupedMessage, instance=group, created=False) else: GroupedMessage.objects.filter(pk=group.pk).update( score=ScoreClause(group), ) silence = 0 mail = True instance = Message( message_id=message_id, view=view, logger=logger_name, data=data, url=url, server_name=server_name, site=site, checksum=checksum, group=group, datetime=now, **kwargs ) if not settings.SAMPLE_DATA or group.times_seen % min(count_limit(group.times_seen), time_limit(silence)) == 0: instance.save() # rounded down to the nearest interval if settings.MINUTE_NORMALIZATION: minutes = (now.minute - (now.minute % settings.MINUTE_NORMALIZATION)) else: minutes = now.minute normalized_datetime = now.replace(second=0, microsecond=0, minute=minutes) affected = group.messagecountbyminute_set.filter(date=normalized_datetime).update(times_seen=F('times_seen') + 1) if not affected: group.messagecountbyminute_set.create( date=normalized_datetime, times_seen=1, ) for key, value in ( ('server_name', server_name), ('site', site), ('logger', logger_name), ): if not value: continue FilterValue.objects.get_or_create(key=key, value=value) affected = group.messagefiltervalue_set.filter(key=key, value=value).update(times_seen=F('times_seen') + 1) if not affected: group.messagefiltervalue_set.create( key=key, value=value, times_seen=1, ) except Exception, exc: # TODO: should we mail admins when there are failures? try: logger.exception(u'Unable to process log entry: %s' % (exc,)) except Exception, exc: warnings.warn(u'Unable to process log entry: %s' % (exc,))
def group(request, group_id): group = get_object_or_404(GroupedMessage, pk=group_id) try: obj = group.message_set.all().order_by('-id')[0] except IndexError: # It's possible that a message would not be created under certain circumstances # (such as a post_save signal failing) obj = Message(group=group, data=group.data) # template information template_info = None # exception information exc_type, exc_value = None, None # stack frames frames = None # module versions version_data = None user_data = None if '__sentry__' in obj.data: sentry_data = obj.data['__sentry__'] if 'exc' in sentry_data: module, args, frames = sentry_data['exc'] elif 'exception' in sentry_data: module, args = sentry_data['exception'] else: module, args = None, None if 'frames' in sentry_data: frames = sentry_data['frames'] if 'user' in sentry_data: user_data = sentry_data['user'] if module and args: # We fake the exception class due to many issues with imports/builtins/etc exc_type = obj.class_name exc_value = type(str(obj.class_name), (Exception, ), {})(obj.message) exc_value.args = args if 'template' in sentry_data: template_info = get_template_info(sentry_data['template'], exc_value) if 'versions' in sentry_data: version_data = sorted(sentry_data['versions'].iteritems()) if frames: lastframe = frames[-1] else: lastframe = None return render_to_response( 'sentry/group/details.html', { 'page': 'details', 'group': group, 'json_data': iter_data(obj), 'user_data': user_data, 'version_data': version_data, 'frames': frames, 'lastframe': lastframe, 'template_info': template_info, 'exception_type': exc_type, 'exception_value': exc_value, 'request': request, })