mock-replay 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #!/usr/bin/env python
  2. from io import BytesIO
  3. from zlib import compress
  4. from sentry.runner import configure
  5. from sentry.utils.json import dumps_htmlsafe
  6. configure()
  7. import uuid
  8. from datetime import datetime, timedelta
  9. import click
  10. import requests
  11. from django.conf import settings
  12. from sentry.models.files.file import File
  13. from sentry.models.organization import Organization
  14. from sentry.models.project import Project
  15. from sentry.models.team import Team
  16. from sentry.replays.models import ReplayRecordingSegment
  17. from sentry.replays.testutils import (
  18. mock_replay,
  19. mock_rrweb_div_helloworld,
  20. mock_segment_click,
  21. mock_segment_console,
  22. mock_segment_fullsnapshot,
  23. mock_segment_init,
  24. mock_segment_nagivation,
  25. mock_segment_rageclick,
  26. )
  27. def store_replay(replay):
  28. response = requests.post(
  29. settings.SENTRY_SNUBA + "/tests/entities/replays/insert", json=[replay]
  30. )
  31. assert response.status_code == 200
  32. def create_recording(replay_id, project_id, timestamp):
  33. segments = [
  34. mock_segment_init(timestamp),
  35. mock_segment_fullsnapshot(timestamp, [mock_rrweb_div_helloworld()]),
  36. mock_segment_console(timestamp),
  37. mock_segment_nagivation(timestamp + timedelta(seconds=1), hrefFrom="/", hrefTo="/home/"),
  38. mock_segment_nagivation(
  39. timestamp + timedelta(seconds=2), hrefFrom="/home/", hrefTo="/profile/"
  40. ),
  41. mock_segment_rageclick(
  42. timestamp + timedelta(seconds=2),
  43. "nav.app-65yvxw.e1upz5ks6[aria-label='Primary Navigation'] > div.app-1v175cc.e1upz5ks4",
  44. "sidebar-item-performance",
  45. "a",
  46. 24,
  47. ),
  48. mock_segment_click(
  49. timestamp + timedelta(seconds=2),
  50. "nav.app-65yvxw.e1upz5ks6[aria-label='Primary Navigation'] > div.app-1v175cc.e1upz5ks4",
  51. "sidebar-item-performance",
  52. "a",
  53. ),
  54. mock_segment_nagivation(
  55. timestamp + timedelta(seconds=6),
  56. hrefFrom="/profile/",
  57. hrefTo="/performance/",
  58. ),
  59. mock_segment_rageclick(
  60. timestamp + timedelta(seconds=6),
  61. "nav.app-65yvxw.e1upz5ks6[aria-label='Primary Navigation'] > div.app-1v175cc.e1upz5ks4",
  62. "sidebar-item-performance",
  63. "a",
  64. 24,
  65. ),
  66. ]
  67. for segment_id, segment in enumerate(segments):
  68. store_replay_segments(replay_id, project_id, segment_id, segment)
  69. def store_replay_segments(replay_id: str, project_id: int, segment_id: int, segment) -> None:
  70. f = File.objects.create(name="rr:{segment_id}", type="replay.recording")
  71. f.putfile(BytesIO(compress(dumps_htmlsafe(segment).encode())))
  72. ReplayRecordingSegment.objects.create(
  73. replay_id=replay_id,
  74. project_id=project_id,
  75. segment_id=segment_id,
  76. file_id=f.id,
  77. )
  78. def main():
  79. project_name = "Replay Test Project"
  80. if not settings.SENTRY_FEATURES["organizations:session-replay"]:
  81. click.echo(
  82. 'Session Replays is currently turned off! \nTo enable, add the following line to your local sentry.conf.py file: \nSENTRY_FEATURES["organizations:session-replay"] = True'
  83. )
  84. exit()
  85. if settings.SENTRY_SINGLE_ORGANIZATION:
  86. org = Organization.get_default()
  87. click.echo(f"Mocking org {org.name}")
  88. else:
  89. click.echo("Mocking org {}".format("Default"))
  90. org, _ = Organization.objects.get_or_create(slug="default")
  91. click.echo(f" > Mocking project {project_name}")
  92. team, _ = Team.objects.get_or_create(
  93. organization=org, slug="sentry", defaults={"name": "Sentry"}
  94. )
  95. project, _ = Project.objects.get_or_create(
  96. name=project_name,
  97. defaults={
  98. "organization": org,
  99. "flags": Project.flags.has_replays,
  100. },
  101. platform="javascript",
  102. )
  103. project.add_team(team)
  104. replay_id = uuid.uuid4().hex
  105. seq1_timestamp = datetime.now() - timedelta(seconds=15)
  106. seq2_timestamp = datetime.now() - timedelta(seconds=5)
  107. click.echo("Creating Replay events entries...")
  108. store_replay(mock_replay(seq1_timestamp, project.id, replay_id, segment_id=0))
  109. store_replay(mock_replay(seq2_timestamp, project.id, replay_id, segment_id=1))
  110. click.echo("Creating Replay recording entries...")
  111. create_recording(replay_id, project.id, seq1_timestamp)
  112. if __name__ == "__main__":
  113. main()