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:
John Watson 2020-01-07 14:27:47 -08:00 committed by Bogdan Drutu
parent ff067e005f
commit afa3ca063c
4 changed files with 13 additions and 16 deletions

View File

@ -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);

View File

@ -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) {

View File

@ -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();

View File

@ -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();