|
@@ -296,30 +296,48 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
|
|
|
assert event["parent_span_id"] == parent_span_id
|
|
|
assert event["event_id"] == no_root_event.event_id
|
|
|
|
|
|
- def test_multiple_roots(self):
|
|
|
- self.create_event(
|
|
|
- trace=self.trace_id,
|
|
|
- transaction="/second_root",
|
|
|
- spans=[],
|
|
|
- parent_span_id=None,
|
|
|
- project_id=self.project.id,
|
|
|
- )
|
|
|
+ def test_root_event(self):
|
|
|
+ root_event_id = self.root_event.event_id
|
|
|
+
|
|
|
with self.feature(self.FEATURES):
|
|
|
response = self.client.get(
|
|
|
self.url,
|
|
|
- data={"event_id": self.root_event.event_id},
|
|
|
+ data={"event_id": root_event_id, "project": -1},
|
|
|
format="json",
|
|
|
)
|
|
|
|
|
|
assert response.status_code == 200, response.content
|
|
|
|
|
|
- def test_root_event(self):
|
|
|
- root_event_id = self.root_event.event_id
|
|
|
+ assert len(response.data) == 4
|
|
|
+ events = {item["event_id"]: item for item in response.data}
|
|
|
+
|
|
|
+ assert root_event_id in events
|
|
|
+ event = events[root_event_id]
|
|
|
+ assert event["generation"] == 0
|
|
|
+ assert event["parent_event_id"] is None
|
|
|
+ assert event["parent_span_id"] is None
|
|
|
+
|
|
|
+ for i, child_event in enumerate(self.gen1_events):
|
|
|
+ child_event_id = child_event.event_id
|
|
|
+ assert child_event_id in events
|
|
|
+ event = events[child_event_id]
|
|
|
+ assert event["generation"] == 1
|
|
|
+ assert event["parent_event_id"] == root_event_id
|
|
|
+ assert event["parent_span_id"] == self.root_span_ids[i]
|
|
|
|
|
|
+ def test_root_with_multiple_roots(self):
|
|
|
+ root_event_id = self.root_event.event_id
|
|
|
+ self.create_event(
|
|
|
+ trace=self.trace_id,
|
|
|
+ transaction="/second_root",
|
|
|
+ spans=[],
|
|
|
+ parent_span_id=None,
|
|
|
+ project_id=self.project.id,
|
|
|
+ )
|
|
|
with self.feature(self.FEATURES):
|
|
|
response = self.client.get(
|
|
|
self.url,
|
|
|
- data={"event_id": root_event_id, "project": -1},
|
|
|
+ data={"event_id": self.root_event.event_id},
|
|
|
format="json",
|
|
|
)
|
|
|
|
|
@@ -377,6 +395,48 @@ class OrganizationEventsTraceLightEndpointTest(OrganizationEventsTraceEndpointBa
|
|
|
assert event["parent_event_id"] == current_event
|
|
|
assert event["parent_span_id"] == self.gen1_span_ids[0]
|
|
|
|
|
|
+ def test_direct_parent_with_children_and_multiple_root(self):
|
|
|
+ root_event_id = self.root_event.event_id
|
|
|
+ current_event = self.gen1_events[0].event_id
|
|
|
+ child_event_id = self.gen2_events[0].event_id
|
|
|
+ self.create_event(
|
|
|
+ trace=self.trace_id,
|
|
|
+ transaction="/second_root",
|
|
|
+ spans=[],
|
|
|
+ parent_span_id=None,
|
|
|
+ project_id=self.project.id,
|
|
|
+ )
|
|
|
+
|
|
|
+ with self.feature(self.FEATURES):
|
|
|
+ response = self.client.get(
|
|
|
+ self.url,
|
|
|
+ data={"event_id": current_event, "project": -1},
|
|
|
+ format="json",
|
|
|
+ )
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+
|
|
|
+ assert len(response.data) == 3
|
|
|
+ events = {item["event_id"]: item for item in response.data}
|
|
|
+
|
|
|
+ assert root_event_id in events
|
|
|
+ event = events[root_event_id]
|
|
|
+ assert event["generation"] == 0
|
|
|
+ assert event["parent_event_id"] is None
|
|
|
+ assert event["parent_span_id"] is None
|
|
|
+
|
|
|
+ assert current_event in events
|
|
|
+ event = events[current_event]
|
|
|
+ assert event["generation"] == 1
|
|
|
+ assert event["parent_event_id"] == root_event_id
|
|
|
+ assert event["parent_span_id"] == self.root_span_ids[0]
|
|
|
+
|
|
|
+ assert child_event_id in events
|
|
|
+ event = events[child_event_id]
|
|
|
+ assert event["generation"] == 2
|
|
|
+ assert event["parent_event_id"] == current_event
|
|
|
+ assert event["parent_span_id"] == self.gen1_span_ids[0]
|
|
|
+
|
|
|
def test_second_generation_with_children(self):
|
|
|
current_event = self.gen2_events[0].event_id
|
|
|
child_event_id = self.gen3_event.event_id
|
|
@@ -698,6 +758,40 @@ class OrganizationEventsTraceEndpointTest(OrganizationEventsTraceEndpointBase):
|
|
|
# We didn't even try to start the loop of spans
|
|
|
assert len(gen3_1["children"]) == 0
|
|
|
|
|
|
+ def test_multiple_roots(self):
|
|
|
+ trace_id = uuid4().hex
|
|
|
+ first_root = self.create_event(
|
|
|
+ trace=trace_id,
|
|
|
+ transaction="/first_root",
|
|
|
+ spans=[],
|
|
|
+ parent_span_id=None,
|
|
|
+ project_id=self.project.id,
|
|
|
+ duration=1000,
|
|
|
+ )
|
|
|
+ second_root = self.create_event(
|
|
|
+ trace=trace_id,
|
|
|
+ transaction="/second_root",
|
|
|
+ spans=[],
|
|
|
+ parent_span_id=None,
|
|
|
+ project_id=self.project.id,
|
|
|
+ duration=500,
|
|
|
+ )
|
|
|
+ self.url = reverse(
|
|
|
+ self.url_name,
|
|
|
+ kwargs={"organization_slug": self.project.organization.slug, "trace_id": trace_id},
|
|
|
+ )
|
|
|
+ with self.feature(self.FEATURES):
|
|
|
+ response = self.client.get(
|
|
|
+ self.url,
|
|
|
+ data={"project": -1},
|
|
|
+ format="json",
|
|
|
+ )
|
|
|
+
|
|
|
+ assert response.status_code == 200, response.content
|
|
|
+ assert len(response.data) == 2
|
|
|
+ self.assert_event(response.data[0], first_root, "first_root")
|
|
|
+ self.assert_event(response.data[1], second_root, "second_root")
|
|
|
+
|
|
|
def test_sibling_transactions(self):
|
|
|
""" More than one transaction can share a parent_span_id """
|
|
|
gen3_event_siblings = [
|