test_snuba.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from __future__ import absolute_import
  2. from datetime import datetime, timedelta
  3. import pytest
  4. import time
  5. import uuid
  6. from sentry.testutils import SnubaTestCase
  7. from sentry.utils import snuba
  8. class SnubaTest(SnubaTestCase):
  9. def _insert_event_for_time(self, ts, hash='a' * 32, group_id=None):
  10. self.snuba_insert({
  11. 'event_id': uuid.uuid4().hex,
  12. 'primary_hash': hash,
  13. 'group_id': group_id if group_id else int(hash[:16], 16),
  14. 'project_id': self.project.id,
  15. 'message': 'message',
  16. 'platform': 'python',
  17. 'datetime': ts.strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
  18. 'data': {
  19. 'received': time.mktime(ts.timetuple()),
  20. }
  21. })
  22. def test(self):
  23. "This is just a simple 'hello, world' example test."
  24. now = datetime.now()
  25. events = [{
  26. 'event_id': 'x' * 32,
  27. 'primary_hash': '1' * 32,
  28. 'group_id': 1,
  29. 'project_id': self.project.id,
  30. 'message': 'message',
  31. 'platform': 'python',
  32. 'datetime': now.strftime('%Y-%m-%dT%H:%M:%S.%fZ'),
  33. 'data': {
  34. 'received': time.mktime(now.timetuple()),
  35. }
  36. }]
  37. self.snuba_insert(events)
  38. assert snuba.query(
  39. start=now - timedelta(days=1),
  40. end=now + timedelta(days=1),
  41. groupby=['project_id'],
  42. filter_keys={'project_id': [self.project.id]},
  43. ) == {self.project.id: 1}
  44. def test_fail(self):
  45. now = datetime.now()
  46. with pytest.raises(snuba.SnubaError):
  47. snuba.query(
  48. start=now - timedelta(days=1),
  49. end=now + timedelta(days=1),
  50. filter_keys={'project_id': [self.project.id]},
  51. groupby=[")("],
  52. )
  53. def test_organization_retention_respected(self):
  54. base_time = datetime.utcnow()
  55. self._insert_event_for_time(base_time - timedelta(minutes=1))
  56. self._insert_event_for_time(base_time - timedelta(days=2))
  57. def _get_event_count():
  58. # attempt to query back 90 days
  59. return snuba.query(
  60. start=base_time - timedelta(days=90),
  61. end=base_time + timedelta(days=1),
  62. groupby=['project_id'],
  63. filter_keys={
  64. 'project_id': [self.project.id],
  65. },
  66. )
  67. assert _get_event_count() == {self.project.id: 2}
  68. with self.options({'system.event-retention-days': 1}):
  69. assert _get_event_count() == {self.project.id: 1}
  70. def test_organization_retention_larger_than_end_date(self):
  71. base_time = datetime.utcnow()
  72. with self.options({'system.event-retention-days': 1}):
  73. assert snuba.query(
  74. start=base_time - timedelta(days=90),
  75. end=base_time - timedelta(days=60),
  76. groupby=['project_id'],
  77. filter_keys={
  78. 'project_id': [self.project.id],
  79. },
  80. ) == {}
  81. def test_use_group_id(self):
  82. base_time = datetime.utcnow()
  83. group = self.create_group()
  84. self._insert_event_for_time(base_time, group_id=group.id)
  85. with self.options({'snuba.use_group_id_column': True}):
  86. # verify filter_keys and aggregation
  87. assert snuba.query(
  88. start=base_time - timedelta(days=1),
  89. end=base_time + timedelta(days=1),
  90. groupby=['issue'],
  91. filter_keys={
  92. 'project_id': [self.project.id],
  93. 'issue': [group.id]
  94. },
  95. ) == {group.id: 1}
  96. # verify raw_query selecting issue row
  97. assert snuba.raw_query(
  98. start=base_time - timedelta(days=1),
  99. end=base_time + timedelta(days=1),
  100. selected_columns=['issue', 'timestamp'],
  101. filter_keys={
  102. 'project_id': [self.project.id],
  103. 'issue': [group.id]
  104. },
  105. )['data'] == [{
  106. 'issue': group.id,
  107. 'timestamp': base_time.strftime('%Y-%m-%dT%H:%M:%S+00:00'),
  108. }]