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

com.flozano.metrics.client.statsd.RatedStatsDClient Maven / Gradle / Ivy

The newest version!
package com.flozano.metrics.client.statsd;

import static java.util.Objects.requireNonNull;

import java.util.ArrayList;
import java.util.Random;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.Supplier;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.flozano.metrics.client.MetricValue;
import com.flozano.metrics.client.MetricsClient;

final class RatedStatsDClient implements MetricsClient {

	private static final Logger LOGGER = LoggerFactory
			.getLogger(MetricsClient.class);

	private final MetricsClient inner;
	private final double rate;
	private final Supplier randomDoubleSupplier;

	public RatedStatsDClient(MetricsClient inner, double rate) {
		this(inner, rate, ThreadLocalRandom::current);
	}

	public RatedStatsDClient(MetricsClient inner, double rate,
			Supplier randomSupplier) {
		this(inner, () -> randomSupplier.get().nextDouble(), rate);
	}

	public RatedStatsDClient(MetricsClient inner,
			Supplier randomDoubleSupplier, double rate) {
		this.inner = requireNonNull(inner);
		this.randomDoubleSupplier = requireNonNull(randomDoubleSupplier);
		this.rate = MetricValue.validateSampleRate(rate);
	}

	@Override
	public CompletableFuture send(MetricValue... metrics) {
		if (metrics == null || metrics.length == 0) {
			return CompletableFuture.completedFuture(null);
		}
		MetricValue[] transformed = transformed(metrics);
		if (transformed.length == 0) {
			return CompletableFuture.completedFuture(null);
		}
		return inner.send(transformed);
	}

	private MetricValue[] transformed(MetricValue[] metrics) {
		if (rate == 1.0) {
			return metrics;
		}
		ArrayList output = new ArrayList();
		for (MetricValue metric : metrics) {
			double randomValue = randomDoubleSupplier.get();
			if (randomValue <= rate) {
				output.add(metric.withRate(rate));
			} else {
				LOGGER.trace(
						"Metric discarded: random value is greater than rate (randomValue={}, rate={}, metric={}",
						randomValue, rate, metric);
			}
		}
		return output.toArray(new MetricValue[output.size()]);
	}

	@Override
	public void close() {
		inner.close();
	}

	@Override
	public MetricsClient batch() {
		return new RatedStatsDClient(new BatchStatsDClient(inner), rate);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy