public static void end() {
    if (logger.isDebugEnabled()) {
      try {
        long thread = Thread.currentThread().getId();
        CloudOperation current = operations.get(thread);

        if (current == null) {
          return;
        }
        CloudOperation parent = null;

        while (current.currentChild != null) {
          parent = current;
          current = current.currentChild;
        }
        current.endTimestamp = System.currentTimeMillis();
        if (parent != null) {
          if (parent.priorChildren == null) {
            parent.priorChildren = new ArrayList<CloudOperation>();
          }
          parent.priorChildren.add(current);
          parent.currentChild = null;
        } else {
          operations.remove(thread);
        }
        log(current);
      } catch (Throwable t) {
        logger.warn("Error with API trace end: " + t.getMessage());
      }
    }
  }
  public static void trace(@Nonnull CloudProvider provider, @Nonnull String apiCall) {
    if (logger.isInfoEnabled()) {
      ProviderContext ctx = provider.getContext();
      String accountNumber = getAccountNumber(ctx);
      String callName =
          provider.getProviderName().replaceAll(DELIMITER_REGEX, "_")
              + DELIMITER
              + provider.getCloudName().replaceAll(DELIMITER_REGEX, "_")
              + DELIMITER
              + accountNumber.replaceAll(DELIMITER_REGEX, "_")
              + DELIMITER
              + apiCall;

      try {
        CloudOperation current = null;

        if (logger.isDebugEnabled()) {
          long thread = Thread.currentThread().getId();

          current = operations.get(thread);
          if (current != null) {
            while (current.currentChild != null) {
              current = current.currentChild;
            }
            current.calls++;
          }
        }
        synchronized (apiCount) {
          if (apiCount.containsKey(callName)) {
            apiCount.put(callName, apiCount.get(callName) + 1);
          } else {
            apiCount.put(callName, 1L);
          }
        }
        if (logger.isTraceEnabled()) {
          if (current != null) {
            if (current.apiCalls == null) {
              current.apiCalls = new ArrayList<String>();
            }
            current.apiCalls.add(apiCall);
          }
        }
      } catch (Throwable t) {
        logger.warn("Error with API trace trace: " + t.getMessage());
      }
    }
  }
  public static void begin(@Nonnull CloudProvider provider, @Nonnull String operationName) {
    if (logger.isDebugEnabled()) {
      try {
        ProviderContext ctx = provider.getContext();
        String accountNumber = getAccountNumber(ctx);

        operationName =
            provider.getProviderName().replaceAll(DELIMITER_REGEX, "_")
                + DELIMITER
                + provider.getCloudName().replaceAll(DELIMITER_REGEX, "_")
                + DELIMITER
                + accountNumber.replaceAll(DELIMITER_REGEX, "_")
                + DELIMITER
                + operationName;
        long thread = Thread.currentThread().getId();
        CloudOperation operation = new CloudOperation(operationName);
        CloudOperation current = operations.get(thread);

        if (current == null) {
          operations.put(thread, operation);
        } else {
          while (current.currentChild != null) {
            current = current.currentChild;
          }
          current.currentChild = operation;
        }
        synchronized (operationCount) {
          if (operationCount.containsKey(operationName)) {
            operationCount.put(operationName, operationCount.get(operationName) + 1);
          } else {
            operationCount.put(operationName, 1L);
          }
        }
      } catch (Throwable t) {
        logger.warn("Error with API trace begin: " + t.getMessage());
      }
    }
  }