/**
  * Opens respective mediator logs in case of a continuation call.
  *
  * @param messageId message uuid which corresponds to the continuation flow.
  * @param componentId component name
  */
 public void openLogForContinuation(String messageId, String componentId) {
   if (continuationStateMap.containsKey(messageId)) {
     ContinuationStateHolder continuationStateHolder = continuationStateMap.get(messageId);
     int continuationIndex = continuationStateHolder.getCallbackPoint();
     Integer componentIndex = null;
     while (continuationIndex > continuationStateHolder.getContinuationStackPosition()) {
       StatisticsLog statisticsLog = messageFlowLogs.get(continuationIndex);
       if (statisticsLog.getComponentId().equals(componentId)) {
         componentIndex = continuationIndex;
       }
       continuationIndex = statisticsLog.getParentLevel();
     }
     if (componentIndex != null) {
       openLogs.addFirst(componentIndex);
       messageFlowLogs.get(componentIndex).setIsOpenedByContinuation(true);
       continuationStateHolder.setContinuationStackPosition(componentIndex);
     } else {
       if (log.isDebugEnabled()) {
         log.error("No log found to match the continuation component Id:" + componentId);
       }
     }
   } else {
     if (log.isDebugEnabled()) {
       log.debug("No continuation information found in statistic trace for this message Id.");
     }
   }
 }
 /**
  * After receiving a fault increment fault count of the statistics logs from its parent to the
  * root log to maintain correct fault hierarchy.
  *
  * @param parentIndexOfFault parent Index of the fault log
  */
 private void addFaultsToParents(int parentIndexOfFault) {
   while (parentIndexOfFault > PARENT_LEVEL_OF_ROOT) {
     StatisticsLog updatingLog = messageFlowLogs.get(parentIndexOfFault);
     updatingLog.incrementNoOfFaults();
     parentIndexOfFault = updatingLog.getParentLevel();
   }
 }
  private boolean isCloneFlow(int msgId) {
    for (int i = messageFlowLogs.size() - 1; i >= 0; i--) {
      StatisticsLog statisticsLog = messageFlowLogs.get(i);

      if (statisticsLog.getMsgId() == msgId) {
        return false;
      }
    }
    return true;
  }
  private Integer getParentFromMessageLogs(int msgId, int limit) {
    Integer immediateIndex = null;
    for (int i = messageFlowLogs.size() - 1; i >= 0; i--) {
      StatisticsLog statisticsLog = messageFlowLogs.get(i);

      if (statisticsLog.getMsgId() == msgId) {
        immediateIndex = i;
        break;
      }
    }
    return immediateIndex;
  }
  private Integer getParentFromOpenLogs(int msgId) {
    Integer immediateIndex = null;
    for (Integer index : openLogs) {
      StatisticsLog statisticsLog = messageFlowLogs.get(index);

      if (statisticsLog.getMsgId() == msgId) {
        immediateIndex = index;
        break;
      }
    }
    return immediateIndex;
  }
 private Integer getParentForClosedMsgFlow(int msgId) {
   Integer sameMsgIdLastLog = getParentFromMessageLogs(msgId);
   StatisticsLog lastLog = messageFlowLogs.get(sameMsgIdLastLog);
   while (lastLog.getParentMsgId() > DEFAULT_MSG_ID) {
     Integer parentIndex = getParentFromOpenLogs(lastLog.getParentMsgId());
     if (parentIndex != null) {
       return parentIndex;
     }
     lastLog = messageFlowLogs.get(lastLog.getParentLevel());
   }
   return getParentFromOpenLogs(DEFAULT_MSG_ID);
 }
  private Integer getImmediateAggregateIndex() {
    Integer immediateIndex = null;
    for (int i = messageFlowLogs.size() - 1; i >= 0; i--) {
      StatisticsLog statisticsLog = messageFlowLogs.get(i);

      if (statisticsLog.isAggregateLog()) {
        immediateIndex = i;
        break;
      }
    }
    return immediateIndex;
  }
 /**
  * Closes opened statistics log specified by the componentLevel.
  *
  * @param componentLevel index of the closing statistic log in messageFlowLogs
  * @param endTime endTime of the closing statistics log
  */
 private void closeStatisticLog(int componentLevel, Long endTime) {
   StatisticsLog currentLog = messageFlowLogs.get(componentLevel);
   if (log.isDebugEnabled()) {
     log.debug(
         "Closed statistic log of [ElementId"
             + currentLog.getComponentId()
             + "][MsgId"
             + currentLog.getParentMsgId());
   }
   currentLog.setEndTime(endTime);
   updateParentLogs(currentLog.getParentLevel(), endTime);
 }
 /**
  * This overloaded constructor will create the root statistic log og the Statistic Entry according
  * to given parameters. Statistic Event for creating statistic entry can be either PROXY, API or
  * SEQUENCE.
  *
  * @param statisticDataUnit statistic data unit with raw data
  */
 public StatisticsEntry(StatisticDataUnit statisticDataUnit) {
   StatisticsLog statisticsLog =
       new StatisticsLog(statisticDataUnit, DEFAULT_MSG_ID, PARENT_LEVEL_OF_ROOT);
   statisticsLog.setTimeStamp(statisticDataUnit.getTimeStamp());
   statisticsLog.setMessageFlowId(statisticDataUnit.getStatisticId());
   messageFlowLogs.add(statisticsLog);
   openLogs.addFirst(messageFlowLogs.size() - 1);
   if (log.isDebugEnabled()) {
     log.debug(
         "Created statistic Entry [Start|RootElement]|[ElementId|"
             + statisticDataUnit.getComponentId()
             + "]|[MsgId|"
             + statisticDataUnit.getCloneId()
             + "].");
   }
 }
