1919import com .amazon .aoc .exception .BaseException ;
2020import com .amazon .aoc .exception .ExceptionCode ;
2121import com .amazon .aoc .fileconfigs .FileConfig ;
22+ import com .amazon .aoc .helpers .MustacheHelper ;
2223import com .amazon .aoc .models .Context ;
2324import com .amazon .aoc .models .SampleAppResponse ;
2425import com .amazon .aoc .services .XRayService ;
2526import com .amazonaws .services .xray .model .Trace ;
2627import com .github .wnameless .json .flattener .JsonFlattener ;
2728import lombok .extern .log4j .Log4j2 ;
28- import org .json .simple .JSONObject ;
29- import org .json .simple .parser .JSONParser ;
3029
31- import java .io .FileReader ;
3230import java .util .*;
3331import java .util .concurrent .TimeUnit ;
3432
3533@ Log4j2
3634public class TraceValidator implements IValidator {
37- private static int MAX_RETRY_COUNT = 3 ;
38- private XRayService xrayService ;
39- private ICaller caller ;
40- private FileConfig expectedTrace ;
35+ private MustacheHelper mustacheHelper = new MustacheHelper ();
36+ private XRayService xrayService ;
37+ private ICaller caller ;
38+ private Context context ;
39+ private FileConfig expectedTrace ;
4140
4241 @ Override
4342 public void init (Context context , ICaller caller , FileConfig expectedTrace ) throws Exception {
4443 this .xrayService = new XRayService (context .getRegion ());
4544 this .caller = caller ;
45+ this .context = context ;
4646 this .expectedTrace = expectedTrace ;
4747 }
4848
@@ -60,12 +60,14 @@ public void validate() throws Exception {
6060
6161 // validation of trace id
6262 if (!storedTrace .get ("trace_id" ).equals (retrievedTrace .get ("trace_id" ))) {
63+ log .error ("trace id validation failed" );
6364 throw new BaseException (ExceptionCode .TRACE_ID_NOT_MATCHED );
6465 }
6566
6667 // data model validation of other fields of segment document
6768 for (Map .Entry <String , Object > entry : storedTrace .entrySet ()) {
6869 if (!entry .getValue ().equals (retrievedTrace .get (entry .getKey ()))) {
70+ log .error ("data model validation failed" );
6971 log .info ("mis matched data model field list" );
7072 log .info ("value of stored trace map: {}" , entry .getValue ());
7173 log .info ("value of retrieved map: {}" ,retrievedTrace .get (entry .getKey ()));
@@ -78,35 +80,56 @@ public void validate() throws Exception {
7880 // this method will hit get trace from x-ray service and get retrieved trace
7981 private Map <String , Object > getRetrievedTrace (List <String > traceIdList ) throws Exception {
8082 Map <String , Object > flattenedJsonMapForRetrievedTrace = null ;
83+ List <Trace > retrieveTraceList = null ;
84+ int MAX_RETRY_COUNT = 3 ;
85+ int count = 1 ;
86+
87+ while (retrieveTraceList == null || retrieveTraceList .isEmpty ()) {
88+ // wait for sample app to send trace data to x-ray
89+ log .info ("sleeping for 15 seconds before retrieving data from x-ray service" );
90+ TimeUnit .SECONDS .sleep (15 );
91+
92+ try {
93+ retrieveTraceList = xrayService .listTraceByIds (traceIdList );
94+ } catch (Exception e ) {
95+ log .error ("exception while retrieving trace data from x-ray service" + e .getMessage ());
96+ e .printStackTrace ();
97+ }
8198
82- // retrieve trace from x-ray service
83- TimeUnit . SECONDS . sleep ( 15 ) ;
84- List < Trace > retrieveTraceList = xrayService . listTraceByIds ( traceIdList );
99+ if ( count == MAX_RETRY_COUNT ) {
100+ break ;
101+ }
85102
86- try {
87- // flattened JSON object to a map
88- flattenedJsonMapForRetrievedTrace = JsonFlattener .flattenAsMap (retrieveTraceList .get (0 ).getSegments ().get (0 ).getDocument ());
89- } catch (Exception e ) {
90- e .printStackTrace ();
103+ count ++;
104+ }
105+
106+ // flattened JSON object to a map
107+ if (retrieveTraceList != null && !retrieveTraceList .isEmpty ()) {
108+ try {
109+ flattenedJsonMapForRetrievedTrace = JsonFlattener .flattenAsMap (retrieveTraceList .get (0 ).getSegments ().get (0 ).getDocument ());
110+ } catch (Exception e ) {
111+ log .error ("exception while flattening the retrieved trace: " + e .getMessage ());
112+ e .printStackTrace ();
113+ }
114+ } else {
115+ log .error ("retrieved trace list is empty or null" );
116+ throw new BaseException (ExceptionCode .EMPTY_LIST );
91117 }
92118
93119 return flattenedJsonMapForRetrievedTrace ;
94120 }
95121
96122 // this method will hit a http endpoints of sample web apps and get stored trace
97123 private Map <String , Object > getStoredTrace () throws Exception {
98- String PATH = "src/main/resources" ;
99124 Map <String , Object > flattenedJsonMapForStoredTraces = null ;
100125
101126 SampleAppResponse sampleAppResponse = this .caller .callSampleApp ();
102127
103- JSONParser parser = new JSONParser ();
104- try {
105- Object obj = parser .parse (new FileReader (PATH + this .expectedTrace .getPath ()));
106- JSONObject jsonObject = (JSONObject ) obj ;
128+ String jsonExpectedTrace = mustacheHelper .render (this .expectedTrace , context );
107129
130+ try {
108131 // flattened JSON object to a map
109- flattenedJsonMapForStoredTraces = JsonFlattener .flattenAsMap (jsonObject . toString () );
132+ flattenedJsonMapForStoredTraces = JsonFlattener .flattenAsMap (jsonExpectedTrace );
110133 flattenedJsonMapForStoredTraces .put ("trace_id" , sampleAppResponse .getTraceId ());
111134 } catch (Exception e ) {
112135 e .printStackTrace ();
0 commit comments