Skip to content

Commit 9c1fe8c

Browse files
committed
span links test
1 parent a32d8e5 commit 9c1fe8c

File tree

2 files changed

+112
-0
lines changed
  • dev-packages/browser-integration-tests/suites/span-first

2 files changed

+112
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
5+
Sentry.init({
6+
dsn: 'https://public@dsn.ingest.sentry.io/1337',
7+
traceLifecycle: 'stream',
8+
integrations: [Sentry.browserTracingIntegration(), Sentry.spanStreamingIntegration()],
9+
tracePropagationTargets: ['http://sentry-test-site.example'],
10+
tracesSampleRate: 1,
11+
sendDefaultPii: true,
12+
});
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import { expect } from '@playwright/test';
2+
import { SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE } from '@sentry/core';
3+
import { sentryTest } from '../../../utils/fixtures';
4+
import { envelopeRequestParser, shouldSkipTracingTest, waitForTransactionRequest } from '../../../utils/helpers';
5+
import { getSpanOp, waitForV2Spans } from '../../../utils/spanFirstUtils';
6+
7+
sentryTest("navigation spans link back to previous trace's root span", async ({ getLocalTestUrl, page }) => {
8+
if (shouldSkipTracingTest()) {
9+
sentryTest.skip();
10+
}
11+
12+
const url = await getLocalTestUrl({ testDir: __dirname });
13+
14+
const pageloadSpan = await sentryTest.step('Initial pageload', async () => {
15+
const pageloadSpanPromise = waitForV2Spans(page, spans => !!spans.find(span => getSpanOp(span) === 'pageload'));
16+
await page.goto(url);
17+
return (await pageloadSpanPromise).find(span => getSpanOp(span) === 'pageload');
18+
});
19+
20+
const navigation1Span = await sentryTest.step('First navigation', async () => {
21+
const navigation1SpanPromise = waitForV2Spans(
22+
page,
23+
spans => !!spans.find(span => getSpanOp(span) === 'navigation'),
24+
);
25+
await page.goto(`${url}#foo`);
26+
return (await navigation1SpanPromise).find(span => getSpanOp(span) === 'navigation');
27+
});
28+
29+
const navigation2Span = await sentryTest.step('Second navigation', async () => {
30+
const navigation2SpanPromise = waitForV2Spans(
31+
page,
32+
spans => !!spans.find(span => getSpanOp(span) === 'navigation'),
33+
);
34+
await page.goto(`${url}#bar`);
35+
return (await navigation2SpanPromise).find(span => getSpanOp(span) === 'navigation');
36+
});
37+
38+
const pageloadTraceId = pageloadSpan?.trace_id;
39+
const navigation1TraceId = navigation1Span?.trace_id;
40+
const navigation2TraceId = navigation2Span?.trace_id;
41+
42+
expect(pageloadSpan?.links).toBeUndefined();
43+
44+
expect(navigation1Span?.links).toEqual([
45+
{
46+
trace_id: pageloadTraceId,
47+
span_id: pageloadSpan?.span_id,
48+
sampled: true,
49+
attributes: {
50+
[SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE]: { value: 'previous_trace', type: 'string' },
51+
},
52+
},
53+
]);
54+
55+
expect(navigation1Span?.attributes).toMatchObject({
56+
'sentry.previous_trace': { type: 'string', value: `${pageloadTraceId}-${pageloadSpan?.span_id}-1` },
57+
});
58+
59+
expect(navigation2Span?.links).toEqual([
60+
{
61+
trace_id: navigation1TraceId,
62+
span_id: navigation1Span?.span_id,
63+
sampled: true,
64+
attributes: {
65+
[SEMANTIC_LINK_ATTRIBUTE_LINK_TYPE]: { value: 'previous_trace', type: 'string' },
66+
},
67+
},
68+
]);
69+
70+
expect(navigation2Span?.attributes).toMatchObject({
71+
'sentry.previous_trace': { type: 'string', value: `${navigation1TraceId}-${navigation1Span?.span_id}-1` },
72+
});
73+
74+
expect(pageloadTraceId).not.toEqual(navigation1TraceId);
75+
expect(navigation1TraceId).not.toEqual(navigation2TraceId);
76+
expect(pageloadTraceId).not.toEqual(navigation2TraceId);
77+
});
78+
79+
sentryTest("doesn't link between hard page reloads by default", async ({ getLocalTestUrl, page }) => {
80+
if (shouldSkipTracingTest()) {
81+
sentryTest.skip();
82+
}
83+
84+
const url = await getLocalTestUrl({ testDir: __dirname });
85+
86+
await sentryTest.step('First pageload', async () => {
87+
const pageloadRequestPromise = waitForV2Spans(page, spans => !!spans.find(span => getSpanOp(span) === 'pageload'));
88+
await page.goto(url);
89+
return (await pageloadRequestPromise).find(span => getSpanOp(span) === 'pageload');
90+
});
91+
92+
await sentryTest.step('Second pageload', async () => {
93+
const pageload2RequestPromise = waitForV2Spans(page, spans => !!spans.find(span => getSpanOp(span) === 'pageload'));
94+
await page.reload();
95+
const pageload2Span = (await pageload2RequestPromise).find(span => getSpanOp(span) === 'pageload');
96+
97+
expect(pageload2Span?.trace_id).toBeDefined();
98+
expect(pageload2Span?.links).toBeUndefined();
99+
});
100+
});

0 commit comments

Comments
 (0)