示例#10
0
 /**
  * Updates parent logs from the specified element after an notification is received. It updates
  * all the ended parent logs from specified index.
  *
  * @param closedIndex child index in the messageFlowLogs Array List
  * @param endTime end time of the child
  */
 private void updateParentLogs(int closedIndex, Long endTime) {
   if (closedIndex > -1) {
     StatisticsLog updatingLog = messageFlowLogs.get(closedIndex);
     // if log is closed end time will be different than -1
     while (!(updatingLog.getEndTime() == -1)) {
       updatingLog.setEndTime(endTime);
       if (updatingLog.getParentLevel() == PARENT_LEVEL_OF_ROOT) {
         break;
       }
       updatingLog = messageFlowLogs.get(updatingLog.getParentLevel());
     }
     if (log.isDebugEnabled()) {
       log.debug("Log updating finished.");
     }
   }
 }
示例#11
0
 private void createNewCloneLog(StatisticDataUnit statisticDataUnit, int parentIndex) {
   StatisticsLog parentLog = messageFlowLogs.get(parentIndex);
   StatisticsLog statisticsLog =
       new StatisticsLog(statisticDataUnit, parentLog.getMsgId(), parentIndex);
   messageFlowLogs.add(statisticsLog);
   parentLog.setChildren(messageFlowLogs.size() - 1);
   openLogs.addFirst(messageFlowLogs.size() - 1);
   if (log.isDebugEnabled()) {
     log.debug(
         "Created statistic log for [ElementId|"
             + statisticDataUnit.getComponentId()
             + "]|[MsgId|"
             + statisticDataUnit.getCloneId()
             + "]");
   }
 }
