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,))