... /** * Actions queue statistics. */ public class ActionsQueueStats extends AbstractStats { /** * Stats values definitions. */ public static enum StatDef { /** * Requested actions. */ REQUESTED_ACTIONS("ReqAct"), /** * Requested create actions. */ REQUESTED_CREATE_ACTIONS("ReqCreAct"), /** * Requested update actions. */ REQUESTED_UPDATE_ACTIONS("ReqUpdAct"), /** * Requested delete actions. */ REQUESTED_DELETE_ACTIONS("ReqDelAct"), /** * Enqueued actions. */ ENQUEUED_ACTIONS("EnqAct"), /** * Last (on last request) queue elements count. */ LAST_QUEUE_ELEMENTS("LastQEls"), /** * Min queue elements count on request. */ MIN_QUEUE_ELEMENTS("MinQEls"), /** * Max queue elements count on request. */ MAX_QUEUE_ELEMENTS("MaxQEls"), /** * Average queue elements count on request. */ AVG_QUEUE_ELEMENTS("AvgQEls"), /** * Processed actions. */ PROCESSED_ACTIONS("ProcAct"), /** * Processed actions batches. */ PROCESSED_BATCHES("ProcBat"), /** * Total processing time. */ PROCESSING_TIME("ProcTime"), /** * Min batch processing time. */ MIN_BATCH_PROCESSING_TIME("MinBProcTime"), /** * Max batch processing time. */ MAX_BATCH_PROCESSING_TIME("MaxBProcTime"), /** * Average batch processing time. */ AVG_BATCH_PROCESSING_TIME("AvgBProcTime"), /** * Min batch size. */ MIN_BATCH_SIZE("MinBSize"), /** * Max batch size. */ MAX_BATCH_SIZE("MaxBSize"), /** * Average batch size. */ AVG_BATCH_SIZE("AvgBSize"), /** * Queue overflows count. */ QUEUE_OVERFLOWS("QFull"), /** * Processing errors count. */ PROCESSING_ERRORS("ProcERR"); /** * Stats value name. */ private String statName; /** * Constructor. * * @param aStatName stats value name. */ private StatDef(final String aStatName) { statName = aStatName; } /** * Get stats value name. * * @return the stats value name. */ public String getStatName() { return statName; } /** * Get stats label for print. * * @return stats label for print. */ public String getStatLabel() { return " " + statName + ": "; } /** * Get all supported stat values names. * * @return stat values names list. */ public static List<String> getStatNames() { List<String> ret = new ArrayList<String>(StatDef.values().length); for (StatDef v : StatDef.values()) { ret.add(v.getStatName()); } return ret; } } /** * Min size value. */ public static final long MIN_SIZE_DEFAULT = Long.MAX_VALUE; /** * Max size value. */ public static final long MAX_SIZE_DEFAULT = 0L; /** * Requested actions. */ private StatValue requestedActions; /** * Requested create actions. */ private StatValue requestedCreateActions; /** * Requested update actions. */ private StatValue requestedUpdateActions; /** * Requested delete actions. */ private StatValue requestedDeleteActions; /** * Enqueued actions. */ private StatValue enqueuedActions; /** * Last (on last request) queue elements count. */ private StatValue lastQueueElements; /** * Min queue elements count on request. */ private StatValue minQueueElements; /** * Max queue elements count on request. */ private StatValue maxQueueElements; /** * Queue elements sum. Used to calculate average value. */ private StatValue queueElementsSum; /** * Processed actions. */ private StatValue processedActions; /** * Processed actions batches. */ private StatValue processedBatches; /** * Total processing time. */ private StatValue processingTime; /** * Min batch processing time. */ private StatValue minBatchProcessingTime; /** * Max batch processing time. */ private StatValue maxBatchProcessingTime; /** * Min batch size. */ private StatValue minBatchSize; /** * Max batch size. */ private StatValue maxBatchSize; /** * Queue overflows count. */ private StatValue queueOverflows; /** * Processing processingErrors count. */ private StatValue processingErrors; /** * Name of the stats value. */ private String name; /** * Constructor. * * @param aName stats name. * @param selectedIntervals supported stats intervals. */ public ActionsQueueStats(final String aName, final Interval[] selectedIntervals) { Long longPattern = Long.valueOf(0); name = aName; requestedActions = StatValueFactory.createStatValue(longPattern, "requestedActions", selectedIntervals); requestedCreateActions = StatValueFactory.createStatValue(longPattern, "requestedCreateActions", selectedIntervals); requestedUpdateActions = StatValueFactory.createStatValue(longPattern, "requestedUpdateActions", selectedIntervals); requestedDeleteActions = StatValueFactory.createStatValue(longPattern, "requestedDeleteActions", selectedIntervals); enqueuedActions = StatValueFactory.createStatValue(longPattern, "enqueuedActions", selectedIntervals); lastQueueElements = StatValueFactory.createStatValue(longPattern, "lastQueueElements", selectedIntervals); minQueueElements = StatValueFactory.createStatValue(longPattern, "minQueueElements", selectedIntervals); minQueueElements.setDefaultValueAsLong(MIN_SIZE_DEFAULT); minQueueElements.reset(); maxQueueElements = StatValueFactory.createStatValue(longPattern, "maxQueueElements", selectedIntervals); maxQueueElements.setDefaultValueAsLong(MAX_SIZE_DEFAULT); maxQueueElements.reset(); queueElementsSum = StatValueFactory.createStatValue(longPattern, "queueElementsSum", selectedIntervals); processedActions = StatValueFactory.createStatValue(longPattern, "processedActions", selectedIntervals); processedBatches = StatValueFactory.createStatValue(longPattern, "processedBatches", selectedIntervals); processingTime = StatValueFactory.createStatValue(longPattern, "processingTime", selectedIntervals); minBatchProcessingTime = StatValueFactory.createStatValue(longPattern, "minBatchProcessingTime", selectedIntervals); minBatchProcessingTime.setDefaultValueAsLong(MIN_SIZE_DEFAULT); minBatchProcessingTime.reset(); maxBatchProcessingTime = StatValueFactory.createStatValue(longPattern, "maxBatchProcessingTime", selectedIntervals); maxBatchProcessingTime.setDefaultValueAsLong(MAX_SIZE_DEFAULT); maxBatchProcessingTime.reset(); minBatchSize = StatValueFactory.createStatValue(longPattern, "minBatchSize", selectedIntervals); minBatchSize.setDefaultValueAsLong(MIN_SIZE_DEFAULT); minBatchSize.reset(); maxBatchSize = StatValueFactory.createStatValue(longPattern, "maxBatchSize", selectedIntervals); maxBatchSize.setDefaultValueAsLong(MAX_SIZE_DEFAULT); maxBatchSize.reset(); queueOverflows = StatValueFactory.createStatValue(longPattern, "queueOverflows", selectedIntervals); processingErrors = StatValueFactory.createStatValue(longPattern, "processingErrors", selectedIntervals); } /* (non-Javadoc) * @see net.java.dev.moskito.core.producers.AbstractStats#getName() */ @Override public final String getName() { return name; } /* (non-Javadoc) * @see net.java.dev.moskito.core.producers.AbstractStats#getAvailableValueNames() */ @Override public final List<String> getAvailableValueNames() { return StatDef.getStatNames(); } /** * Add requested (planned to be enqueued) action to stats. * * @param action requested action. * @param aCurrentQueueElements current queue elements count. */ public final void addRequestedAction(final CMProfileAction action, final long aCurrentQueueElements) { requestedActions.increase(); switch (action.getType()) { case INSERT: requestedCreateActions.increase(); break; case UPDATE: requestedUpdateActions.increase(); break; case DELETE: requestedDeleteActions.increase(); break; default: // do nothing } lastQueueElements.setValueAsLong(aCurrentQueueElements); minQueueElements.setValueIfLesserThanCurrentAsLong(aCurrentQueueElements); maxQueueElements.setValueIfGreaterThanCurrentAsLong(aCurrentQueueElements); queueElementsSum.increaseByLong(aCurrentQueueElements); } /** * Add enqueued action to stats. */ public final void addEnqueuedAction() { enqueuedActions.increase(); } /** * Add processed actions batch to stats. * * @param actions processed actions. * @param aProcessingTime processing time in mills. */ public final void addProcessedBatch(final List<CMProfileAction> actions, final long aProcessingTime) { processedActions.increaseByLong(actions.size()); processedBatches.increase(); processingTime.increaseByLong(aProcessingTime); minBatchProcessingTime.setValueIfLesserThanCurrentAsLong(aProcessingTime); maxBatchProcessingTime.setValueIfGreaterThanCurrentAsLong(aProcessingTime); minBatchSize.setValueIfLesserThanCurrentAsLong(actions.size()); maxBatchSize.setValueIfGreaterThanCurrentAsLong(actions.size()); } /** * Add queue overflow (unrecoverable overflow) to stats. */ public final void addQueueOverflow() { queueOverflows.increase(); } /** * Add processing error to stats. */ public final void addProcessingError() { processingErrors.increase(); } /** * Get average queue elements. * * @param intervalName interval name. * @return The average queue elements. Or 0 if no processed actions. */ public final long getAvgQueueElements(final String intervalName) { long processedActionsValue = processedActions.getValueAsLong(intervalName); return processedActionsValue != 0 ? queueElementsSum.getValueAsLong(intervalName) / processedActionsValue : 0; } /** * Get average batch size stats. * * @param intervalName interval name. * @return The average batch size. Or 0 if no processed batches. */ public final long getAvgBatchSize(final String intervalName) { long processedBatchesValue = processedBatches.getValueAsLong(intervalName); return processedBatchesValue != 0 ? processedActions.getValueAsLong(intervalName) / processedBatchesValue : 0; } /** * Get average processing time stats. * * @param intervalName interval name. * @return The average processing time. Or 0 if no processed batches. */ public final long getAvgBatchProcessingTime(final String intervalName) { long processedBatchesValue = processedBatches.getValueAsLong(intervalName); return processedBatchesValue != 0 ? processingTime.getValueAsLong(intervalName) / processedBatchesValue : 0; } /** * Decorate min stat value. * * @param minValue value to decorate. * @return minValue if it was set and 0 otherwise. */ public final long decorateMinValue(final long minValue) { return minValue < MIN_SIZE_DEFAULT ? minValue : 0; } @Override public final String toStatsString(final String intervalName, final TimeUnit timeUnit) { StringBuilder b = new StringBuilder(); b.append(getName()).append(' '); b.append(StatDef.REQUESTED_ACTIONS.getStatLabel()).append(requestedActions.getValueAsLong(intervalName)); b.append(StatDef.REQUESTED_CREATE_ACTIONS.getStatLabel()).append(requestedCreateActions.getValueAsLong(intervalName)); b.append(StatDef.REQUESTED_UPDATE_ACTIONS.getStatLabel()).append(requestedUpdateActions.getValueAsLong(intervalName)); b.append(StatDef.REQUESTED_DELETE_ACTIONS.getStatLabel()).append(requestedDeleteActions.getValueAsLong(intervalName)); b.append(StatDef.ENQUEUED_ACTIONS.getStatLabel()).append(enqueuedActions.getValueAsLong(intervalName)); b.append(StatDef.LAST_QUEUE_ELEMENTS.getStatLabel()).append(lastQueueElements.getValueAsLong(intervalName)); b.append(StatDef.MIN_QUEUE_ELEMENTS.getStatLabel()).append(decorateMinValue(minQueueElements.getValueAsLong(intervalName))); b.append(StatDef.MAX_QUEUE_ELEMENTS.getStatLabel()).append(maxQueueElements.getValueAsLong(intervalName)); b.append(StatDef.AVG_QUEUE_ELEMENTS.getStatLabel()).append(getAvgQueueElements(intervalName)); b.append(StatDef.PROCESSED_ACTIONS.getStatLabel()).append(processedActions.getValueAsLong(intervalName)); b.append(StatDef.PROCESSED_BATCHES.getStatLabel()).append(processedBatches.getValueAsLong(intervalName)); b.append(StatDef.PROCESSING_TIME.getStatLabel()).append(processingTime.getValueAsLong(intervalName)); b.append(StatDef.MIN_BATCH_PROCESSING_TIME.getStatLabel()).append(decorateMinValue(minBatchProcessingTime.getValueAsLong(intervalName))); b.append(StatDef.MAX_BATCH_PROCESSING_TIME.getStatLabel()).append(maxBatchProcessingTime.getValueAsLong(intervalName)); b.append(StatDef.AVG_BATCH_PROCESSING_TIME.getStatLabel()).append(getAvgBatchProcessingTime(intervalName)); b.append(StatDef.MIN_BATCH_SIZE.getStatLabel()).append(decorateMinValue(minBatchSize.getValueAsLong(intervalName))); b.append(StatDef.MAX_BATCH_SIZE.getStatLabel()).append(maxBatchSize.getValueAsLong(intervalName)); b.append(StatDef.AVG_BATCH_SIZE.getStatLabel()).append(getAvgBatchSize(intervalName)); b.append(StatDef.QUEUE_OVERFLOWS.getStatLabel()).append(queueOverflows.getValueAsLong(intervalName)); b.append(StatDef.PROCESSING_ERRORS.getStatLabel()).append(processingErrors.getValueAsLong(intervalName)); return b.toString(); } }