@@ -14,7 +14,7 @@ function makeSpanJSON(overrides: Partial<SpanJSON> = {}): SpanJSON {
1414 } ;
1515}
1616
17- function makeTransactionEvent ( spans : SpanJSON [ ] ) : Event {
17+ function makeTransactionEvent ( spans : SpanJSON [ ] , hasGenAiSpans = false ) : Event {
1818 return {
1919 type : 'transaction' ,
2020 transaction : 'GET /api/chat' ,
@@ -26,6 +26,9 @@ function makeTransactionEvent(spans: SpanJSON[]): Event {
2626 trace_id : '00112233445566778899aabbccddeeff' ,
2727 } ,
2828 } ,
29+ sdkProcessingMetadata : {
30+ ...( hasGenAiSpans && { hasGenAiSpans : true } ) ,
31+ } ,
2932 spans,
3033 } ;
3134}
@@ -54,12 +57,9 @@ describe('extractGenAiSpansFromEvent', () => {
5457 timestamp : 1002 ,
5558 } ) ;
5659
57- const event = makeTransactionEvent ( [ genAiSpan , httpSpan ] ) ;
58- const client = makeClient ( ) ;
59-
60- const result = extractGenAiSpansFromEvent ( event , client ) ;
60+ const event = makeTransactionEvent ( [ genAiSpan , httpSpan ] , true ) ;
61+ const result = extractGenAiSpansFromEvent ( event , makeClient ( ) ) ;
6162
62- // gen_ai spans should be in the container item
6363 expect ( result ) . toBeDefined ( ) ;
6464 const [ headers , payload ] = result ! ;
6565 expect ( headers . type ) . toBe ( 'span' ) ;
@@ -69,7 +69,6 @@ describe('extractGenAiSpansFromEvent', () => {
6969 expect ( payload . items [ 0 ] ! . span_id ) . toBe ( 'genai001' ) ;
7070 expect ( payload . items [ 0 ] ! . name ) . toBe ( 'chat gpt-4' ) ;
7171
72- // gen_ai spans should be removed from the event
7372 expect ( event . spans ) . toHaveLength ( 1 ) ;
7473 expect ( event . spans ! [ 0 ] ! . span_id ) . toBe ( 'http001' ) ;
7574 } ) ;
@@ -80,54 +79,47 @@ describe('extractGenAiSpansFromEvent', () => {
8079 const agentSpan = makeSpanJSON ( { span_id : 'agent001' , op : 'gen_ai.invoke_agent' , description : 'agent' } ) ;
8180 const dbSpan = makeSpanJSON ( { span_id : 'db001' , op : 'db.query' , description : 'SELECT *' } ) ;
8281
83- const event = makeTransactionEvent ( [ chatSpan , embeddingsSpan , dbSpan , agentSpan ] ) ;
84- const client = makeClient ( ) ;
85-
86- const result = extractGenAiSpansFromEvent ( event , client ) ;
82+ const event = makeTransactionEvent ( [ chatSpan , embeddingsSpan , dbSpan , agentSpan ] , true ) ;
83+ const result = extractGenAiSpansFromEvent ( event , makeClient ( ) ) ;
8784
8885 expect ( result ) . toBeDefined ( ) ;
8986 expect ( result ! [ 0 ] . item_count ) . toBe ( 3 ) ;
9087 expect ( result ! [ 1 ] . items ) . toHaveLength ( 3 ) ;
9188 expect ( result ! [ 1 ] . items . map ( s => s . span_id ) ) . toEqual ( [ 'chat001' , 'embed001' , 'agent001' ] ) ;
9289
93- // Only the db span should remain
9490 expect ( event . spans ) . toHaveLength ( 1 ) ;
9591 expect ( event . spans ! [ 0 ] ! . span_id ) . toBe ( 'db001' ) ;
9692 } ) ;
9793
98- it ( 'returns undefined when there are no gen_ai spans' , ( ) => {
99- const httpSpan = makeSpanJSON ( { op : 'http.client' } ) ;
100- const dbSpan = makeSpanJSON ( { op : 'db.query' } ) ;
94+ it ( 'returns undefined when hasGenAiSpans flag is not set' , ( ) => {
95+ const event = makeTransactionEvent ( [ makeSpanJSON ( { op : 'gen_ai.chat' } ) ] , false ) ;
10196
102- const event = makeTransactionEvent ( [ httpSpan , dbSpan ] ) ;
103- const client = makeClient ( ) ;
97+ expect ( extractGenAiSpansFromEvent ( event , makeClient ( ) ) ) . toBeUndefined ( ) ;
98+ expect ( event . spans ) . toHaveLength ( 1 ) ;
99+ } ) ;
104100
105- const result = extractGenAiSpansFromEvent ( event , client ) ;
101+ it ( 'returns undefined when there are no gen_ai spans' , ( ) => {
102+ const event = makeTransactionEvent ( [ makeSpanJSON ( { op : 'http.client' } ) , makeSpanJSON ( { op : 'db.query' } ) ] , true ) ;
106103
107- expect ( result ) . toBeUndefined ( ) ;
104+ expect ( extractGenAiSpansFromEvent ( event , makeClient ( ) ) ) . toBeUndefined ( ) ;
108105 expect ( event . spans ) . toHaveLength ( 2 ) ;
109106 } ) ;
110107
111108 it ( 'returns undefined when event has no spans' , ( ) => {
112109 const event = makeTransactionEvent ( [ ] ) ;
113- const client = makeClient ( ) ;
114-
115- expect ( extractGenAiSpansFromEvent ( event , client ) ) . toBeUndefined ( ) ;
110+ expect ( extractGenAiSpansFromEvent ( event , makeClient ( ) ) ) . toBeUndefined ( ) ;
116111 } ) ;
117112
118113 it ( 'returns undefined when event is not a transaction' , ( ) => {
119114 const event : Event = { type : undefined , spans : [ makeSpanJSON ( { op : 'gen_ai.chat' } ) ] } ;
120- const client = makeClient ( ) ;
121-
122- expect ( extractGenAiSpansFromEvent ( event , client ) ) . toBeUndefined ( ) ;
115+ expect ( extractGenAiSpansFromEvent ( event , makeClient ( ) ) ) . toBeUndefined ( ) ;
123116 } ) ;
124117
125118 it ( 'returns undefined when span streaming is enabled' , ( ) => {
126- const event = makeTransactionEvent ( [ makeSpanJSON ( { op : 'gen_ai.chat' } ) ] ) ;
119+ const event = makeTransactionEvent ( [ makeSpanJSON ( { op : 'gen_ai.chat' } ) ] , true ) ;
127120 const client = makeClient ( { traceLifecycle : 'stream' } ) ;
128121
129122 expect ( extractGenAiSpansFromEvent ( event , client ) ) . toBeUndefined ( ) ;
130- // Spans should not be modified
131123 expect ( event . spans ) . toHaveLength ( 1 ) ;
132124 } ) ;
133125
@@ -142,14 +134,10 @@ describe('extractGenAiSpansFromEvent', () => {
142134 op : 'http.client' ,
143135 } ) ;
144136
145- const event = makeTransactionEvent ( [ httpSpan , genAiSpan ] ) ;
146- const client = makeClient ( ) ;
147-
148- const result = extractGenAiSpansFromEvent ( event , client ) ;
137+ const event = makeTransactionEvent ( [ httpSpan , genAiSpan ] , true ) ;
138+ const result = extractGenAiSpansFromEvent ( event , makeClient ( ) ) ;
149139
150- // The v2 span should still reference the v1 parent
151140 expect ( result ! [ 1 ] . items [ 0 ] ! . parent_span_id ) . toBe ( 'http001' ) ;
152- // The v1 parent should remain in the transaction
153141 expect ( event . spans ) . toHaveLength ( 1 ) ;
154142 expect ( event . spans ! [ 0 ] ! . span_id ) . toBe ( 'http001' ) ;
155143 } ) ;
0 commit comments