package Ġorg . http 4 k Ċ Ċ import Ġcom . nat pr y ce . ham k rest . assertion . assertThat Ċ import Ġcom . nat pr y ce . ham k rest . equalTo Ċ import Ġcom . nat pr y ce . ham k rest . has Size Ċ import Ġcom . nat pr y ce . ham k rest . present Ċ import Ġorg . http 4 k . Tracing Functional Test . Service . Service A Ċ import Ġorg . http 4 k . Tracing Functional Test . Service . Service B Ċ import Ġorg . http 4 k . Tracing Functional Test . Service . Service C Ċ import Ġorg . http 4 k . client . Java HttpClient Ċ import Ġorg . http 4 k . core . Filter Ċ import Ġorg . http 4 k . core . Http Handler Ċ import Ġorg . http 4 k . core . Method . GET Ċ import Ġorg . http 4 k . core . Request Ċ import Ġorg . http 4 k . core . Response Ċ import Ġorg . http 4 k . core . Status Ċ import Ġorg . http 4 k . core . Uri Ċ import Ġorg . http 4 k . core . then Ċ import Ġorg . http 4 k . filter . Client Filters Ċ import Ġorg . http 4 k . filter . Server Filters Ċ import Ġorg . http 4 k . filter . Zip kin Tr aces Ċ import Ġorg . http 4 k . server . Sun Http Ċ import Ġorg . http 4 k . server . as Server Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . fail Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ class ĠTr acing Functional Test Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠService Ġ{ ĠService A , ĠService B , ĠService C Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtraces Ġ= ĠConcurrent HashMap < Service , ĠZip kin Tr aces >() ĊĠĠĠ Ġprivate Ġval Ġregistry Ġ= ĠConcurrent HashMap < Service , ĠInt >() ĊĊĠĠĠ Ġprivate Ġfun ĠService . start ( var arg Ġother Services : ĠHttp Handler ) Ġ= ĊĠĠĠĠĠĠĠ ĠServer Filters . Request Tracing ( record Tr aces ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then ( make Calls (* other Services )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then Ġ{ ĠResponse ( Status . OK ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Server ( Sun Http ( 0 )). start (). apply Ġ{ Ġregistry [ this @ start ] Ġ= Ġport () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclient For ( service : ĠService ) Ġ= ĊĠĠĠĠĠĠĠ ĠClient Filters . Request Tracing () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then ( Client Filters . Set Base Uri From ( Uri . of (" http :// localhost :${ service . port ()} "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. then ( Java HttpClient ()) ĊĊĠĠĠ Ġprivate Ġfun Ġmake Calls ( var arg Ġclients : ĠHttp Handler ) Ġ= ĠFilter Ġ{ Ġnext Ġ-> ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclients . forEach Ġ{ Ġclient Ġ-> Ġclient ( Request ( GET , Ġ"")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠService . record Tr aces () Ġ= Ġ{ Ġ_: ĠRequest , Ġtrace : ĠZip kin Tr aces Ġ-> Ġtraces . put ( this , Ġtrace ) Ġ} ĊĠĠĠ Ġprivate Ġfun ĠService . traces () Ġ= Ġtraces [ this ] Ġ?: Ġfail (" trace Ġnot Ġpresent ") ĊĠĠĠ Ġprivate Ġfun ĠService . port () Ġ= Ġregistry [ this ] Ġ?: Ġerror (" could Ġnot Ġfind Ġserver Ġport ") ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` single Ġserver Ġcall `() Ġ{ ĊĠĠĠĠĠĠĠ ĠService A . start () ĊĠĠĠĠĠĠĠ Ġval Ġclient A Ġ= Ġclient For ( Service A ) ĊĊĠĠĠĠĠĠĠ Ġclient A ( Request ( GET , Ġ"/ ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġtraces Ġ= ĠService A . traces () ĊĠĠĠĠĠĠĠ ĠassertThat ( traces . trace Id , Ġpresent ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( traces . span Id , Ġpresent ()) ĊĠĠĠĠĠĠĠ ĠassertThat ( traces . parent Span Id , Ġpresent ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` server Ġto Ġserver Ġcall `() Ġ{ ĊĠĠĠĠĠĠĠ ĠService B . start () ĊĠĠĠĠĠĠĠ ĠService A . start ( client For ( Service B )) ĊĠĠĠĠĠĠĠ Ġval Ġclient A Ġ= Ġclient For ( Service A ) ĊĊĠĠĠĠĠĠĠ Ġclient A ( Request ( GET , Ġ"/ ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġtrace A Ġ= ĠService A . traces () ĊĠĠĠĠĠĠĠ Ġval Ġtrace B Ġ= ĠService B . traces () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( trace A . trace Id , ĠequalTo ( trace B . trace Id )) ĊĠĠĠĠĠĠĠ ĠassertThat ( trace B . parent Span Id , ĠequalTo ( trace A . span Id )) ĊĠĠĠĠĠĠĠ ĠassertThat ( trace B . span Id , Ġ! equalTo ( trace A . span Id )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` multiple Ġcalls `() Ġ{ ĊĠĠĠĠĠĠĠ ĠService B . start () ĊĠĠĠĠĠĠĠ ĠService C . start () ĊĠĠĠĠĠĠĠ ĠService A . start ( client For ( Service B ), Ġclient For ( Service C )) ĊĠĠĠĠĠĠĠ Ġval Ġclient A Ġ= Ġclient For ( Service A ) ĊĊĠĠĠĠĠĠĠ Ġclient A ( Request ( GET , Ġ"/ ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġtrace A Ġ= ĠService A . traces () ĊĠĠĠĠĠĠĠ Ġval Ġtrace B Ġ= ĠService B . traces () ĊĠĠĠĠĠĠĠ Ġval Ġtrace C Ġ= ĠService C . traces () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( set Of ( trace A . trace Id , Ġtrace B . trace Id , Ġtrace C . trace Id ), Ġhas Size ( equalTo ( 1 ))) ĊĠĠĠĠĠĠĠ ĠassertThat ( set Of ( trace B . parent Span Id , Ġtrace C . parent Span Id ), ĠequalTo ( set Of ( trace A . span Id ))) ĊĠĠĠĠĠĠĠ ĠassertThat ( set Of ( trace A . span Id , Ġtrace B . span Id , Ġtrace C . span Id ), Ġhas Size ( equalTo ( 3 ))) ĊĠĠĠ Ġ} Ċ } Ċ