@@ -500,14 +500,17 @@ describe('SentryPropagator', () => {
500500 ) ;
501501 } ) ;
502502
503- it ( 'should overwrite existing sentry baggage header' , ( ) => {
503+ it ( 'overwrites existing sentry baggage values and add sentry-trace header if sentry-trace is not set yet' , ( ) => {
504+ // This is an edeg case where someone set a baggage header with existing sentry- values but no sentry-trace header.
505+ // There's no evidence this occurs in real-life but if it does, we can assume that this must be some kind of error
506+ // Hence, we overwrite the existing sentry- values with our new ones but keep all other non-sentry values.
504507 const spanContext = {
505508 traceId : 'd4cda95b652f4a1592b449d5929fda1b' ,
506509 spanId : '6e0c63257de34c92' ,
507510 traceFlags : TraceFlags . SAMPLED ,
508511 } ;
509512
510- const carrier = {
513+ const carrier : Record < string , string > = {
511514 baggage : 'foo=bar,other=yes,sentry-release=9.9.9,sentry-other=yes' ,
512515 } ;
513516 const context = trace . setSpanContext ( ROOT_CONTEXT , spanContext ) ;
@@ -520,11 +523,11 @@ describe('SentryPropagator', () => {
520523 'sentry-trace_id=d4cda95b652f4a1592b449d5929fda1b' ,
521524 'sentry-public_key=abc' ,
522525 'sentry-environment=production' ,
523- 'sentry-other=yes' ,
524526 'sentry-release=1.0.0' ,
525527 'sentry-sampled=true' ,
526528 ] . sort ( ) ,
527529 ) ;
530+ expect ( carrier [ SENTRY_TRACE_HEADER ] ) . toBe ( 'd4cda95b652f4a1592b449d5929fda1b-6e0c63257de34c92-1' ) ;
528531 } ) ;
529532
530533 it ( 'should create baggage without propagation context' , ( ) => {
@@ -537,6 +540,7 @@ describe('SentryPropagator', () => {
537540 expect ( carrier [ SENTRY_BAGGAGE_HEADER ] ) . toBe (
538541 `foo=bar,sentry-environment=production,sentry-release=1.0.0,sentry-public_key=abc,sentry-trace_id=${ traceId } ` ,
539542 ) ;
543+ expect ( carrier [ SENTRY_TRACE_HEADER ] ) . toBeDefined ( ) ; // whenever we set baggage, we must also set sentry-trace
540544 } ) ;
541545
542546 it ( 'should NOT set baggage and sentry-trace header if instrumentation is suppressed' , ( ) => {
@@ -551,6 +555,86 @@ describe('SentryPropagator', () => {
551555 expect ( carrier [ SENTRY_TRACE_HEADER ] ) . toBe ( undefined ) ;
552556 expect ( carrier [ SENTRY_BAGGAGE_HEADER ] ) . toBe ( undefined ) ;
553557 } ) ;
558+
559+ it ( "doesn't set baggage header if sentry-trace header is already set" , ( ) => {
560+ const carrier : Record < string , string > = {
561+ [ SENTRY_TRACE_HEADER ] : 'abcdef-xyz-1' ,
562+ } ;
563+ propagator . inject ( ROOT_CONTEXT , carrier , defaultTextMapSetter ) ;
564+
565+ expect ( carrier [ SENTRY_BAGGAGE_HEADER ] ) . toBe ( undefined ) ;
566+ expect ( carrier [ SENTRY_TRACE_HEADER ] ) . toBe ( 'abcdef-xyz-1' ) ;
567+ } ) ;
568+
569+ describe ( 'traceparent header' , ( ) => {
570+ it ( "doesn't change baggage header if sentry-trace header is already set" , ( ) => {
571+ const carrier : Record < string , string > = {
572+ [ SENTRY_TRACE_HEADER ] : 'abcdef-xyz-1' ,
573+ [ SENTRY_BAGGAGE_HEADER ] : 'foo=bar,other=yes,sentry-release=9.9.9' ,
574+ } ;
575+ propagator . inject ( ROOT_CONTEXT , carrier , defaultTextMapSetter ) ;
576+
577+ expect ( carrier [ SENTRY_BAGGAGE_HEADER ] ) . toBe ( 'foo=bar,other=yes,sentry-release=9.9.9' ) ;
578+ expect ( carrier [ SENTRY_TRACE_HEADER ] ) . toBe ( 'abcdef-xyz-1' ) ;
579+ } ) ;
580+
581+ it ( "doesn't set traceparent header if sentry-trace header is already set" , ( ) => {
582+ mockSdkInit ( { propagateTraceparent : true } ) ;
583+ const carrier : Record < string , string > = {
584+ [ SENTRY_TRACE_HEADER ] : 'abcdef-xyz-1' ,
585+ } ;
586+ propagator . inject ( ROOT_CONTEXT , carrier , defaultTextMapSetter ) ;
587+
588+ expect ( carrier [ 'traceparent' ] ) . toBe ( undefined ) ;
589+ expect ( carrier [ SENTRY_TRACE_HEADER ] ) . toBe ( 'abcdef-xyz-1' ) ;
590+ } ) ;
591+
592+ it ( 'sets traceparent header if propagateTraceparent is true' , ( ) => {
593+ mockSdkInit ( {
594+ environment : 'production' ,
595+ release : '1.0.0' ,
596+ tracesSampleRate : 1 ,
597+ dsn : 'https://abc@domain/123' ,
598+ propagateTraceparent : true ,
599+ } ) ;
600+
601+ const spanContext = {
602+ traceId : 'd4cda95b652f4a1592b449d5929fda1b' ,
603+ spanId : '6e0c63257de34c92' ,
604+ traceFlags : TraceFlags . SAMPLED ,
605+ } ;
606+ const context = trace . setSpanContext ( ROOT_CONTEXT , spanContext ) ;
607+ const baggage = propagation . createBaggage ( { foo : { value : 'bar' } } ) ;
608+ propagator . inject ( propagation . setBaggage ( context , baggage ) , carrier , defaultTextMapSetter ) ;
609+
610+ expect ( baggageToArray ( carrier [ SENTRY_BAGGAGE_HEADER ] ) ) . toEqual (
611+ [
612+ 'foo=bar' ,
613+ 'sentry-trace_id=d4cda95b652f4a1592b449d5929fda1b' ,
614+ 'sentry-public_key=abc' ,
615+ 'sentry-environment=production' ,
616+ 'sentry-release=1.0.0' ,
617+ 'sentry-sampled=true' ,
618+ ] . sort ( ) ,
619+ ) ;
620+ expect ( carrier [ 'traceparent' ] ) . toBe ( '00-d4cda95b652f4a1592b449d5929fda1b-6e0c63257de34c92-01' ) ;
621+ } ) ;
622+
623+ it ( "doesn't set traceparent header if propagateTraceparent is false" , ( ) => {
624+ mockSdkInit ( {
625+ environment : 'production' ,
626+ release : '1.0.0' ,
627+ tracesSampleRate : 1 ,
628+ dsn : 'https://abc@domain/123' ,
629+ propagateTraceparent : false ,
630+ } ) ;
631+ const carrier : Record < string , string > = { } ;
632+ propagator . inject ( ROOT_CONTEXT , carrier , defaultTextMapSetter ) ;
633+
634+ expect ( carrier [ 'traceparent' ] ) . toBe ( undefined ) ;
635+ expect ( carrier [ SENTRY_TRACE_HEADER ] ) . toBeDefined ( ) ;
636+ } ) ;
637+ } ) ;
554638 } ) ;
555639
556640 describe ( 'extract' , ( ) => {
0 commit comments