Просмотр исходного кода

ref: Rename message to search_message (#10740)

This also starts using `title` in snuba events if available.
Armin Ronacher 6 лет назад
Родитель
Сommit
cf7a13f8a2

+ 1 - 1
src/sentry/api/endpoints/group_events.py

@@ -127,7 +127,7 @@ class GroupEventsEndpoint(GroupEndpoint, EnvironmentMixin):
         events = Event.objects.filter(group_id=group.id)
 
         if query:
-            q = Q(message__icontains=query)
+            q = Q(search_message__icontains=query)
 
             if is_event_id(query):
                 q |= Q(event_id__exact=query)

+ 1 - 1
src/sentry/api/endpoints/project_events.py

@@ -34,7 +34,7 @@ class ProjectEventsEndpoint(ProjectEndpoint):
         query = request.GET.get('query')
         if query:
             events = events.filter(
-                message__icontains=query,
+                search_message__icontains=query,
             )
 
         # filter out events which are beyond the retention period

+ 2 - 1
src/sentry/api/event_search.py

@@ -389,7 +389,8 @@ def get_snuba_query_args(query=None, params=None):
             operator = '=' if _filter.operator == '!=' else '!='
             # make message search case insensitive
             kwargs['conditions'].append(
-                [['positionCaseInsensitive', ['message', "'%s'" % (value,)]], operator, 0]
+                [['positionCaseInsensitive', [
+                    ['coalesce', ['search_message', 'message']], "'%s'" % (value,)]], operator, 0]
             )
 
         else:

+ 21 - 8
src/sentry/api/serializers/models/event.py

@@ -9,6 +9,7 @@ from semaphore import meta_with_chunks
 from sentry.api.serializers import Serializer, register, serialize
 from sentry.models import Event, EventError, EventAttachment, Release, UserReport
 from sentry.utils.safe import get_path
+from sentry.constants import LEGACY_MESSAGE_FALLBACK
 
 
 CRASH_FILE_TYPES = set(['event.minidump'])
@@ -112,7 +113,7 @@ class EventSerializer(Serializer):
         meta = get_path(event.data, '_meta', attr)
         return (value, meta_with_chunks(value, meta))
 
-    def _get_legacy_message_with_meta(self, event):
+    def _get_message_with_meta(self, event):
         meta = event.data.get('_meta')
 
         message = get_path(event.data, 'logentry', 'formatted')
@@ -122,10 +123,6 @@ class EventSerializer(Serializer):
             message = get_path(event.data, 'logentry', 'message')
             msg_meta = get_path(meta, 'logentry', 'message')
 
-        if not message:
-            message = event.message
-            msg_meta = None
-
         return (message, meta_with_chunks(message, msg_meta))
 
     def _get_release_info(self, user, event):
@@ -200,7 +197,7 @@ class EventSerializer(Serializer):
             if self.should_display_error(error)
         ]
 
-        (message, message_meta) = self._get_legacy_message_with_meta(obj)
+        (message, message_meta) = self._get_message_with_meta(obj)
         (tags, tags_meta) = self._get_tags_with_meta(obj)
         (context, context_meta) = self._get_attr_with_meta(obj, 'extra', {})
         (packages, packages_meta) = self._get_attr_with_meta(obj, 'modules', {})
@@ -223,8 +220,11 @@ class EventSerializer(Serializer):
             'size': obj.size,
             'entries': attrs['entries'],
             'dist': obj.dist,
-            # See GH-3248
             'message': message,
+            'searchMessage': obj.search_message,
+            'title': obj.title,
+            'location': obj.location,
+            'culprit': obj.culprit,
             'user': attrs['user'],
             'contexts': attrs['contexts'],
             'crashFile': attrs['crash_file'],
@@ -296,6 +296,10 @@ class SnubaEvent(object):
         'event_id',
         'project_id',
         'message',
+        'search_message',
+        'title',
+        'location',
+        'culprit',
         'user_id',
         'username',
         'ip_address',
@@ -330,10 +334,19 @@ class SnubaEventSerializer(Serializer):
         return []
 
     def serialize(self, obj, attrs, user):
