package net.dubboclub.tracing.client.util;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
/**
* Created by Zetas on 2016/7/8.
*/
public class Sampler {
private static final int BASE_TIMES = 100;
private static class MetaData {
private long beforeSampleTime;
private AtomicLong counter = new AtomicLong(0);
}
private static ConcurrentMap<String, MetaData> samplerMap = new ConcurrentHashMap<String, MetaData>();
public static boolean isSample(String serviceName) {
MetaData metaData = getOrCreate(serviceName);
long currentTimeMillis = System.currentTimeMillis();
long n = metaData.counter.incrementAndGet();
boolean isSample = true;
if (currentTimeMillis - metaData.beforeSampleTime < 1000) {
if (n > BASE_TIMES) {
n = n % 10;
if (n != 0) {
isSample = false;
}
}
} else {
metaData.counter.set(0);
metaData.beforeSampleTime = currentTimeMillis;
}
return isSample;
}
private static MetaData getOrCreate(String serviceName) {
MetaData metaData = samplerMap.get(serviceName);
if (metaData == null) {
metaData = new MetaData();
metaData = samplerMap.putIfAbsent(serviceName, metaData);
}
return metaData;
}
}