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

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

package io.datakernel.datastream.stats;

import io.datakernel.datastream.StreamDataAcceptor;
import io.datakernel.eventloop.jmx.EventStats;
import io.datakernel.eventloop.jmx.ValueStats;
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 StreamStatsDetailedEx extends StreamStatsBasic {
	public static final Duration DEFAULT_DETAILED_SMOOTHING_WINDOW = Duration.ofMinutes(1);

	@Nullable
	private final StreamStatsSizeCounter sizeCounter;

	private final EventStats count = EventStats.create(DEFAULT_DETAILED_SMOOTHING_WINDOW).withRateUnit("data items");
	private final ValueStats itemSize = ValueStats.create(DEFAULT_DETAILED_SMOOTHING_WINDOW);
	private final EventStats totalSize = EventStats.create(DEFAULT_DETAILED_SMOOTHING_WINDOW);

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

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

	@Override
	public StreamDataAcceptor createDataAcceptor(StreamDataAcceptor actualDataAcceptor) {
		return sizeCounter == null ?
				new StreamDataAcceptor() {
					final EventStats count = StreamStatsDetailedEx.this.count;

					@Override
					public void accept(T item) {
						count.recordEvent();
						actualDataAcceptor.accept(item);
					}
				} :
				new StreamDataAcceptor() {
					final EventStats count = StreamStatsDetailedEx.this.count;
					final ValueStats itemSize = StreamStatsDetailedEx.this.itemSize;

					@Override
					public void accept(T item) {
						count.recordEvent();
						int size = sizeCounter.size(item);
						itemSize.recordValue(size);
						totalSize.recordEvents(size);
						actualDataAcceptor.accept(item);
					}
				};
	}

	public StreamStatsDetailedEx withSizeHistogram(int[] levels) {
		itemSize.setHistogramLevels(levels);
		return this;
	}

	@JmxAttribute
	public EventStats getCount() {
		return count;
	}

	@Nullable
	@JmxAttribute
	public ValueStats getItemSize() {
		return sizeCounter != null ? itemSize : null;
	}

	@Nullable
	@JmxAttribute
	public EventStats getTotalSize() {
		return sizeCounter != null ? totalSize : null;
	}

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

}