load-mocks 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. #!/usr/bin/env python
  2. from sentry.runner import configure
  3. configure()
  4. import itertools
  5. from datetime import datetime, timedelta
  6. from django.conf import settings
  7. from django.db import IntegrityError, transaction
  8. from django.utils import timezone
  9. from hashlib import md5
  10. from pytz import utc
  11. from random import randint
  12. from sentry import roles
  13. from sentry.app import tsdb, buffer
  14. from sentry.models import (
  15. Activity, Broadcast, File, GroupMeta, Organization, OrganizationAccessRequest,
  16. OrganizationMember, Project, Release, ReleaseFile, Team, User, UserReport
  17. )
  18. from sentry.utils.samples import create_sample_event
  19. PLATFORMS = itertools.cycle([
  20. 'ruby',
  21. 'php',
  22. 'python',
  23. 'java',
  24. 'javascript',
  25. ])
  26. LEVELS = itertools.cycle([
  27. 'error',
  28. 'error',
  29. 'error',
  30. 'fatal',
  31. 'warning',
  32. ])
  33. def create_system_time_series():
  34. now = datetime.utcnow().replace(tzinfo=utc)
  35. for _ in xrange(60):
  36. count = randint(1, 10)
  37. tsdb.incr_multi((
  38. (tsdb.models.internal, 'client-api.all-versions.responses.2xx'),
  39. (tsdb.models.internal, 'client-api.all-versions.requests'),
  40. ), now, int(count * 0.9))
  41. tsdb.incr_multi((
  42. (tsdb.models.internal, 'client-api.all-versions.responses.4xx'),
  43. ), now, int(count * 0.05))
  44. tsdb.incr_multi((
  45. (tsdb.models.internal, 'client-api.all-versions.responses.5xx'),
  46. ), now, int(count * 0.1))
  47. now = now - timedelta(seconds=1)
  48. for _ in xrange(24 * 30):
  49. count = randint(100, 1000)
  50. tsdb.incr_multi((
  51. (tsdb.models.internal, 'client-api.all-versions.responses.2xx'),
  52. (tsdb.models.internal, 'client-api.all-versions.requests'),
  53. ), now, int(count * 4.9))
  54. tsdb.incr_multi((
  55. (tsdb.models.internal, 'client-api.all-versions.responses.4xx'),
  56. ), now, int(count * 0.05))
  57. tsdb.incr_multi((
  58. (tsdb.models.internal, 'client-api.all-versions.responses.5xx'),
  59. ), now, int(count * 0.1))
  60. now = now - timedelta(hours=1)
  61. def create_sample_time_series(event):
  62. group = event.group
  63. now = datetime.utcnow().replace(tzinfo=utc)
  64. for _ in xrange(60):
  65. count = randint(1, 10)
  66. tsdb.incr_multi((
  67. (tsdb.models.project, group.project.id),
  68. (tsdb.models.group, group.id),
  69. ), now, count)
  70. tsdb.incr_multi((
  71. (tsdb.models.organization_total_received, group.project.organization_id),
  72. (tsdb.models.project_total_received, group.project.id),
  73. ), now, int(count * 1.1))
  74. tsdb.incr_multi((
  75. (tsdb.models.organization_total_rejected, group.project.organization_id),
  76. (tsdb.models.project_total_rejected, group.project.id),
  77. ), now, int(count * 0.1))
  78. now = now - timedelta(seconds=1)
  79. for _ in xrange(24 * 30):
  80. count = randint(100, 1000)
  81. tsdb.incr_multi((
  82. (tsdb.models.project, group.project.id),
  83. (tsdb.models.group, group.id),
  84. ), now, count)
  85. tsdb.incr_multi((
  86. (tsdb.models.organization_total_received, group.project.organization_id),
  87. (tsdb.models.project_total_received, group.project.id),
  88. ), now, int(count * 1.1))
  89. tsdb.incr_multi((
  90. (tsdb.models.organization_total_rejected, group.project.organization_id),
  91. (tsdb.models.project_total_rejected, group.project.id),
  92. ), now, int(count * 0.1))
  93. now = now - timedelta(hours=1)
  94. def main(num_events=1):
  95. user = User.objects.filter(is_superuser=True)[0]
  96. dummy_user, _ = User.objects.get_or_create(
  97. username='dummy@example.com',
  98. defaults={
  99. 'email': 'dummy@example.com',
  100. }
  101. )
  102. dummy_user.set_password('dummy')
  103. dummy_user.save()
  104. mocks = (
  105. ('Massive Dynamic', ('Ludic Science',)),
  106. ('Captain Planet', ('Earth', 'Fire', 'Wind', 'Water', 'Heart')),
  107. )
  108. Broadcast.objects.create(
  109. title="Learn about Source Maps",
  110. message="Source maps are JSON files that contain information on how to map your transpiled source code back to their original source.",
  111. link="https://docs.getsentry.com/hosted/clients/javascript/sourcemaps/#uploading-source-maps-to-sentry",
  112. )
  113. if settings.SENTRY_SINGLE_ORGANIZATION:
  114. org = Organization.get_default()
  115. else:
  116. print('Mocking org {}'.format('Default'))
  117. org, _ = Organization.objects.get_or_create(
  118. name='Default',
  119. )
  120. OrganizationMember.objects.get_or_create(
  121. user=user,
  122. organization=org,
  123. role=roles.get_top_dog().id,
  124. )
  125. dummy_member, _ = OrganizationMember.objects.get_or_create(
  126. user=dummy_user,
  127. organization=org,
  128. defaults={
  129. 'role': roles.get_default().id,
  130. }
  131. )
  132. for team_name, project_names in mocks:
  133. print('> Mocking team {}'.format(team_name))
  134. team, _ = Team.objects.get_or_create(
  135. name=team_name,
  136. defaults={
  137. 'organization': org,
  138. },
  139. )
  140. for project_name in project_names:
  141. print(' > Mocking project {}'.format(project_name))
  142. project, _ = Project.objects.get_or_create(
  143. team=team,
  144. name=project_name,
  145. defaults={
  146. 'organization': org,
  147. 'first_event': timezone.now(),
  148. }
  149. )
  150. release = Release.objects.get_or_create(
  151. version='4f38b65c62c4565aa94bba391ff8946922a8eed4',
  152. project=project,
  153. )[0]
  154. ReleaseFile.objects.get_or_create(
  155. project=project,
  156. release=release,
  157. name='an-example.js',
  158. file=File.objects.get_or_create(
  159. name='an-example.js',
  160. type='release.file',
  161. checksum='abcde' * 8,
  162. size=13043,
  163. )[0],
  164. )
  165. Activity.objects.create(
  166. type=Activity.RELEASE,
  167. project=project,
  168. ident=release.version,
  169. user=user,
  170. data={'version': release.version},
  171. )
  172. # Add a bunch of additional dummy events to support pagination
  173. for _ in range(45):
  174. platform = PLATFORMS.next()
  175. create_sample_event(
  176. project=project,
  177. platform=platform,
  178. release=release.version,
  179. level=LEVELS.next(),
  180. message='This is a mostly useless example %s exception' % platform,
  181. checksum=md5(platform + str(_)).hexdigest(),
  182. )
  183. for _ in range(num_events):
  184. event1 = create_sample_event(
  185. project=project,
  186. platform='python',
  187. release=release.version,
  188. )
  189. event2 = create_sample_event(
  190. project=project,
  191. platform='javascript',
  192. release=release.version,
  193. )
  194. event3 = create_sample_event(project, 'java')
  195. event4 = create_sample_event(
  196. project=project,
  197. platform='ruby',
  198. release=release.version,
  199. )
  200. create_sample_event(
  201. project=project,
  202. platform='php',
  203. release=release.version,
  204. message='This is a an example PHP event with an extremely long and annoying title\nIt also happens to contain some newlines in it,\nthus making it even more annoying.',
  205. )
  206. with transaction.atomic():
  207. try:
  208. GroupMeta.objects.create(
  209. group=event1.group,
  210. key='github:tid',
  211. value='134',
  212. )
  213. except IntegrityError:
  214. pass
  215. UserReport.objects.create(
  216. project=project,
  217. event_id=event3.event_id,
  218. group=event3.group,
  219. name='Jane Doe',
  220. email='jane@example.com',
  221. comments='I have no idea how I got here.',
  222. )
  223. print(' > Loading time series data'.format(project_name))
  224. create_sample_time_series(event1)
  225. create_sample_time_series(event2)
  226. create_sample_time_series(event3)
  227. create_sample_time_series(event4)
  228. if hasattr(buffer, 'process_pending'):
  229. print(' > Processing pending buffers')
  230. buffer.process_pending()
  231. OrganizationAccessRequest.objects.create_or_update(
  232. member=dummy_member,
  233. team=team,
  234. )
  235. Activity.objects.create(
  236. type=Activity.RELEASE,
  237. project=project,
  238. ident='4f38b65c62c4565aa94bba391ff8946922a8eed4',
  239. user=user,
  240. data={'version': '4f38b65c62c4565aa94bba391ff8946922a8eed4'},
  241. )
  242. create_system_time_series()
  243. if __name__ == '__main__':
  244. settings.CELERY_ALWAYS_EAGER = True
  245. from optparse import OptionParser
  246. parser = OptionParser()
  247. parser.add_option('--events', dest='num_events', default=1, type=int)
  248. (options, args) = parser.parse_args()
  249. main(num_events=options.num_events)