def validate_data(project, data, client=None): ensure_valid_project_id(project, data) if not data.get('message'): data['message'] = '<no message value>' if not data.get('event_id'): data['event_id'] = uuid.uuid4().hex elif len(data['event_id']) > 32: raise InvalidData( 'Invalid value for \'event_id\': must be a 32 character identifier' ) if 'timestamp' in data: try: process_data_timestamp(data) except InvalidTimestamp: # Log the error, remove the timestamp, and continue logger.error( 'Client %r passed an invalid value for timestamp %r', client or '<unknown client>', data['timestamp'], ) del data['timestamp'] if data.get('modules') and type(data['modules']) != dict: raise InvalidData('Invalid type for \'modules\': must be a mapping') for k, v in data.items(): if k in RESERVED_FIELDS: continue if '.' not in k: logger.error( 'Ignoring unknown attribute %r passed by client %r', k, client or '<unknown client>', ) del data[k] continue try: interface = import_string(k) except (ImportError, AttributeError), e: raise InvalidInterface('%r is not a valid interface name: %s' % (k, e)) try: data[k] = interface(**v).serialize() except Exception, e: raise InvalidData('Unable to validate interface, %r: %s' % (k, e))
def from_kwargs(self, project, **kwargs): # TODO: this function is way too damn long and needs refactored # the inner imports also suck so let's try to move it away from # the objects manager from sentry.models import Event, Project, View from sentry.views import View as ViewHandler project = Project.objects.get(pk=project) if any(k in kwargs for k in ('view', 'message_id')): # we must be passing legacy data, let's convert it kwargs = self.convert_legacy_kwargs(kwargs) # First we pull out our top-level (non-data attr) kwargs event_id = kwargs.pop('event_id', None) message = kwargs.pop('message', None) culprit = kwargs.pop('culprit', None) level = kwargs.pop('level', None) or logging.ERROR time_spent = kwargs.pop('time_spent', None) logger_name = kwargs.pop('logger', 'root') server_name = kwargs.pop('server_name', None) site = kwargs.pop('site', None) date = kwargs.pop('timestamp', None) or timezone.now() extra = kwargs.pop('extra', None) modules = kwargs.pop('modules', None) if timezone.is_naive(date): date = timezone.make_aware(date, timezone.utc) if not message: raise InvalidData('Missing required parameter: message') checksum = kwargs.pop('checksum', None) if not checksum: checksum = hashlib.md5(message).hexdigest() data = kwargs for k, v in kwargs.iteritems(): if '.' not in k: raise InvalidInterface('%r is not a valid interface name' % k) try: interface = self.module_cache[k] except ImportError, e: raise InvalidInterface('%r is not a valid interface name: %s' % (k, e)) try: data[k] = interface(**v).serialize() except Exception, e: raise InvalidData('Unable to validate interface, %r: %s' % (k, e))
def validate_data(project, data, client=None): for k in REQUIRED_FIELDS: if not data.get(k): raise InvalidData('Missing required parameter: %r' % k) ensure_valid_project_id(project, data) if 'event_id' not in data: data['event_id'] = uuid.uuid4().hex if 'timestamp' in data: try: process_data_timestamp(data) except InvalidTimestamp: # Log the error, remove the timestamp, and continue logger.error('Client %r passed an invalid value for timestamp %r' % ( data['timestamp'], client or '<unknown client>', )) del data['timestamp'] if data.get('modules') and type(data['modules']) != dict: raise InvalidData('Invalid type for \'modules\': must be a mapping') for k, v in data.iteritems(): if k in RESERVED_FIELDS: continue if '.' not in k: raise InvalidInterface('%r is not a valid interface name' % k) try: interface = Group.objects.module_cache[k] except (ImportError, AttributeError), e: raise InvalidInterface('%r is not a valid interface name: %s' % (k, e)) try: data[k] = interface(**v).serialize() except Exception, e: raise InvalidData('Unable to validate interface, %r: %s' % (k, e))
if k in RESERVED_FIELDS: continue if '.' not in k: raise InvalidInterface('%r is not a valid interface name' % k) try: interface = import_string(k) except (ImportError, AttributeError), e: raise InvalidInterface('%r is not a valid interface name: %s' % (k, e)) try: data[k] = interface(**v).serialize() except Exception, e: raise InvalidData('Unable to validate interface, %r: %s' % (k, e)) level = data.get('level') or settings.DEFAULT_LOG_LEVEL if isinstance(level, basestring) and not level.isdigit(): # assume it's something like 'warning' try: data['level'] = settings.LOG_LEVEL_REVERSE_MAP[level] except KeyError: raise InvalidData('Invalid logging level specified: %r' % level) return data def insert_data_to_database(data): maybe_delay(store_event, data=data)