// // DataPointsMonitor.java // // Copyright 2013, NextPage Inc. All rights reserved. // package org.kairosdb.core.reporting; import com.google.inject.Inject; import com.google.inject.name.Named; import org.kairosdb.core.DataPoint; import org.kairosdb.core.DataPointListener; import org.kairosdb.core.DataPointSet; import org.kairosdb.core.datapoints.LongDataPointFactory; import org.kairosdb.core.datapoints.LongDataPointFactoryImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; public class DataPointsMonitor implements DataPointListener, KairosMetricReporter { public static final Logger logger = LoggerFactory.getLogger(DataPointsMonitor.class); public static final String METRIC_NAME = "kairosdb.metric_counters"; private volatile ConcurrentMap<String, AtomicInteger> m_metricCounters; private String m_hostName; @Inject private LongDataPointFactory m_dataPointFactory = new LongDataPointFactoryImpl(); @Inject public DataPointsMonitor(@Named("HOSTNAME") String hostName) { m_metricCounters = new ConcurrentHashMap<String, AtomicInteger>(); m_hostName = hostName; } private void addCounter(String name, int count) { AtomicInteger ai = m_metricCounters.get(name); if (ai == null) { ai = new AtomicInteger(); AtomicInteger mapValue = m_metricCounters.putIfAbsent(name, ai); ai = (mapValue != null ? mapValue : ai); //This handles the case if one snuck in on another thread. } ai.addAndGet(count); } private Map<String, AtomicInteger> getAndClearCounters() { Map<String, AtomicInteger> ret = m_metricCounters; m_metricCounters = new ConcurrentHashMap<String, AtomicInteger>(); return (ret); } @Override public List<DataPointSet> getMetrics(long now) { List<DataPointSet> ret = new ArrayList<DataPointSet>(); Map<String, AtomicInteger> counters = getAndClearCounters(); for (String name : counters.keySet()) { DataPointSet dps = new DataPointSet(METRIC_NAME); dps.addTag("host", m_hostName); dps.addTag("metric_name", name); dps.addDataPoint(m_dataPointFactory.createDataPoint(now, counters.get(name).longValue())); ret.add(dps); } return (ret); } @Override public void dataPoint(String metricName, SortedMap<String, String> tags, DataPoint dataPoint) { if (metricName.startsWith("kairosdb")) return; //Skip our own metrics. addCounter(metricName, 1); } }