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

io.datakernel.datastream.stats.StreamStatsDetailed Maven / Gradle / Ivy

package io.datakernel.datastream.stats;

import io.datakernel.datastream.StreamDataAcceptor;
import io.datakernel.eventloop.jmx.JmxStatsWithReset;
import io.datakernel.eventloop.util.ReflectionUtils;
import io.datakernel.jmx.api.JmxAttribute;
import io.datakernel.jmx.api.JmxReducers.JmxReducerSum;
import org.jetbrains.annotations.Nullable;

import java.time.Duration;

public final class StreamStatsDetailed extends StreamStatsBasic implements JmxStatsWithReset {
	@Nullable
	private final StreamStatsSizeCounter sizeCounter;

	private long count;
	private long totalSize;

	@SuppressWarnings("unchecked")
	StreamStatsDetailed(@Nullable StreamStatsSizeCounter sizeCounter) {
		this.sizeCounter = (StreamStatsSizeCounter) sizeCounter;
	}

	@Override
	public StreamStatsDetailed withBasicSmoothingWindow(Duration smoothingWindow) {
		return (StreamStatsDetailed) super.withBasicSmoothingWindow(smoothingWindow);
	}

	@Override
	public StreamDataAcceptor createDataAcceptor(StreamDataAcceptor actualDataAcceptor) {
		return sizeCounter == null ?
				item -> {
					count++;
					actualDataAcceptor.accept(item);
				} :
				item -> {
					count++;
					int size = sizeCounter.size(item);
					totalSize += size;
					actualDataAcceptor.accept(item);
				};
	}

	@JmxAttribute(reducer = JmxReducerSum.class)
	public long getCount() {
		return count;
	}

	@JmxAttribute(reducer = JmxReducerSum.class)
	@Nullable
	public Long getTotalSize() {
		return sizeCounter != null ? totalSize : null;
	}

	@JmxAttribute(reducer = JmxReducerSum.class)
	@Nullable
	public Long getTotalSizeAvg() {
		return sizeCounter != null && getStarted().getTotalCount() != 0 ?
				totalSize / getStarted().getTotalCount() :
				null;
	}

	@Override
	public void resetStats() {
		count = totalSize = 0;
		ReflectionUtils.resetStats(this);
	}
}