Skip to content

Commit d0e0bac

Browse files
committed
fix definedness check
1 parent 4452e24 commit d0e0bac

File tree

2 files changed

+23
-17
lines changed
  • dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp
  • packages/browser-utils/src/metrics

2 files changed

+23
-17
lines changed

dev-packages/browser-integration-tests/suites/tracing/metrics/web-vitals-lcp/test.ts

+16-10
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,14 @@ import type { Event } from '@sentry/types';
55
import { sentryTest } from '../../../../utils/fixtures';
66
import { getFirstSentryEnvelopeRequest, shouldSkipTracingTest } from '../../../../utils/helpers';
77

8-
sentryTest('should capture a LCP vital with element details.', async ({ browserName, getLocalTestUrl, page }) => {
8+
/*
9+
Because we "serve" the html test page as a static file, all requests for the image
10+
are considered 3rd party requests. So the LCP value we obtain for the image is also
11+
considered a 3rd party LCP value, meaning `renderTime` is only set if we also
12+
return the `Timing-Allow-Origin` header.
13+
*/
14+
15+
sentryTest('captures LCP vitals with element details.', async ({ browserName, getLocalTestUrl, page }) => {
916
if (shouldSkipTracingTest() || browserName !== 'chromium') {
1017
sentryTest.skip();
1118
}
@@ -25,20 +32,21 @@ sentryTest('should capture a LCP vital with element details.', async ({ browserN
2532
expect(eventData.measurements).toBeDefined();
2633
expect(eventData.measurements?.lcp?.value).toBeDefined();
2734

28-
// XXX: This should be body > img, but it can be flakey as sometimes it will report
29-
// the button as LCP.
3035
expect(eventData.contexts?.trace?.data?.['lcp.element'].startsWith('body >')).toBe(true);
3136
expect(eventData.contexts?.trace?.data?.['lcp.size']).toBeGreaterThan(0);
3237
expect(eventData.contexts?.trace?.data?.['lcp.loadTime']).toBeGreaterThan(0);
3338

3439
// renderTime is not set because we do not return the `Timing-Allow-Origin` header
3540
// and the image is loaded from a 3rd party origin
3641
expect(eventData.contexts?.trace?.data?.['lcp.renderTime']).toBeUndefined();
42+
43+
// The LCP value should be the loadTime because the renderTime is not set
44+
expect(eventData.measurements?.lcp?.value).toBeCloseTo(eventData.contexts?.trace?.data?.['lcp.loadTime']);
3745
});
3846

3947
sentryTest(
4048
'captures LCP renderTime when returning Timing-Allow-Origin header.',
41-
async ({ browserName, getLocalTestPath, page }) => {
49+
async ({ browserName, getLocalTestUrl, page }) => {
4250
if (shouldSkipTracingTest() || browserName !== 'chromium') {
4351
sentryTest.skip();
4452
}
@@ -51,7 +59,7 @@ sentryTest(
5159
});
5260
});
5361

54-
const url = await getLocalTestPath({ testDir: __dirname });
62+
const url = await getLocalTestUrl({ testDir: __dirname });
5563
const [eventData] = await Promise.all([
5664
getFirstSentryEnvelopeRequest<Event>(page),
5765
page.goto(url),
@@ -61,14 +69,12 @@ sentryTest(
6169
expect(eventData.measurements).toBeDefined();
6270
expect(eventData.measurements?.lcp?.value).toBeDefined();
6371

64-
// XXX: This should be body > img, but it can be flakey as sometimes it will report
65-
// the button as LCP.
6672
expect(eventData.contexts?.trace?.data?.['lcp.element'].startsWith('body >')).toBe(true);
6773
expect(eventData.contexts?.trace?.data?.['lcp.size']).toBeGreaterThan(0);
6874
expect(eventData.contexts?.trace?.data?.['lcp.loadTime']).toBeGreaterThan(0);
69-
70-
// renderTime is not set because we do not return the `Timing-Allow-Origin` header
71-
// and the image is loaded from a 3rd party origin
7275
expect(eventData.contexts?.trace?.data?.['lcp.renderTime']).toBeGreaterThan(0);
76+
77+
// The LCP value should be the renderTime because the renderTime is set
78+
expect(eventData.measurements?.lcp?.value).toBeCloseTo(eventData.contexts?.trace?.data?.['lcp.renderTime']);
7379
},
7480
);

packages/browser-utils/src/metrics/browserMetrics.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -635,18 +635,18 @@ function _setWebVitalAttributes(span: Span): void {
635635
span.setAttribute('lcp.url', _lcpEntry.url.trim().slice(0, 200));
636636
}
637637

638-
if (_lcpEntry.renderTime) {
639-
// renderTime is the time portion of LCP that's related to rendering the LCP element.
638+
if (_lcpEntry.loadTime != null) {
639+
// loadTime is the time of LCP that's related to receiving the LCP element response..
640+
span.setAttribute('lcp.loadTime', _lcpEntry.loadTime);
641+
}
642+
643+
if (_lcpEntry.renderTime != null) {
644+
// renderTime is loadTime + rendering time
640645
// it's 0 if the LCP element is loaded from a 3rd party origin that doesn't send the
641646
// `Timing-Allow-Origin` header.
642647
span.setAttribute('lcp.renderTime', _lcpEntry.renderTime);
643648
}
644649

645-
if (_lcpEntry.loadTime) {
646-
// loadTime is the time portion of LCP that's related to loading the LCP element.
647-
span.setAttribute('lcp.loadTime', _lcpEntry.loadTime);
648-
}
649-
650650
span.setAttribute('lcp.size', _lcpEntry.size);
651651
}
652652

0 commit comments

Comments
 (0)