Я адаптирую граничный пробоотборник для моего варианта использования. В моем случае входными данными является не длинное значение traceid, а список alphanumeri c Strings (UUIDs). Я реализовал следующее, это правильный способ для выборки запросов?
public boolean isSampled(List<String> samplingStrings) {
if (samplingStrings.isEmpty()) {
return random.nextDouble() > probability;
}
long hashId = Math.abs(Objects.hash(samplingStrings.toArray()));
return hashId % 10000 <= boundary;
}
Исходная реализация из https://github.com/openzipkin/brave/blob/master/brave/src/main/java/brave/sampler/BoundarySampler.java
public boolean isSampled(long traceId) {
long t = Math.abs(traceId ^ SALT);
return t % 10000 <= boundary;
}
границы определяется следующим образом :
final long boundary = (long) (probability * 10000);
probability
должно быть в диапазоне от 0.0001
до 1.0
Я также требую, чтобы выборка была идемпотентной. Для одного и того же набора строк требуется постоянно один и тот же результат.
Предоставит ли моя реализация надлежащую выборку на основе вероятности. Есть ли лучший способ добиться этого?