11import { BrowserClient } from '@sentry/browser' ;
22import { Hub , makeMain } from '@sentry/hub' ;
3+ import { BaggageObj } from '@sentry/types' ;
34import { getGlobalObject , InstrumentHandlerCallback , InstrumentHandlerType } from '@sentry/utils' ;
45import { JSDOM } from 'jsdom' ;
56
67import {
78 BrowserTracing ,
89 BrowserTracingOptions ,
9- getHeaderContext ,
10+ extractTraceDataFromMetaTags ,
1011 getMetaContent ,
1112} from '../../src/browser/browsertracing' ;
1213import { MetricsInstrumentation } from '../../src/browser/metrics' ;
@@ -215,7 +216,8 @@ describe('BrowserTracing', () => {
215216 it ( 'sets transaction context from sentry-trace header' , ( ) => {
216217 const name = 'sentry-trace' ;
217218 const content = '126de09502ae4e0fb26c6967190756a4-b6e54397b12a2a0f-1' ;
218- document . head . innerHTML = `<meta name="${ name } " content="${ content } ">` ;
219+ document . head . innerHTML =
220+ `<meta name="${ name } " content="${ content } ">` + '<meta name="baggage" content="sentry-release=2.1.14,foo=bar">' ;
219221 const startIdleTransaction = jest . spyOn ( hubExtensions , 'startIdleTransaction' ) ;
220222
221223 createBrowserTracing ( true , { routingInstrumentation : customInstrumentRouting } ) ;
@@ -226,6 +228,9 @@ describe('BrowserTracing', () => {
226228 traceId : '126de09502ae4e0fb26c6967190756a4' ,
227229 parentSpanId : 'b6e54397b12a2a0f' ,
228230 parentSampled : true ,
231+ metadata : {
232+ baggage : [ { release : '2.1.14' } , 'foo=bar' ] ,
233+ } ,
229234 } ) ,
230235 expect . any ( Number ) ,
231236 expect . any ( Number ) ,
@@ -322,7 +327,7 @@ describe('BrowserTracing', () => {
322327 } ) ;
323328 } ) ;
324329
325- describe ( 'sentry-trace <meta> element ' , ( ) => {
330+ describe ( 'sentry-trace and baggage <meta> elements ' , ( ) => {
326331 describe ( 'getMetaContent' , ( ) => {
327332 it ( 'finds the specified tag and extracts the value' , ( ) => {
328333 const name = 'sentry-trace' ;
@@ -352,67 +357,107 @@ describe('BrowserTracing', () => {
352357 } ) ;
353358 } ) ;
354359
355- describe ( 'getHeaderContext ' , ( ) => {
360+ describe ( 'extractTraceDataFromMetaTags() ' , ( ) => {
356361 it ( 'correctly parses a valid sentry-trace meta header' , ( ) => {
357362 document . head . innerHTML =
358363 '<meta name="sentry-trace" content="12312012123120121231201212312012-1121201211212012-0">' ;
359364
360- const headerContext = getHeaderContext ( ) ;
365+ const headerContext = extractTraceDataFromMetaTags ( ) ;
361366
362367 expect ( headerContext ) . toBeDefined ( ) ;
363368 expect ( headerContext ! . traceId ) . toEqual ( '12312012123120121231201212312012' ) ;
364369 expect ( headerContext ! . parentSpanId ) . toEqual ( '1121201211212012' ) ;
365370 expect ( headerContext ! . parentSampled ) . toEqual ( false ) ;
366371 } ) ;
367372
368- it ( 'returns undefined if the header is malformed' , ( ) => {
373+ it ( 'correctly parses a valid baggage meta header' , ( ) => {
374+ document . head . innerHTML = '<meta name="baggage" content="sentry-release=2.1.12,foo=bar">' ;
375+
376+ const headerContext = extractTraceDataFromMetaTags ( ) ;
377+
378+ expect ( headerContext ) . toBeDefined ( ) ;
379+ expect ( headerContext ?. metadata ?. baggage ) . toBeDefined ( ) ;
380+ const baggage = headerContext ?. metadata ?. baggage ! ;
381+ expect ( baggage [ 0 ] ) . toBeDefined ( ) ;
382+ expect ( baggage [ 0 ] ) . toEqual ( {
383+ release : '2.1.12' ,
384+ } as BaggageObj ) ;
385+ expect ( baggage [ 1 ] ) . toBeDefined ( ) ;
386+ expect ( baggage [ 1 ] ) . toEqual ( 'foo=bar' ) ;
387+ } ) ;
388+
389+ it ( 'returns undefined if the sentry-trace header is malformed' , ( ) => {
369390 document . head . innerHTML = '<meta name="sentry-trace" content="12312012-112120121-0">' ;
370391
371- const headerContext = getHeaderContext ( ) ;
392+ const headerContext = extractTraceDataFromMetaTags ( ) ;
372393
373394 expect ( headerContext ) . toBeUndefined ( ) ;
374395 } ) ;
375396
397+ it ( 'does not crash if the baggage header is malformed' , ( ) => {
398+ document . head . innerHTML = '<meta name="baggage" content="sentry-relase:2.1.13;foo-bar">' ;
399+
400+ const headerContext = extractTraceDataFromMetaTags ( ) ;
401+
402+ // TODO currently this creates invalid baggage. This must be adressed in a follow-up PR
403+ expect ( headerContext ) . toBeDefined ( ) ;
404+ expect ( headerContext ?. metadata ?. baggage ) . toBeDefined ( ) ;
405+ const baggage = headerContext ?. metadata ?. baggage ! ;
406+ expect ( baggage [ 0 ] ) . toBeDefined ( ) ;
407+ //expect(baggage[0]).toEqual);
408+ expect ( baggage [ 1 ] ) . toBeDefined ( ) ;
409+ } ) ;
410+
376411 it ( "returns undefined if the header isn't there" , ( ) => {
377412 document . head . innerHTML = '<meta name="dogs" content="12312012123120121231201212312012-1121201211212012-0">' ;
378413
379- const headerContext = getHeaderContext ( ) ;
414+ const headerContext = extractTraceDataFromMetaTags ( ) ;
380415
381416 expect ( headerContext ) . toBeUndefined ( ) ;
382417 } ) ;
383418 } ) ;
384419
385420 describe ( 'using the data' , ( ) => {
386- it ( 'uses the data for pageload transactions' , ( ) => {
421+ it ( 'uses the tracing data for pageload transactions' , ( ) => {
387422 // make sampled false here, so we can see that it's being used rather than the tracesSampleRate-dictated one
388423 document . head . innerHTML =
389- '<meta name="sentry-trace" content="12312012123120121231201212312012-1121201211212012-0">' ;
424+ '<meta name="sentry-trace" content="12312012123120121231201212312012-1121201211212012-0">' +
425+ '<meta name="baggage" content="sentry-release=2.1.14,foo=bar">' ;
390426
391427 // pageload transactions are created as part of the BrowserTracing integration's initialization
392428 createBrowserTracing ( true ) ;
393429 const transaction = getActiveTransaction ( hub ) as IdleTransaction ;
430+ const baggage = transaction . getBaggage ( ) ! ;
394431
395432 expect ( transaction ) . toBeDefined ( ) ;
396433 expect ( transaction . op ) . toBe ( 'pageload' ) ;
397434 expect ( transaction . traceId ) . toEqual ( '12312012123120121231201212312012' ) ;
398435 expect ( transaction . parentSpanId ) . toEqual ( '1121201211212012' ) ;
399436 expect ( transaction . sampled ) . toBe ( false ) ;
437+ expect ( baggage ) . toBeDefined ( ) ;
438+ expect ( baggage [ 0 ] ) . toBeDefined ( ) ;
439+ expect ( baggage [ 0 ] ) . toEqual ( { release : '2.1.14' } ) ;
440+ expect ( baggage [ 1 ] ) . toBeDefined ( ) ;
441+ expect ( baggage [ 1 ] ) . toEqual ( 'foo=bar' ) ;
400442 } ) ;
401443
402444 it ( 'ignores the data for navigation transactions' , ( ) => {
403445 mockChangeHistory = ( ) => undefined ;
404446 document . head . innerHTML =
405- '<meta name="sentry-trace" content="12312012123120121231201212312012-1121201211212012-0">' ;
447+ '<meta name="sentry-trace" content="12312012123120121231201212312012-1121201211212012-0">' +
448+ '<meta name="baggage" content="sentry-release=2.1.14,foo=bar">' ;
406449
407450 createBrowserTracing ( true ) ;
408451
409452 mockChangeHistory ( { to : 'here' , from : 'there' } ) ;
410453 const transaction = getActiveTransaction ( hub ) as IdleTransaction ;
454+ const baggage = transaction . getBaggage ( ) ! ;
411455
412456 expect ( transaction ) . toBeDefined ( ) ;
413457 expect ( transaction . op ) . toBe ( 'navigation' ) ;
414458 expect ( transaction . traceId ) . not . toEqual ( '12312012123120121231201212312012' ) ;
415459 expect ( transaction . parentSpanId ) . toBeUndefined ( ) ;
460+ expect ( baggage ) . toBeUndefined ( ) ;
416461 } ) ;
417462 } ) ;
418463 } ) ;
0 commit comments