Skip to content

Commit 14da39a

Browse files
fix(replays): fix bin/mock-replays script (#52927)
Closes getsentry/team-replay#115 bin/mock-replays script now runs successfully locally so you can see an empty replay in your local environment upon running `sentry devserver`
1 parent e558a85 commit 14da39a

File tree

1 file changed

+52
-16
lines changed

1 file changed

+52
-16
lines changed

bin/mock-replay

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
#!/usr/bin/env python
2+
from io import BytesIO
3+
from zlib import compress
4+
25
from sentry.runner import configure
6+
from sentry.utils.json import dumps_htmlsafe
37

48
configure()
5-
import datetime
69
import pathlib
710
import uuid
11+
from datetime import datetime, timedelta
812

913
import click
1014
import requests
1115
from django.conf import settings
1216

13-
from sentry.models import File, Organization, Project
17+
from sentry.models import File, Organization, Project, Team
1418
from sentry.replays.models import ReplayRecordingSegment
15-
from sentry.replays.testutils import mock_replay
19+
from sentry.replays.testutils import (
20+
mock_replay,
21+
mock_rrweb_div_helloworld,
22+
mock_segment_console,
23+
mock_segment_fullsnapshot,
24+
mock_segment_init,
25+
mock_segment_nagivation,
26+
)
1627

1728

1829
def store_replay(replay):
@@ -22,16 +33,28 @@ def store_replay(replay):
2233
assert response.status_code == 200
2334

2435

25-
def create_recording_segment(replay_id, project_id, filename, segment_id):
26-
with open(filename, "rb") as f:
27-
file = File.objects.create(name=filename, type="application/octet-stream")
28-
file.putfile(f)
36+
def create_recording(replay_id, project_id, timestamp):
37+
segments = [
38+
mock_segment_init(timestamp),
39+
mock_segment_fullsnapshot(timestamp, [mock_rrweb_div_helloworld()]),
40+
mock_segment_console(timestamp),
41+
mock_segment_nagivation(timestamp + timedelta(seconds=1), hrefFrom="/", hrefTo="/home/"),
42+
mock_segment_nagivation(
43+
timestamp + timedelta(seconds=2), hrefFrom="/home/", hrefTo="/profile/"
44+
),
45+
]
46+
for (segment_id, segment) in enumerate(segments):
47+
store_replay_segments(replay_id, project_id, segment_id, segment)
48+
2949

50+
def store_replay_segments(replay_id: str, project_id: str, segment_id: int, segment):
51+
f = File.objects.create(name="rr:{segment_id}", type="replay.recording")
52+
f.putfile(BytesIO(compress(dumps_htmlsafe(segment).encode())))
3053
ReplayRecordingSegment.objects.create(
31-
replay_id=replay_id.replace("-", ""),
54+
replay_id=replay_id,
3255
project_id=project_id,
3356
segment_id=segment_id,
34-
file_id=file.id,
57+
file_id=f.id,
3558
)
3659

3760

@@ -41,7 +64,13 @@ def make_filename(filename: str) -> str:
4164

4265

4366
def main():
44-
project_name = "Replay Test"
67+
project_name = "Replay Test Project"
68+
69+
if not settings.SENTRY_FEATURES["organizations:session-replay"]:
70+
click.echo(
71+
'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'
72+
)
73+
exit()
4574

4675
if settings.SENTRY_SINGLE_ORGANIZATION:
4776
org = Organization.get_default()
@@ -51,25 +80,32 @@ def main():
5180
org, _ = Organization.objects.get_or_create(slug="default")
5281

5382
click.echo(f" > Mocking project {project_name}")
83+
84+
team, _ = Team.objects.get_or_create(
85+
organization=org, slug="sentry", defaults={"name": "Sentry"}
86+
)
87+
5488
project, _ = Project.objects.get_or_create(
5589
name=project_name,
5690
defaults={
5791
"organization": org,
5892
"flags": Project.flags.has_replays,
5993
},
94+
platform="javascript",
6095
)
6196

97+
project.add_team(team)
98+
6299
replay_id = uuid.uuid4().hex
63-
seq1_timestamp = datetime.datetime.now() - datetime.timedelta(seconds=22)
64-
seq2_timestamp = datetime.datetime.now() - datetime.timedelta(seconds=5)
100+
seq1_timestamp = datetime.now() - timedelta(seconds=22)
101+
seq2_timestamp = datetime.now() - timedelta(seconds=5)
65102

66-
click.echo("Creating Clickhouse entries...")
103+
click.echo("Creating Replay events entries...")
67104
store_replay(mock_replay(seq1_timestamp, project.id, replay_id, segment_id=0))
68105
store_replay(mock_replay(seq2_timestamp, project.id, replay_id, segment_id=1))
69106

70-
click.echo("Creating Postgres entries...")
71-
create_recording_segment(replay_id, project.id, make_filename("rrweb-1658770770892.json"), 0)
72-
create_recording_segment(replay_id, project.id, make_filename("rrweb-1658770772903.json"), 1)
107+
click.echo("Creating Replay recording entries...")
108+
create_recording(replay_id, project.id, seq1_timestamp)
73109

74110

75111
if __name__ == "__main__":

0 commit comments

Comments
 (0)