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;
|
import java.util.Random;
|
||||||
|
|
||||||
final class RandomIdsGenerator implements IdsGenerator {
|
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) {
|
private static final ThreadLocal<Random> threadLocalRandom =
|
||||||
this.random = random;
|
new ThreadLocal<Random>() {
|
||||||
|
@Override
|
||||||
|
protected Random initialValue() {
|
||||||
|
return new Random();
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
private static final long INVALID_ID = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SpanId generateSpanId() {
|
public SpanId generateSpanId() {
|
||||||
long id;
|
long id;
|
||||||
do {
|
do {
|
||||||
id = random.nextLong();
|
id = threadLocalRandom.get().nextLong();
|
||||||
} while (id == INVALID_ID);
|
} while (id == INVALID_ID);
|
||||||
return new SpanId(id);
|
return new SpanId(id);
|
||||||
}
|
}
|
||||||
|
@ -44,6 +45,7 @@ final class RandomIdsGenerator implements IdsGenerator {
|
||||||
long idHi;
|
long idHi;
|
||||||
long idLo;
|
long idLo;
|
||||||
do {
|
do {
|
||||||
|
Random random = threadLocalRandom.get();
|
||||||
idHi = random.nextLong();
|
idHi = random.nextLong();
|
||||||
idLo = random.nextLong();
|
idLo = random.nextLong();
|
||||||
} while (idHi == INVALID_ID && idLo == INVALID_ID);
|
} 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.sdk.trace.config.TraceConfig;
|
||||||
import io.opentelemetry.trace.Tracer;
|
import io.opentelemetry.trace.Tracer;
|
||||||
import io.opentelemetry.trace.TracerRegistry;
|
import io.opentelemetry.trace.TracerRegistry;
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
@ -51,9 +50,7 @@ public class TracerSdkRegistry implements TracerRegistry {
|
||||||
*/
|
*/
|
||||||
public static TracerSdkRegistry create() {
|
public static TracerSdkRegistry create() {
|
||||||
return new TracerSdkRegistry(
|
return new TracerSdkRegistry(
|
||||||
MillisClock.getInstance(),
|
MillisClock.getInstance(), new RandomIdsGenerator(), EnvVarResource.getResource());
|
||||||
new RandomIdsGenerator(new SecureRandom()),
|
|
||||||
EnvVarResource.getResource());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TracerSdkRegistry(Clock clock, IdsGenerator idsGenerator, Resource resource) {
|
private TracerSdkRegistry(Clock clock, IdsGenerator idsGenerator, Resource resource) {
|
||||||
|
|
|
@ -39,7 +39,6 @@ import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
@ -63,7 +62,7 @@ public class RecordEventsReadableSpanTest {
|
||||||
private static final String SPAN_NEW_NAME = "NewName";
|
private static final String SPAN_NEW_NAME = "NewName";
|
||||||
private static final long NANOS_PER_SECOND = TimeUnit.SECONDS.toNanos(1);
|
private static final long NANOS_PER_SECOND = TimeUnit.SECONDS.toNanos(1);
|
||||||
private static final long MILLIS_PER_SECOND = TimeUnit.SECONDS.toMillis(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 TraceId traceId = idsGenerator.generateTraceId();
|
||||||
private final SpanId spanId = idsGenerator.generateSpanId();
|
private final SpanId spanId = idsGenerator.generateSpanId();
|
||||||
private final SpanId parentSpanId = idsGenerator.generateSpanId();
|
private final SpanId parentSpanId = idsGenerator.generateSpanId();
|
||||||
|
|
|
@ -28,7 +28,6 @@ import io.opentelemetry.trace.TraceId;
|
||||||
import io.opentelemetry.trace.Tracestate;
|
import io.opentelemetry.trace.Tracestate;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.rules.ExpectedException;
|
import org.junit.rules.ExpectedException;
|
||||||
|
@ -40,7 +39,7 @@ import org.junit.runners.JUnit4;
|
||||||
public class SamplersTest {
|
public class SamplersTest {
|
||||||
private static final String SPAN_NAME = "MySpanName";
|
private static final String SPAN_NAME = "MySpanName";
|
||||||
private static final int NUM_SAMPLE_TRIES = 1000;
|
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 TraceId traceId = idsGenerator.generateTraceId();
|
||||||
private final SpanId spanId = idsGenerator.generateSpanId();
|
private final SpanId spanId = idsGenerator.generateSpanId();
|
||||||
private final SpanId parentSpanId = idsGenerator.generateSpanId();
|
private final SpanId parentSpanId = idsGenerator.generateSpanId();
|
||||||
|
|
Loading…
Reference in New Issue