diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentAlwaysOffSampler.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentAlwaysOffSampler.java index ae0af4cbc..37759d670 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentAlwaysOffSampler.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentAlwaysOffSampler.java @@ -5,7 +5,6 @@ package io.opentelemetry.contrib.samplers; -import io.opentelemetry.contrib.state.OtelTraceState; import javax.annotation.concurrent.Immutable; @Immutable diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentComposedAndSampler.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentComposedAndSampler.java index 1b5e12712..17f758b46 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentComposedAndSampler.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentComposedAndSampler.java @@ -7,7 +7,6 @@ import static java.util.Objects.requireNonNull; -import io.opentelemetry.contrib.state.OtelTraceState; import javax.annotation.concurrent.Immutable; /** diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentComposedOrSampler.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentComposedOrSampler.java index 21150c672..b090dd399 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentComposedOrSampler.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentComposedOrSampler.java @@ -7,7 +7,6 @@ import static java.util.Objects.requireNonNull; -import io.opentelemetry.contrib.state.OtelTraceState; import javax.annotation.concurrent.Immutable; /** diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentParentBasedSampler.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentParentBasedSampler.java index 6d7ad4dd9..4db1ad196 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentParentBasedSampler.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentParentBasedSampler.java @@ -7,7 +7,6 @@ import static java.util.Objects.requireNonNull; -import io.opentelemetry.contrib.util.RandomGenerator; import javax.annotation.concurrent.Immutable; /** diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentProbabilityBasedSampler.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentProbabilityBasedSampler.java index 3b05549af..2e55d7409 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentProbabilityBasedSampler.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentProbabilityBasedSampler.java @@ -5,7 +5,6 @@ package io.opentelemetry.contrib.samplers; -import io.opentelemetry.contrib.util.RandomGenerator; import javax.annotation.concurrent.Immutable; /** A consistent sampler that samples with a fixed probability. */ diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentRateLimitingSampler.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentRateLimitingSampler.java index 117501718..9f1edbbd1 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentRateLimitingSampler.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentRateLimitingSampler.java @@ -7,7 +7,6 @@ import static java.util.Objects.requireNonNull; -import io.opentelemetry.contrib.util.RandomGenerator; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.util.concurrent.atomic.AtomicReference; import java.util.function.LongSupplier; diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentSampler.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentSampler.java index 31f7428dd..6f9cd76e2 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentSampler.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/ConsistentSampler.java @@ -13,8 +13,6 @@ import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.context.Context; -import io.opentelemetry.contrib.state.OtelTraceState; -import io.opentelemetry.contrib.util.RandomGenerator; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingDecision; @@ -60,7 +58,7 @@ public static final ConsistentSampler probabilityBased(double samplingProbabilit * @param randomGenerator a random generator * @return a sampler */ - public static final ConsistentSampler probabilityBased( + static final ConsistentSampler probabilityBased( double samplingProbability, RandomGenerator randomGenerator) { return new ConsistentProbabilityBasedSampler(samplingProbability, randomGenerator); } @@ -82,7 +80,7 @@ public static final ConsistentSampler parentBased(ConsistentSampler rootSampler) * @param rootSampler the root sampler * @param randomGenerator a random generator */ - public static final ConsistentSampler parentBased( + static final ConsistentSampler parentBased( ConsistentSampler rootSampler, RandomGenerator randomGenerator) { return new ConsistentParentBasedSampler(rootSampler, randomGenerator); } @@ -110,7 +108,7 @@ public static final ConsistentSampler rateLimited( * @param randomGenerator a random generator * @param nanoTimeSupplier a supplier for the current nano time */ - public static final ConsistentSampler rateLimited( + static final ConsistentSampler rateLimited( double targetSpansPerSecondLimit, double adaptationTimeSeconds, RandomGenerator randomGenerator, diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/state/OtelTraceState.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/OtelTraceState.java similarity index 98% rename from consistent-sampling/src/main/java/io/opentelemetry/contrib/state/OtelTraceState.java rename to consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/OtelTraceState.java index b71ca3e3b..f29d40b6d 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/state/OtelTraceState.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/OtelTraceState.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.contrib.state; +package io.opentelemetry.contrib.samplers; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.annotation.Nullable; -public final class OtelTraceState { +final class OtelTraceState { public static final String TRACE_STATE_KEY = "ot"; diff --git a/consistent-sampling/src/main/java/io/opentelemetry/contrib/util/RandomGenerator.java b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/RandomGenerator.java similarity index 98% rename from consistent-sampling/src/main/java/io/opentelemetry/contrib/util/RandomGenerator.java rename to consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/RandomGenerator.java index b2277cb83..3de2260a2 100644 --- a/consistent-sampling/src/main/java/io/opentelemetry/contrib/util/RandomGenerator.java +++ b/consistent-sampling/src/main/java/io/opentelemetry/contrib/samplers/RandomGenerator.java @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.contrib.util; +package io.opentelemetry.contrib.samplers; import static java.util.Objects.requireNonNull; import java.util.concurrent.ThreadLocalRandom; import java.util.function.LongSupplier; -public final class RandomGenerator { +final class RandomGenerator { private final LongSupplier threadSafeRandomLongSupplier; diff --git a/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentProbabilityBasedSamplerTest.java b/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentProbabilityBasedSamplerTest.java index 3a1b67181..e37861d24 100644 --- a/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentProbabilityBasedSamplerTest.java +++ b/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentProbabilityBasedSamplerTest.java @@ -5,15 +5,13 @@ package io.opentelemetry.contrib.samplers; -import static io.opentelemetry.contrib.util.TestUtil.verifyObservedPvaluesUsingGtest; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertTrue; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.TraceState; import io.opentelemetry.context.Context; -import io.opentelemetry.contrib.state.OtelTraceState; -import io.opentelemetry.contrib.util.RandomGenerator; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingDecision; @@ -23,6 +21,7 @@ import java.util.List; import java.util.Map; import java.util.SplittableRandom; +import org.hipparchus.stat.inference.GTest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -87,4 +86,64 @@ public void test() { test(random, 0.13); test(random, 0.05); } + + private static void verifyObservedPvaluesUsingGtest( + long originalNumberOfSpans, Map observedPvalues, double samplingProbability) { + + Object notSampled = + new Object() { + @Override + public String toString() { + return "NOT SAMPLED"; + } + }; + + Map expectedProbabilities = new HashMap<>(); + if (samplingProbability >= 1.) { + expectedProbabilities.put(0, 1.); + } else if (samplingProbability <= 0.) { + expectedProbabilities.put(notSampled, 1.); + } else { + int exponent = 0; + while (true) { + if (Math.pow(0.5, exponent + 1) < samplingProbability + && Math.pow(0.5, exponent) >= samplingProbability) { + break; + } + exponent += 1; + } + if (samplingProbability == Math.pow(0.5, exponent)) { + expectedProbabilities.put(notSampled, 1 - samplingProbability); + expectedProbabilities.put(exponent, samplingProbability); + } else { + expectedProbabilities.put(notSampled, 1 - samplingProbability); + expectedProbabilities.put(exponent, 2 * samplingProbability - Math.pow(0.5, exponent)); + expectedProbabilities.put(exponent + 1, Math.pow(0.5, exponent) - samplingProbability); + } + } + + Map extendedObservedAdjustedCounts = new HashMap<>(observedPvalues); + long numberOfSpansNotSampled = + originalNumberOfSpans - observedPvalues.values().stream().mapToLong(i -> i).sum(); + if (numberOfSpansNotSampled > 0) { + extendedObservedAdjustedCounts.put(notSampled, numberOfSpansNotSampled); + } + + double[] expectedValues = new double[expectedProbabilities.size()]; + long[] observedValues = new long[expectedProbabilities.size()]; + + int counter = 0; + for (Object key : expectedProbabilities.keySet()) { + observedValues[counter] = extendedObservedAdjustedCounts.getOrDefault(key, 0L); + double p = expectedProbabilities.get(key); + expectedValues[counter] = p * originalNumberOfSpans; + counter += 1; + } + + if (expectedProbabilities.size() > 1) { + assertThat(new GTest().gTest(expectedValues, observedValues)).isGreaterThan(0.01); + } else { + assertThat((double) observedValues[0]).isEqualTo(expectedValues[0]); + } + } } diff --git a/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentRateLimitingSamplerTest.java b/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentRateLimitingSamplerTest.java index 42117621b..c54d22d2f 100644 --- a/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentRateLimitingSamplerTest.java +++ b/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentRateLimitingSamplerTest.java @@ -10,7 +10,6 @@ import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; -import io.opentelemetry.contrib.util.RandomGenerator; import io.opentelemetry.sdk.trace.data.LinkData; import io.opentelemetry.sdk.trace.samplers.SamplingDecision; import io.opentelemetry.sdk.trace.samplers.SamplingResult; diff --git a/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentSamplerTest.java b/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentSamplerTest.java index 9ca37b867..d2c5128be 100644 --- a/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentSamplerTest.java +++ b/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/ConsistentSamplerTest.java @@ -9,7 +9,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import io.opentelemetry.contrib.state.OtelTraceState; import java.util.SplittableRandom; import org.junit.jupiter.api.Test; diff --git a/consistent-sampling/src/test/java/io/opentelemetry/contrib/state/OtelTraceStateTest.java b/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/OtelTraceStateTest.java similarity index 98% rename from consistent-sampling/src/test/java/io/opentelemetry/contrib/state/OtelTraceStateTest.java rename to consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/OtelTraceStateTest.java index 118c9d176..716321495 100644 --- a/consistent-sampling/src/test/java/io/opentelemetry/contrib/state/OtelTraceStateTest.java +++ b/consistent-sampling/src/test/java/io/opentelemetry/contrib/samplers/OtelTraceStateTest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.contrib.state; +package io.opentelemetry.contrib.samplers; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/consistent-sampling/src/test/java/io/opentelemetry/contrib/util/TestUtil.java b/consistent-sampling/src/test/java/io/opentelemetry/contrib/util/TestUtil.java deleted file mode 100644 index af196c1e9..000000000 --- a/consistent-sampling/src/test/java/io/opentelemetry/contrib/util/TestUtil.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.contrib.util; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.HashMap; -import java.util.Map; -import org.hipparchus.stat.inference.GTest; - -public final class TestUtil { - - private TestUtil() {} - - public static void verifyObservedPvaluesUsingGtest( - long originalNumberOfSpans, Map observedPvalues, double samplingProbability) { - - Object notSampled = - new Object() { - @Override - public String toString() { - return "NOT SAMPLED"; - } - }; - - Map expectedProbabilities = new HashMap<>(); - if (samplingProbability >= 1.) { - expectedProbabilities.put(0, 1.); - } else if (samplingProbability <= 0.) { - expectedProbabilities.put(notSampled, 1.); - } else { - int exponent = 0; - while (true) { - if (Math.pow(0.5, exponent + 1) < samplingProbability - && Math.pow(0.5, exponent) >= samplingProbability) { - break; - } - exponent += 1; - } - if (samplingProbability == Math.pow(0.5, exponent)) { - expectedProbabilities.put(notSampled, 1 - samplingProbability); - expectedProbabilities.put(exponent, samplingProbability); - } else { - expectedProbabilities.put(notSampled, 1 - samplingProbability); - expectedProbabilities.put(exponent, 2 * samplingProbability - Math.pow(0.5, exponent)); - expectedProbabilities.put(exponent + 1, Math.pow(0.5, exponent) - samplingProbability); - } - } - - Map extendedObservedAdjustedCounts = new HashMap<>(observedPvalues); - long numberOfSpansNotSampled = - originalNumberOfSpans - observedPvalues.values().stream().mapToLong(i -> i).sum(); - if (numberOfSpansNotSampled > 0) { - extendedObservedAdjustedCounts.put(notSampled, numberOfSpansNotSampled); - } - - double[] expectedValues = new double[expectedProbabilities.size()]; - long[] observedValues = new long[expectedProbabilities.size()]; - - int counter = 0; - for (Object key : expectedProbabilities.keySet()) { - observedValues[counter] = extendedObservedAdjustedCounts.getOrDefault(key, 0L); - double p = expectedProbabilities.get(key); - expectedValues[counter] = p * originalNumberOfSpans; - counter += 1; - } - - if (expectedProbabilities.size() > 1) { - assertThat(new GTest().gTest(expectedValues, observedValues)).isGreaterThan(0.01); - } else { - assertThat((double) observedValues[0]).isEqualTo(expectedValues[0]); - } - } -}