示例#12
0
  /**
   * Create a new statistics log for the reported statistic event for given parameters.
   *
   * @param statisticDataUnit statistic data unit with raw data
   * @param parentIndex parentIndex of the statistic log
   */
  private void createNewLog(StatisticDataUnit statisticDataUnit, int parentIndex) {
    StatisticsLog parentLog = messageFlowLogs.get(parentIndex);

    StatisticsLog statisticsLog =
        new StatisticsLog(statisticDataUnit, parentLog.getMsgId(), parentIndex);

    Integer immediateParentFromMessageLogs =
        getImmediateParentFromMessageLogs(statisticsLog.getMsgId());

    if (immediateParentFromMessageLogs == null) {
      immediateParentFromMessageLogs = parentIndex;
    }

    StatisticsLog possibleParent = messageFlowLogs.get(immediateParentFromMessageLogs);
    Integer lastAggregateIndex = getImmediateAggregateIndex();
    StatisticsLog lastAggregateLog = null;
    if (lastAggregateIndex != null) {
      lastAggregateLog = messageFlowLogs.get(getImmediateAggregateIndex());
    }

    if (possibleParent.getImmediateChild() == null) {
      if (possibleParent.getChildren().size() == 0) {
        possibleParent.setImmediateChild(messageFlowLogs.size());
      } else {
        if (lastAggregateLog != null && lastAggregateLog.getImmediateChild() == null) {
          lastAggregateLog.setImmediateChild(messageFlowLogs.size());
          lastAggregateLog.setMsgId(statisticsLog.getMsgId());
        } else {
          log.error(
              "Trying to set branching tree for non clone ComponentId:"
                  + statisticDataUnit.getComponentId());
          possibleParent.setChildren(messageFlowLogs.size());
        }
      }
    } else {
      if (lastAggregateLog != null && lastAggregateLog.getImmediateChild() == null) {
        lastAggregateLog.setImmediateChild(messageFlowLogs.size());
        lastAggregateLog.setMsgId(statisticsLog.getMsgId());
      } else {
        if (possibleParent.getChildren().size() == 0) {
          possibleParent.setChildren(possibleParent.getImmediateChild());
          possibleParent.setImmediateChild(null);
          possibleParent.setChildren(messageFlowLogs.size());
          log.error(
              "Setting immediate child of the component:"
                  + possibleParent.getComponentId()
                  + " as branching child");
        } else {
          log.error("Unexpected unrecoverable error happened during statistics collection");
        }
      }
    }

    messageFlowLogs.add(statisticsLog);
    openLogs.addFirst(messageFlowLogs.size() - 1);
    if (log.isDebugEnabled()) {
      log.debug(
          "Created statistic log for [ElementId|"
              + statisticDataUnit.getComponentId()
              + "]|[MsgId|"
              + statisticDataUnit.getCloneId()
              + "]");
    }
  }
  public static PublishingFlow createPublishingFlow(List<StatisticsLog> messageFlowLogs) {

    // Data structure using to serialize thr statistic data while publishing.
    PublishingFlow publishingFlow = new PublishingFlow();

    // Payload map which contains all the payloads of the message flow.
    Map<String, PublishingPayload> payloadMap = new HashMap<>();

    // Constants
    final String REFER = "#REFER:";
    final String BEFORE = "before-";
    final String AFTER = "after-";
    final Integer BEFORE_PAYLOAD = 8; // 8th attribute setting @PublishingEvent
    final Integer AFTER_PAYLOAD = 9; // 9th attribute setting @PublishingEvent

    String entryPoint = messageFlowLogs.get(0).getComponentName();
    String flowId = messageFlowLogs.get(0).getMessageFlowId();
    Integer entrypointHashcode = messageFlowLogs.get(0).getHashCode();

    boolean isTracingEnabledForFlow = messageFlowLogs.get(0).isTracingEnabled();

    for (int index = 0; index < messageFlowLogs.size(); index++) {
      StatisticsLog currentStatLog = messageFlowLogs.get(index);
      if (currentStatLog == null) {
        continue;
      }

      // Add each event to Publishing Flow
      publishingFlow.addEvent(
          new PublishingEvent(flowId, index, currentStatLog, entryPoint, entrypointHashcode));

      // Skip the rest of things, if message tracing is disabled
      if (!RuntimeStatisticCollector.isCollectingPayloads()) {
        continue;
      }

      // Skip flow is tracing is not enabled for the flow (from UI)
      if (!isTracingEnabledForFlow) {
        continue;
      }

      // Update children's immediateParent index
      List<Integer> childrenOfCurrent = currentStatLog.getChildren();
      for (Integer child : childrenOfCurrent) {
        messageFlowLogs.get(child).setImmediateParent(currentStatLog.getCurrentIndex());
      }

      if (currentStatLog.getBeforePayload() != null && currentStatLog.getAfterPayload() == null) {
        currentStatLog.setAfterPayload(currentStatLog.getBeforePayload());
      }

      if (currentStatLog.getBeforePayload() == null) {
        int parentIndex = currentStatLog.getImmediateParent();
        StatisticsLog parentStatLog = messageFlowLogs.get(parentIndex);

        if (parentStatLog.getAfterPayload().startsWith(REFER)) {
          // Parent also referring to after-payload
          currentStatLog.setBeforePayload(parentStatLog.getAfterPayload());
          currentStatLog.setAfterPayload(parentStatLog.getAfterPayload());

          String referringIndex = parentStatLog.getAfterPayload().split(":")[1];

          payloadMap
              .get(AFTER + referringIndex)
              .addEvent(new PublishingPayloadEvent(index, BEFORE_PAYLOAD));
          payloadMap
              .get(AFTER + referringIndex)
              .addEvent(new PublishingPayloadEvent(index, AFTER_PAYLOAD));

        } else {
          // Create a new after-payload reference
          currentStatLog.setBeforePayload(REFER + parentIndex);
          currentStatLog.setAfterPayload(REFER + parentIndex);

          payloadMap
              .get(AFTER + parentIndex)
              .addEvent(new PublishingPayloadEvent(index, BEFORE_PAYLOAD));
          payloadMap
              .get(AFTER + parentIndex)
              .addEvent(new PublishingPayloadEvent(index, AFTER_PAYLOAD));
        }

      } else {

        // For content altering components
        PublishingPayload publishingPayloadBefore = new PublishingPayload();
        publishingPayloadBefore.setPayload(currentStatLog.getBeforePayload());
        publishingPayloadBefore.addEvent(new PublishingPayloadEvent(index, BEFORE_PAYLOAD));
        payloadMap.put(BEFORE + index, publishingPayloadBefore);

        PublishingPayload publishingPayloadAfter = new PublishingPayload();
        publishingPayloadAfter.setPayload(currentStatLog.getAfterPayload());
        publishingPayloadAfter.addEvent(new PublishingPayloadEvent(index, AFTER_PAYLOAD));
        payloadMap.put(AFTER + index, publishingPayloadAfter);
      }
    }

    publishingFlow.setMessageFlowId(flowId);
    // Move all payloads to publishingFlow object
    publishingFlow.setPayloads(payloadMap.values());

    return publishingFlow;
  }