package com.bizo.asperatus.tracker.impl.buffer; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import com.bizo.asperatus.model.CompoundDimension; import com.bizo.asperatus.model.Unit; import com.bizo.asperatus.tracker.AbstractMetricTracker; import com.bizo.asperatus.tracker.impl.MetricKey; import com.bizo.asperatus.tracker.impl.MetricStatistics; /** * Track and aggregate metrics in-memory. */ public final class InMemoryTracker extends AbstractMetricTracker implements MetricBuffer { private final AtomicReference<Map<MetricKey, MetricStatistics>> stats = new AtomicReference<Map<MetricKey, MetricStatistics>>(new HashMap<MetricKey, MetricStatistics>()); @Override public synchronized void track(final String metricName, final Number value, final Unit unit, final Collection<CompoundDimension> dimensions) { for (final CompoundDimension d : dimensions) { getOrCreateStats(new MetricKey(metricName, d), unit).add(value); } } private MetricStatistics getOrCreateStats(final MetricKey key, final Unit unit) { MetricStatistics s = stats.get().get(key); if (s == null) { s = new MetricStatistics(unit); stats.get().put(key, s); } return s; } public synchronized Map<MetricKey, MetricStatistics> reset() { return stats.getAndSet(new HashMap<MetricKey, MetricStatistics>()); } }