@@ -356,7 +356,7 @@ protected int appendSuffix(
356356 size = 0 ;
357357 }
358358 // Append the managed OTel member and all other non-Datadog list-members
359- if (appendOtelAndVendorMembers (sb , ptags , otelTraceState , size != 0 )) {
359+ if (appendOtelAndVendorMembers (sb , ptags , otelTraceState , size != 0 , false )) {
360360 // We don't care about the total size in bytes here, but only the fact that we added something
361361 // that should be returned
362362 size = Math .max (size , EMPTY_SIZE + 1 );
@@ -763,7 +763,11 @@ private static int cleanUpAndAppendUnknown(StringBuilder sb, W3CPTags w3CPTags,
763763 }
764764
765765 private static boolean appendOtelAndVendorMembers (
766- StringBuilder sb , PTags ptags , OtelTraceState otelTraceState , boolean hasDatadogMember ) {
766+ StringBuilder sb ,
767+ PTags ptags ,
768+ OtelTraceState otelTraceState ,
769+ boolean hasDatadogMember ,
770+ boolean preserveDatadogMember ) {
767771 String original = ptags .tracestate ;
768772 int remainingMembers = MAX_MEMBER_COUNT - (hasDatadogMember ? 1 : 0 );
769773 int otherMemberPosition = 0 ;
@@ -777,10 +781,14 @@ private static boolean appendOtelAndVendorMembers(
777781 if (memberEnd < 0 ) {
778782 memberEnd = len ;
779783 }
780- boolean managedMember =
781- original .startsWith (DATADOG_MEMBER_KEY , memberStart )
782- || original .startsWith (OTEL_MEMBER_KEY , memberStart );
783- if (!managedMember ) {
784+ boolean datadogMember = original .startsWith (DATADOG_MEMBER_KEY , memberStart );
785+ boolean otelMember = original .startsWith (OTEL_MEMBER_KEY , memberStart );
786+ if (datadogMember && preserveDatadogMember ) {
787+ int end = stripTrailingOWC (original , memberStart , memberEnd );
788+ appendMember (sb , original , memberStart , end );
789+ remainingMembers --;
790+ memberAppended = true ;
791+ } else if (!datadogMember && !otelMember ) {
784792 if (otelTraceState != null
785793 && !otelTraceStateAppended
786794 && otelTraceState .getInheritedPosition () == otherMemberPosition ) {
@@ -810,6 +818,17 @@ private static boolean appendOtelAndVendorMembers(
810818 return memberAppended ;
811819 }
812820
821+ static String updateOtelTraceState (PTags ptags , OtelTraceState otelTraceState ) {
822+ String original = ptags .tracestate ;
823+ int capacity = original == null ? 0 : original .length ();
824+ if (otelTraceState != null ) {
825+ capacity += OTEL_MEMBER_KEY .length () + otelTraceState .length () + 1 ;
826+ }
827+ StringBuilder updated = new StringBuilder (capacity );
828+ appendOtelAndVendorMembers (updated , ptags , otelTraceState , false , true );
829+ return updated .length () == 0 ? null : updated .toString ();
830+ }
831+
813832 private static void appendMember (StringBuilder sb , String member , int start , int end ) {
814833 if (sb .length () != 0 ) {
815834 sb .append (MEMBER_SEPARATOR );
0 commit comments