Use a thread local to hold random instances to avoid thread contention. (#726)
* Use a thread local to hold random instances to avoid thread contention. * switch to the lighter-weight Random rather than SecureRandom
This commit is contained in:
parent
ff067e005f
commit
afa3ca063c
|
@ -21,20 +21,21 @@ import io.opentelemetry.trace.TraceId;
|
|||
import java.util.Random;
|
||||
|
||||
final class RandomIdsGenerator implements IdsGenerator {
|
||||
private static final long INVALID_ID = 0;
|
||||
// TODO change with ThreadLocal version
|
||||
// https://github.com/open-telemetry/opentelemetry-java/issues/406
|
||||
private final Random random;
|
||||
|
||||
RandomIdsGenerator(Random random) {
|
||||
this.random = random;
|
||||
private static final ThreadLocal<Random> threadLocalRandom =
|
||||
new ThreadLocal<Random>() {
|
||||
@Override
|
||||
protected Random initialValue() {
|
||||
return new Random();
|
||||
}
|
||||
};
|
||||
private static final long INVALID_ID = 0;
|
||||
|
||||
@Override
|
||||
public SpanId generateSpanId() {
|
||||
long id;
|
||||
do {
|
||||
id = random.nextLong();
|
||||
id = threadLocalRandom.get().nextLong();
|
||||
} while (id == INVALID_ID);
|
||||
return new SpanId(id);
|
||||
}
|
||||
|
@ -44,6 +45,7 @@ final class RandomIdsGenerator implements IdsGenerator {
|
|||
long idHi;
|
||||
long idLo;
|
||||
do {
|
||||
Random random = threadLocalRandom.get();
|
||||
idHi = random.nextLong();
|
||||
idLo = random.nextLong();
|
||||
} while (idHi == INVALID_ID && idLo == INVALID_ID);
|
||||
|
|
|
@ -24,7 +24,6 @@ import io.opentelemetry.sdk.resources.Resource;
|
|||
import io.opentelemetry.sdk.trace.config.TraceConfig;
|
||||
import io.opentelemetry.trace.Tracer;
|
||||
import io.opentelemetry.trace.TracerRegistry;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.logging.Level;
|
||||
|
@ -51,9 +50,7 @@ public class TracerSdkRegistry implements TracerRegistry {
|
|||
*/
|
||||
public static TracerSdkRegistry create() {
|
||||
return new TracerSdkRegistry(
|
||||
MillisClock.getInstance(),
|
||||
new RandomIdsGenerator(new SecureRandom()),
|
||||
EnvVarResource.getResource());
|
||||
MillisClock.getInstance(), new RandomIdsGenerator(), EnvVarResource.getResource());
|
||||
}
|
||||
|
||||
private TracerSdkRegistry(Clock clock, IdsGenerator idsGenerator, Resource resource) {
|
||||
|
|
|
@ -39,7 +39,6 @@ import java.util.Collections;
|
|||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
@ -63,7 +62,7 @@ public class RecordEventsReadableSpanTest {
|
|||
private static final String SPAN_NEW_NAME = "NewName";
|
||||
private static final long NANOS_PER_SECOND = TimeUnit.SECONDS.toNanos(1);
|
||||
private static final long MILLIS_PER_SECOND = TimeUnit.SECONDS.toMillis(1);
|
||||
private final IdsGenerator idsGenerator = new RandomIdsGenerator(new Random(1234));
|
||||
private final IdsGenerator idsGenerator = new RandomIdsGenerator();
|
||||
private final TraceId traceId = idsGenerator.generateTraceId();
|
||||
private final SpanId spanId = idsGenerator.generateSpanId();
|
||||
private final SpanId parentSpanId = idsGenerator.generateSpanId();
|
||||
|
|
|
@ -28,7 +28,6 @@ import io.opentelemetry.trace.TraceId;
|
|||
import io.opentelemetry.trace.Tracestate;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.ExpectedException;
|
||||
|
@ -40,7 +39,7 @@ import org.junit.runners.JUnit4;
|
|||
public class SamplersTest {
|
||||
private static final String SPAN_NAME = "MySpanName";
|
||||
private static final int NUM_SAMPLE_TRIES = 1000;
|
||||
private final IdsGenerator idsGenerator = new RandomIdsGenerator(new Random(1234));
|
||||
private final IdsGenerator idsGenerator = new RandomIdsGenerator();
|
||||
private final TraceId traceId = idsGenerator.generateTraceId();
|
||||
private final SpanId spanId = idsGenerator.generateSpanId();
|
||||
private final SpanId parentSpanId = idsGenerator.generateSpanId();
|
||||
|
|
Loading…
Reference in New Issue