/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.calcnode; import com.codahale.metrics.Timer; import com.opengamma.engine.cache.DeferredStatistics; import com.opengamma.engine.calcnode.stats.FunctionInvocationStatisticsGatherer; import com.opengamma.engine.value.ComputedValue; import com.opengamma.util.metric.OpenGammaMetricRegistry; /** * Statistics for defered invocations. Some values exposed with {@code OpenGammaMetricRegistry}. */ /* package */ class DeferredInvocationStatistics implements DeferredStatistics { private final FunctionInvocationStatisticsGatherer _gatherer; private final String _configuration; private String _functionIdentifier; private double _dataInputBytes; private int _dataOutputBytes; private int _dataOutputSamples; private int _expectedDataOutputSamples; private Timer _timer; private Timer.Context _context; //TODO: Look at replacing (or simply exposing) IO metrics protected DeferredInvocationStatistics(final FunctionInvocationStatisticsGatherer gatherer, final String configuration, final String functionIdentifier) { _gatherer = gatherer; _configuration = configuration; _functionIdentifier = functionIdentifier; _timer = OpenGammaMetricRegistry.getDetailedInstance().timer(functionIdentifier + ".invoke"); } protected void beginInvocation() { _context = _timer.time(); } protected void endInvocation() { _context.close(); } protected void setDataInputBytes(final int bytes, final int samples) { if (samples > 0) { _dataInputBytes = (double) bytes / (double) samples; } else { _dataInputBytes = Double.NaN; } } protected void setExpectedDataOutputSamples(final int samples) { _expectedDataOutputSamples = samples; } @Override public void reportEstimatedSize(final ComputedValue value, final Integer bytes) { if (bytes != null) { _dataOutputBytes += bytes; _dataOutputSamples++; } _expectedDataOutputSamples--; if (_expectedDataOutputSamples == 0) { _gatherer.functionInvoked(_configuration, _functionIdentifier, 1, _timer.getSnapshot().getMean(), _dataInputBytes, (_dataOutputSamples > 0) ? _dataOutputBytes / _dataOutputSamples : Double.NaN); } } }