test_event.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from __future__ import absolute_import
  2. import calendar
  3. from datetime import datetime, timedelta
  4. from sentry.api.serializers import serialize
  5. from sentry.models.event import Event, SnubaEvent
  6. from sentry.testutils import SnubaTestCase, TestCase
  7. from sentry import eventstore, nodestore
  8. class SnubaEventTest(TestCase, SnubaTestCase):
  9. def setUp(self):
  10. super(SnubaEventTest, self).setUp()
  11. self.event_id = "f" * 32
  12. self.now = datetime.utcnow().replace(microsecond=0) - timedelta(seconds=10)
  13. self.proj1 = self.create_project()
  14. self.proj1env1 = self.create_environment(project=self.proj1, name="test")
  15. self.proj1group1 = self.create_group(
  16. self.proj1, first_seen=self.now, last_seen=self.now + timedelta(seconds=14400)
  17. )
  18. # Raw event data
  19. self.data = {
  20. "event_id": self.event_id,
  21. "primary_hash": "1" * 32,
  22. "project_id": self.proj1.id,
  23. "message": "message 1",
  24. "platform": "python",
  25. "timestamp": calendar.timegm(self.now.timetuple()),
  26. "received": calendar.timegm(self.now.timetuple()),
  27. "tags": {
  28. "foo": "bar",
  29. "baz": "quux",
  30. "environment": "prod",
  31. "sentry:user": u"id:user1",
  32. "sentry:release": "release1",
  33. },
  34. "user": {"id": u"user1", "email": u"user1@sentry.io"},
  35. }
  36. # Create a regular django Event from the data, which will save the.
  37. # data in nodestore too. Once Postgres events are deprecated, we can
  38. # turn this off and just put the payload in nodestore.
  39. make_django_event = True
  40. if make_django_event:
  41. self.create_event(
  42. event_id=self.data["event_id"],
  43. datetime=self.now,
  44. project=self.proj1,
  45. group=self.proj1group1,
  46. data=self.data,
  47. )
  48. nodestore_data = nodestore.get(
  49. SnubaEvent.generate_node_id(self.proj1.id, self.event_id)
  50. )
  51. assert self.data["event_id"] == nodestore_data["event_id"]
  52. else:
  53. node_id = SnubaEvent.generate_node_id(self.proj1.id, self.event_id)
  54. nodestore.set(node_id, self.data)
  55. assert nodestore.get(node_id) == self.data
  56. def test_fetch(self):
  57. event = eventstore.get_event_by_id(self.proj1.id, self.event_id)
  58. # Make sure we get back event properties from snuba
  59. assert event.event_id == self.event_id
  60. assert event.group.id == self.proj1group1.id
  61. assert event.project.id == self.proj1.id
  62. assert event._project_cache == self.proj1
  63. # That shouldn't have triggered a nodestore load yet
  64. assert event.data._node_data is None
  65. # But after we ask for something that's not in snuba
  66. event.get_hashes()
  67. # We should have populated the NodeData
  68. assert event.data._node_data is not None
  69. # And the full user should be in there.
  70. assert event.data["user"]["id"] == u"user1"
  71. def test_minimal(self):
  72. """
  73. Test that a SnubaEvent that only loads minimal data from snuba
  74. can still be serialized completely by falling back to nodestore data.
  75. """
  76. snuba_event = eventstore.get_event_by_id(self.proj1.id, self.event_id)
  77. snuba_serialized = serialize(snuba_event)
  78. assert snuba_serialized["message"] == self.data["message"]
  79. assert snuba_serialized["eventID"] == self.data["event_id"]
  80. assert snuba_serialized["platform"] == self.data["platform"]
  81. assert snuba_serialized["user"]["email"] == self.data["user"]["email"]
  82. def test_bind_nodes(self):
  83. """
  84. Test that bind_nodes works on snubaevents to populate their
  85. NodeDatas.
  86. """
  87. event = eventstore.get_event_by_id(self.proj1.id, self.event_id)
  88. assert event.data._node_data is None
  89. Event.objects.bind_nodes([event], "data")
  90. assert event.data._node_data is not None
  91. assert event.data["user"]["id"] == u"user1"
  92. def test_event_with_no_body(self):
  93. # remove the event from nodestore to simulate an event with no body.
  94. node_id = SnubaEvent.generate_node_id(self.proj1.id, self.event_id)
  95. nodestore.delete(node_id)
  96. assert nodestore.get(node_id) is None
  97. # Check that we can still serialize it
  98. event = eventstore.get_event_by_id(
  99. self.proj1.id, self.event_id, additional_columns=eventstore.full_columns
  100. )
  101. serialized = serialize(event)
  102. assert event.data == {}
  103. # Check that the regular serializer still gives us back tags
  104. assert serialized["tags"] == [
  105. {"_meta": None, "key": "baz", "value": "quux"},
  106. {"_meta": None, "key": "foo", "value": "bar"},
  107. {"_meta": None, "key": "release", "value": "release1"},
  108. {"_meta": None, "key": "user", "query": "user.id:user1", "value": "id:user1"},
  109. ]