public void validate()

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());
  }