
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