+        title = obj.title
+        if LEGACY_MESSAGE_FALLBACK:
+            title = title or obj.message
+        message = obj.message
+        if LEGACY_MESSAGE_FALLBACK:
+            message = message or obj.search_message
         result = {
             'eventID': six.text_type(obj.event_id),
             'projectID': six.text_type(obj.project_id),
-            'message': obj.message,
+            'message': message,
+            'title': title,
+            'location': obj.location,
+            'culprit': obj.culprit,
             'dateCreated': obj.timestamp,
             'user': {
                 'id': obj.user_id,

+ 1 - 1
src/sentry/api/serializers/models/grouptombstone.py

@@ -25,7 +25,7 @@ class GroupTombstoneSerializer(Serializer):
         return {
             'id': six.text_type(obj.id),
             'level': LOG_LEVELS.get(obj.level, 'unknown'),
-            'message': obj.message,
+            'message': obj.search_message,
             'culprit': obj.culprit,
             'type': obj.get_event_type(),
             'metadata': obj.get_event_metadata(),

+ 4 - 0
src/sentry/constants.py

@@ -390,3 +390,7 @@ class SentryAppStatus(object):
 StatsPeriod = namedtuple('StatsPeriod', ('segments', 'interval'))
 
 LEGACY_RATE_LIMIT_OPTIONS = frozenset(('sentry:project-rate-limit', 'sentry:account-rate-limit'))
+
+# A temporary backwards compatibility mode for message handling.  This is to
+# be removed around May 2019
+LEGACY_MESSAGE_FALLBACK = True

+ 1 - 0
src/sentry/db/models/fields/node.py

@@ -49,6 +49,7 @@ class NodeData(collections.MutableMapping):
         data=None means, this is a node that needs to be fetched from nodestore.
         data={...} means, this is an object that should be saved to nodestore.
     """
+
     def __init__(self, field, id, data=None):
         self.field = field
         self.id = id

+ 9 - 8
src/sentry/event_manager.py

@@ -99,7 +99,7 @@ def get_tag(data, key):
             return v
 
 
-def get_event_metadata_compat(data, fallback_message):
+def get_event_metadata_compat(data):
     """This is a fallback path to getting the event metadata.  This is used
     by some code paths that could potentially deal with old sentry events that
     do not have metadata yet.  This does not happen in practice any more but
@@ -814,7 +814,7 @@ class EventManager(object):
         return eventtypes.get(self._data.get('type', 'default'))(self._data)
 
     def get_search_message(self, event_metadata=None, culprit=None):
-        """This generates the internal event.message attribute which is used
+        """This generates the internal search_message attribute which is used
         for search purposes.  It adds a bunch of data from the metadata and
         the culprit.
         """
@@ -852,7 +852,8 @@ class EventManager(object):
         data = self._data
 
         project = Project.objects.get_from_cache(id=project_id)
-        project._organization_cache = Organization.objects.get_from_cache(id=project.organization_id)
+        project._organization_cache = Organization.objects.get_from_cache(
+            id=project.organization_id)
 
         # Check to make sure we're not about to do a bunch of work that's
         # already been done if we've processed an event with this ID. (This
@@ -983,14 +984,14 @@ class EventManager(object):
         data['metadata'] = event_metadata
         data['hashes'] = hashes
 
-        # index components into ``Event.message``
+        # index components into ``Event.search_message``
         # See GH-3248
-        event.message = self.get_search_message(event_metadata, culprit)
+        event.search_message = self.get_search_message(event_metadata, culprit)
         received_timestamp = event.data.get('received') or float(event.datetime.strftime('%s'))
 
         kwargs = {
             'platform': platform,
-            'message': event.message,
+            'search_message': event.search_message,
             'culprit': culprit,
             'logger': logger_name,
             'level': LOG_LEVELS_MAP.get(level),
@@ -1486,8 +1487,8 @@ class EventManager(object):
             'score': ScoreClause(group),
             'data': data['data'],
         }
-        if event.message and event.message != group.message:
-            extra['message'] = event.message
+        if event.search_message and event.search_message != group.search_message:
+            extra['search_message'] = event.search_message
         if group.level != data['level']:
             extra['level'] = data['level']
         if group.culprit != data['culprit']:

+ 2 - 4
src/sentry/eventstream/kafka/backend.py

@@ -132,12 +132,10 @@ class KafkaEventStream(EventStream):
             'event_id': event.event_id,
             'organization_id': project.organization_id,
             'project_id': event.project_id,
-            # TODO(mitsuhiko): We do not want to send this incorrect
-            # message but this is what snuba needs at the moment.
-            'message': event.message,
+            'search_message': event.search_message,
             'platform': event.platform,
             'datetime': event.datetime,
-            'data': dict(event.data.items()),
+            'data': event.as_dict(),
             'primary_hash': primary_hash,
             'retention_days': retention_days,
         }, {

+ 5 - 2
src/sentry/eventstream/kafka/protocol.py

@@ -28,13 +28,16 @@ def basic_protocol_handler(unsupported_operations):
             "%Y-%m-%dT%H:%M:%S.%fZ",
         ).replace(tzinfo=pytz.utc)
 
+        def _get_attr(name):
+            return event_data[name]
+
         kwargs = {
             'event': Event(**{
-                name: event_data[name] for name in [
+                name: _get_attr(name) for name in [
                     'group_id',
                     'event_id',
                     'project_id',
-                    'message',
+                    'search_message',
                     'platform',
                     'datetime',
                     'data',

Некоторые файлы не были показаны из-за большого количества измененных файлов