All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kairosdb.metrics4j.collectors.impl.SimpleTimerMetric Maven / Gradle / Ivy

package org.kairosdb.metrics4j.collectors.impl;

import lombok.EqualsAndHashCode;
import lombok.Setter;
import lombok.ToString;
import org.kairosdb.metrics4j.MetricsContext;
import org.kairosdb.metrics4j.collectors.Collector;
import org.kairosdb.metrics4j.collectors.DurationCollector;
import org.kairosdb.metrics4j.collectors.MetricCollector;
import org.kairosdb.metrics4j.collectors.helpers.TimerCollector;
import org.kairosdb.metrics4j.reporting.DoubleValue;
import org.kairosdb.metrics4j.reporting.LongValue;
import org.kairosdb.metrics4j.reporting.MetricReporter;

import java.time.Duration;
import java.time.Instant;
import java.time.temporal.ChronoUnit;

@ToString
@EqualsAndHashCode
public class SimpleTimerMetric extends TimerCollector implements DurationCollector, MetricCollector
{
	protected Duration m_min;
	protected Duration m_max;
	protected Duration m_sum;
	protected long m_count;

	@EqualsAndHashCode.Exclude
	protected final Object m_dataLock = new Object();


	/**
	 Report zero values during interval if no data is received.
	 */
	@Setter
	protected boolean reportZero = false;

	public SimpleTimerMetric()
	{
		clear();
	}

	public SimpleTimerMetric(ChronoUnit unit, boolean reportZero)
	{
		this();
		this.reportUnit = unit;
		this.reportZero = reportZero;
	}


	private void clear()
	{
		m_min = Duration.of(Long.MAX_VALUE, ChronoUnit.MILLIS);
		m_max = Duration.ofMillis(0);
		m_sum = Duration.ofMillis(0);
		m_count = 0;
	}

	/**
	 Not thread safe
	 @return
	 */
	public long getCount()
	{
		return m_count;
	}

	private Data getAndClear()
	{
		synchronized (m_dataLock)
		{
			Data ret;
			if (m_count != 0)
				ret = new Data(m_min, m_max, m_sum, m_count, m_sum.dividedBy(m_count));
			else
				ret = new Data(Duration.ZERO, Duration.ZERO, Duration.ZERO, 0, Duration.ZERO);

			clear();
			return ret;
		}
	}

	@Override
	public void reportMetric(MetricReporter metricReporter)
	{
		Data data = getAndClear();

		if (data.count != 0)
		{
			long total = getValue(data.sum);
			metricReporter.put("min", new LongValue(getValue(data.min)));
			metricReporter.put("max", new LongValue(getValue(data.max)));
			metricReporter.put("total", new LongValue(total));
			metricReporter.put("count", new LongValue(data.count));
			metricReporter.put("avg", new DoubleValue((double)total / (double)data.count));
		}
		else if (reportZero)
		{
			metricReporter.put("min", new LongValue(0L));
			metricReporter.put("max", new LongValue(0L));
			metricReporter.put("total", new LongValue(0L));
			metricReporter.put("count", new LongValue(0L));
			metricReporter.put("avg", new DoubleValue(0.0));
		}
	}

	@Override
	public void put(Duration duration)
	{
		synchronized (m_dataLock)
		{
			m_min = m_min.compareTo(duration) < 0 ? m_min : duration;
			m_max = m_max.compareTo(duration) > 0 ? m_max : duration;
			m_sum = m_sum.plus(duration);
			m_count++;
		}
	}

	@Override
	public void put(Instant time, Duration duration)
	{
		put(duration);
	}


	@Override
	public Collector clone()
	{
		SimpleTimerMetric ret = new SimpleTimerMetric();
		ret.reportUnit = reportUnit;
		ret.reportZero = reportZero;
		return ret;
	}

	@Override
	public void init(MetricsContext context)
	{

	}

	public static class Data
	{
		public final Duration min;
		public final Duration max;
		public final Duration sum;
		public final long count;
		public final Duration avg;

		public Data(Duration min, Duration max, Duration sum, long count, Duration avg)
		{
			this.min = min;
			this.max = max;
			this.sum = sum;
			this.count = count;
			this.avg = avg;
		}
	}
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy