in validator/src/main/java/com/amazon/aoc/validators/TraceValidator.java [68:118]
public void validate() throws Exception {
// 2 retries for calling the sample app to handle the Lambda case,
// where first request might be a cold start and have an additional unexpected subsegment
boolean isMatched = RetryHelper.retry(2,
Integer.parseInt(GenericConstants.SLEEP_IN_MILLISECONDS.getVal()),
false,
() -> {
// Call sample app and get locally stored trace
Map<String, Object> storedTrace = this.getStoredTrace();
log.info("value of stored trace map: {}", storedTrace);
// prepare list of trace IDs to retrieve from X-Ray service
String traceId = (String) storedTrace.get("[0].trace_id");
List<String> traceIdList = Collections.singletonList(traceId);
// Retry 5 times to since segments might not be immediately available in X-Ray service
RetryHelper.retry(
5,
() -> {
// get retrieved trace from x-ray service
Map<String, Object> retrievedTrace = this.getRetrievedTrace(traceIdList);
log.info("value of retrieved trace map: {}", retrievedTrace);
// data model validation of other fields of segment document
for (Map.Entry<String, Object> entry : storedTrace.entrySet()) {
String targetKey = entry.getKey();
if (retrievedTrace.get(targetKey) == null) {
log.error("mis target data: {}", targetKey);
throw new BaseException(ExceptionCode.DATA_MODEL_NOT_MATCHED);
}
Pattern p = Pattern.compile(entry.getValue().toString(), Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(retrievedTrace.get(targetKey).toString());
if (!m.matches()) {
log.error("data model validation failed");
log.info("mis matched data model field list");
log.info("value of stored trace map: {}", entry.getValue());
log.info("value of retrieved map: {}", retrievedTrace.get(entry.getKey()));
log.info("==========================================");
throw new BaseException(ExceptionCode.DATA_MODEL_NOT_MATCHED);
}
}
});
});
if (!isMatched) {
throw new BaseException(ExceptionCode.DATA_MODEL_NOT_MATCHED);
}
log.info("validation is passed for path {}", caller.getCallingPath());
}