/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.core.management.stats; import org.mule.runtime.core.api.construct.FlowConstruct; import java.io.Serializable; import java.util.concurrent.atomic.AtomicLong; /** * Accumulates the processing time for all branches of a flow */ public class ProcessingTime implements Serializable { /** * Serial version */ private static final long serialVersionUID = 1L; private AtomicLong accumulator = new AtomicLong(); private FlowConstructStatistics statistics; /** * Create a ProcessingTime for the specified MuleSession. * * @return ProcessingTime if the session has an enabled FlowConstructStatistics or null otherwise */ public static ProcessingTime newInstance(FlowConstruct flow) { FlowConstructStatistics stats = flow.getStatistics(); if (stats != null && flow.getStatistics().isEnabled()) { return new ProcessingTime(stats, flow.getMuleContext().getProcessorTimeWatcher()); } else { return null; } } /** * Create a Processing Time * * @param stats never null * @param muleContext */ private ProcessingTime(FlowConstructStatistics stats, ProcessingTimeWatcher processorTimeWatcher) { this.statistics = stats; processorTimeWatcher.addProcessingTime(this); } /** * Add the execution time for this branch to the flow construct's statistics * * @param startTime time this branch started */ public void addFlowExecutionBranchTime(long startTime) { if (statistics.isEnabled()) { long elapsedTime = getEffectiveTime(System.currentTimeMillis() - startTime); statistics.addFlowExecutionBranchTime(elapsedTime, accumulator.addAndGet(elapsedTime)); } } /** * Convert processing time to effective processing time. If processing took less than a tick, we consider it to have been one * millisecond */ public static long getEffectiveTime(long time) { return (time <= 0) ? 1L : time; } public FlowConstructStatistics getStatistics() { return statistics; } public AtomicLong getAccumulator() { return accumulator; } }