99
1010import { compact , shuffle } from 'lodash' ;
1111import { Readable } from 'stream' ;
12- import { apm , ApmFields , generateLongId , generateShortId } from '@kbn/apm-synthtrace-client' ;
12+ import {
13+ apm ,
14+ ApmFields ,
15+ generateLongId ,
16+ generateShortId ,
17+ Serializable ,
18+ } from '@kbn/apm-synthtrace-client' ;
1319import { Scenario } from '../cli/scenario' ;
1420import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment' ;
1521import { withClient } from '../lib/utils/with_client' ;
@@ -32,90 +38,105 @@ function getSpanLinksFromEvents(events: ApmFields[]) {
3238 ) ;
3339}
3440
35- const scenario : Scenario < ApmFields > = async ( ) => {
41+ const scenario : Scenario < ApmFields > = async ( { logger } ) => {
3642 return {
3743 generate : ( { range, clients : { apmEsClient } } ) => {
38- const producerInternalOnlyInstance = apm
44+ const producerTimestamps = range . ratePerMinute ( 1 ) ;
45+ const producerConsumerTimestamps = range . ratePerMinute ( 1 ) ;
46+ const consumerTimestamps = range . ratePerMinute ( 1 ) ;
3947
48+ const producerInternalOnlyInstance = apm
4049 . service ( { name : 'producer-internal-only' , environment : ENVIRONMENT , agentName : 'go' } )
4150 . instance ( 'instance-a' ) ;
42- const producerInternalOnlyEvents = range
43- . interval ( '1m' )
44- . rate ( 1 )
45- . generator ( ( timestamp ) => {
46- return producerInternalOnlyInstance
47- . transaction ( { transactionName : 'Transaction A' } )
48- . timestamp ( timestamp )
49- . duration ( 1000 )
50- . success ( )
51- . children (
52- producerInternalOnlyInstance
53- . span ( { spanName : 'Span A' , spanType : 'custom' } )
54- . timestamp ( timestamp + 50 )
55- . duration ( 100 )
56- . success ( )
57- ) ;
58- } ) ;
59-
60- const spanASpanLink = getSpanLinksFromEvents (
61- Array . from ( producerInternalOnlyEvents ) . flatMap ( ( event ) => event . serialize ( ) )
62- ) ;
6351
6452 const producerConsumerInstance = apm
6553 . service ( { name : 'producer-consumer' , environment : ENVIRONMENT , agentName : 'java' } )
6654 . instance ( 'instance-b' ) ;
67- const producerConsumerEvents = range
68- . interval ( '1m' )
69- . rate ( 1 )
70- . generator ( ( timestamp ) => {
71- return producerConsumerInstance
72- . transaction ( { transactionName : 'Transaction B' } )
73- . timestamp ( timestamp )
74- . duration ( 1000 )
75- . success ( )
76- . children (
77- producerConsumerInstance
78- . span ( { spanName : 'Span B' , spanType : 'external' } )
79- . defaults ( {
80- 'span.links' : shuffle ( [ ...generateExternalSpanLinks ( ) , ...spanASpanLink ] ) ,
81- } )
82- . timestamp ( timestamp + 50 )
83- . duration ( 900 )
84- . success ( )
85- ) ;
86- } ) ;
87-
88- const producerConsumerApmFields = Array . from ( producerConsumerEvents ) . flatMap ( ( event ) =>
89- event . serialize ( )
90- ) ;
91-
92- const spanBSpanLink = getSpanLinksFromEvents ( producerConsumerApmFields ) ;
9355
9456 const consumerInstance = apm
9557 . service ( { name : 'consumer' , environment : ENVIRONMENT , agentName : 'ruby' } )
9658 . instance ( 'instance-c' ) ;
97- const consumerEvents = range
98- . interval ( '1m' )
99- . rate ( 1 )
100- . generator ( ( timestamp ) => {
101- return consumerInstance
102- . transaction ( { transactionName : 'Transaction C' } )
103- . timestamp ( timestamp )
104- . duration ( 1000 )
105- . success ( )
106- . children (
107- consumerInstance
108- . span ( { spanName : 'Span C' , spanType : 'external' } )
109- . defaults ( { 'span.links' : spanBSpanLink } )
110- . timestamp ( timestamp + 50 )
111- . duration ( 900 )
112- . success ( )
113- ) ;
114- } ) ;
59+
60+ const producerInternalOnlyEvents = producerTimestamps . generator ( ( timestamp ) =>
61+ producerInternalOnlyInstance
62+ . transaction ( { transactionName : 'Transaction A' } )
63+ . timestamp ( timestamp )
64+ . duration ( 1000 )
65+ . success ( )
66+ . children (
67+ producerInternalOnlyInstance
68+ . span ( { spanName : 'Span A' , spanType : 'messaging' , spanSubtype : 'kafka' } )
69+ . timestamp ( timestamp )
70+ . duration ( 100 )
71+ . success ( )
72+ )
73+ ) ;
74+
75+ const serializedProducerInternalOnlyEvents = Array . from ( producerInternalOnlyEvents ) . flatMap (
76+ ( event ) => event . serialize ( )
77+ ) ;
78+
79+ const unserializedProducerInternalOnlyEvents = serializedProducerInternalOnlyEvents . map (
80+ ( event ) => ( {
81+ fields : event ,
82+ serialize : ( ) => {
83+ return [ event ] ;
84+ } ,
85+ } )
86+ ) as Array < Serializable < ApmFields > > ;
87+
88+ const producerConsumerEvents = producerConsumerTimestamps . generator ( ( timestamp ) =>
89+ producerConsumerInstance
90+ . transaction ( { transactionName : 'Transaction B' } )
91+ . timestamp ( timestamp )
92+ . duration ( 1000 )
93+ . success ( )
94+ . children (
95+ producerConsumerInstance
96+ . span ( { spanName : 'Span B' , spanType : 'messaging' , spanSubtype : 'kafka' } )
97+ . defaults ( {
98+ 'span.links' : shuffle ( [
99+ ...generateExternalSpanLinks ( ) ,
100+ ...getSpanLinksFromEvents ( serializedProducerInternalOnlyEvents ) ,
101+ ] ) ,
102+ } )
103+ . timestamp ( timestamp )
104+ . duration ( 900 )
105+ . success ( )
106+ )
107+ ) ;
108+
109+ const serializedproducerConsumerEvents = Array . from ( producerConsumerEvents ) . flatMap ( ( event ) =>
110+ event . serialize ( )
111+ ) ;
112+
113+ const unserializedproducerConsumerEvents = serializedproducerConsumerEvents . map ( ( event ) => ( {
114+ fields : event ,
115+ serialize : ( ) => {
116+ return [ event ] ;
117+ } ,
118+ } ) ) as Array < Serializable < ApmFields > > ;
119+
120+ const consumerEvents = consumerTimestamps . generator ( ( timestamp ) =>
121+ consumerInstance
122+ . transaction ( { transactionName : 'Transaction C' } )
123+ . timestamp ( timestamp )
124+ . defaults ( {
125+ 'span.links' : getSpanLinksFromEvents ( serializedproducerConsumerEvents ) ,
126+ } )
127+ . duration ( 1000 )
128+ . success ( )
129+ ) ;
115130
116131 return withClient (
117132 apmEsClient ,
118- Readable . from ( Array . from ( producerInternalOnlyEvents ) . concat ( Array . from ( consumerEvents ) ) )
133+ logger . perf ( 'generating_span_links' , ( ) =>
134+ Readable . from ( [
135+ ...unserializedProducerInternalOnlyEvents ,
136+ ...unserializedproducerConsumerEvents ,
137+ ...Array . from ( consumerEvents ) ,
138+ ] )
139+ )
119140 ) ;
120141 } ,
121142 } ;
0 commit comments