/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.calcnode.stats; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.threeten.bp.Instant; /** * Gatherer that maintains ever increasing totals of the reported metrics. * <p> * This is run centrally to record the success and failure of jobs. */ public class TotallingNodeStatisticsGatherer implements CalculationNodeStatisticsGatherer { /** * The statistics. */ private final ConcurrentMap<String, CalculationNodeStatistics> _nodeStatistics = new ConcurrentHashMap<String, CalculationNodeStatistics>(); @Override public void jobCompleted(String nodeId, int jobItems, long executionTime, long duration) { getOrCreateNodeStatistics(nodeId).recordSuccessfulJob(jobItems, executionTime, duration); } @Override public void jobFailed(String nodeId, long duration) { getOrCreateNodeStatistics(nodeId).recordUnsuccessfulJob(duration); } /** * Creates the statistics for a given node. * * @param nodeId the node id, not null * @return the statistics, not null */ protected CalculationNodeStatistics getOrCreateNodeStatistics(final String nodeId) { CalculationNodeStatistics stats = _nodeStatistics.get(nodeId); if (stats == null) { _nodeStatistics.putIfAbsent(nodeId, new CalculationNodeStatistics(nodeId)); stats = _nodeStatistics.get(nodeId); } return stats; } /** * Gets the node statistics as a list. * <p> * Each statistics element is live. * * @return an independent list of the statistics, not null */ public List<CalculationNodeStatistics> getNodeStatistics() { return new ArrayList<CalculationNodeStatistics>(_nodeStatistics.values()); } /** * Cleanup the statistics deleting all information before a fixed instant. * * @param dropBefore the instant to delete before, not null */ public void dropStatisticsBefore(final Instant dropBefore) { final Iterator<CalculationNodeStatistics> it = _nodeStatistics.values().iterator(); while (it.hasNext()) { final CalculationNodeStatistics nodeStatistics = it.next(); if (nodeStatistics.getLastJobTime().isBefore(dropBefore)) { it.remove(); } } } }