Skip to content

Commit

Permalink
Add key tag to spring (#35)
Browse files Browse the repository at this point in the history
  • Loading branch information
malafeev committed May 13, 2019
1 parent 6a9cb41 commit 103df0b
Show file tree
Hide file tree
Showing 27 changed files with 894 additions and 742 deletions.
15 changes: 5 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,6 @@ pom.xml
// Instantiate tracer
Tracer tracer = ...

// Optionally register tracer with GlobalTracer
GlobalTracer.register(tracer);

// Create TracingConfiguration
TracingConfiguration tracingConfiguration = new TracingConfiguration.Builder(tracer).build();

Expand Down Expand Up @@ -185,9 +182,6 @@ RedisAsyncCommands<String, String> commandsAsync = connection.async();
// Instantiate tracer
Tracer tracer = ...

// Optionally register tracer with GlobalTracer
GlobalTracer.register(tracer);

// Create Redisson config object
Config = ...

Expand All @@ -207,10 +201,11 @@ RMap<MyKey, MyValue> map = tracingRedissonClient.getMap("myMap");

// Create tracing connection factory bean
@Bean
public RedisConnectionFactory redisConnectionFactory(Tracer tracer) {
MyRedisConnectionFactoryImplementation factory = ...
return new TracingRedisConnectionFactory(factory, false, tacer);

public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
lettuceConnectionFactory.afterPropertiesSet();
return new TracingRedisConnectionFactory(lettuceConnectionFactory,
new TracingConfiguration.Builder(tracer()).build());
}
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
import io.opentracing.Tracer.SpanBuilder;
import io.opentracing.noop.NoopSpan;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand All @@ -36,7 +36,7 @@ public class TracingHelper {

public static final String COMPONENT_NAME = "java-redis";
public static final String DB_TYPE = "redis";
private final Tracer tracer;
protected final Tracer tracer;
private final boolean traceWithActiveSpanOnly;
private final Function<String, String> spanNameProvider;
private final int maxKeysLength;
Expand All @@ -48,58 +48,58 @@ public TracingHelper(TracingConfiguration tracingConfiguration) {
this.maxKeysLength = tracingConfiguration.getKeysMaxLength();
}

private static SpanBuilder builder(String operationName, Tracer tracer,
Function<String, String> spanNameProvider) {
return getNullSafeTracer(tracer).buildSpan(spanNameProvider.apply(operationName))
private SpanBuilder builder(String operationName) {
return tracer.buildSpan(spanNameProvider.apply(operationName))
.withTag(Tags.COMPONENT.getKey(), COMPONENT_NAME)
.withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT)
.withTag(Tags.DB_TYPE.getKey(), DB_TYPE);
}

public static Span buildSpan(String operationName, boolean traceWithActiveSpanOnly,
Tracer tracer) {
if (traceWithActiveSpanOnly && getNullSafeTracer(tracer).activeSpan() == null) {
public Span buildSpan(String operationName, byte[][] keys) {
if (traceWithActiveSpanOnly && tracer.activeSpan() == null) {
return NoopSpan.INSTANCE;
} else {
return builder(operationName, tracer, RedisSpanNameProvider.OPERATION_NAME).start();
return builder(operationName)
.withTag("keys", toString(keys))
.start();
}
}

public Span buildSpan(String operationName) {
if (traceWithActiveSpanOnly && getNullSafeTracer().activeSpan() == null) {
if (traceWithActiveSpanOnly && tracer.activeSpan() == null) {
return NoopSpan.INSTANCE;
} else {
return builder(operationName, tracer, spanNameProvider).start();
return builder(operationName).start();
}
}

public Span buildSpan(String operationName, Object key) {
if (traceWithActiveSpanOnly && getNullSafeTracer().activeSpan() == null) {
if (traceWithActiveSpanOnly && tracer.activeSpan() == null) {
return NoopSpan.INSTANCE;
} else {
return builder(operationName, tracer, spanNameProvider).withTag("key", nullable(key)).start();
return builder(operationName).withTag("key", nullable(key)).start();
}
}

public Span buildSpan(String operationName, byte[] key) {
if (traceWithActiveSpanOnly && getNullSafeTracer().activeSpan() == null) {
if (traceWithActiveSpanOnly && tracer.activeSpan() == null) {
return NoopSpan.INSTANCE;
} else {
return builder(operationName, tracer, spanNameProvider).withTag("key", Arrays.toString(key))
return builder(operationName).withTag("key", Arrays.toString(key))
.start();
}
}

public Span buildSpan(String operationName, Object[] keys) {
if (traceWithActiveSpanOnly && getNullSafeTracer().activeSpan() == null) {
if (traceWithActiveSpanOnly && tracer.activeSpan() == null) {
return NoopSpan.INSTANCE;
} else {
return builder(operationName, tracer, spanNameProvider).withTag("keys",
return builder(operationName).withTag("keys",
Arrays.toString(limitKeys(keys))).start();
}
}

Object[] limitKeys(Object[] keys) {
<T> T[] limitKeys(T[] keys) {
if (keys != null && keys.length > maxKeysLength) {
return Arrays.copyOfRange(keys, 0, maxKeysLength);
}
Expand All @@ -125,10 +125,6 @@ public static String nullable(Object object) {
if (object == null) {
return "";
}
if (object instanceof byte[]) {
// Spring Data in some cases converts string key/value to byte array
return Arrays.toString((byte[]) object);
}
return object.toString();
}

Expand Down Expand Up @@ -157,6 +153,20 @@ public static String toString(byte[][] array) {
return "[" + String.join(", ", list) + "]";
}

private static String toStringWithDeserialization(byte[][] array) {
if (array == null) {
return "null";
}

List<String> list = new ArrayList<>();

for (byte[] bytes : array) {
list.add(deserialize(bytes));
}

return "[" + String.join(", ", list) + "]";
}

public static String collectionToString(Collection<?> collection) {
if (collection == null) {
return "";
Expand Down Expand Up @@ -220,7 +230,7 @@ public static <K, V> String mapToString(Map<K, V> map) {
}

public <T> T decorate(Span span, Supplier<T> supplier) {
try (Scope ignore = getNullSafeTracer().scopeManager().activate(span)) {
try (Scope ignore = tracer.scopeManager().activate(span)) {
return supplier.get();
} catch (Exception e) {
onError(e, span);
Expand All @@ -230,19 +240,9 @@ public <T> T decorate(Span span, Supplier<T> supplier) {
}
}

public static Tracer getNullSafeTracer(final Tracer tracer) {
if (tracer == null) {
return GlobalTracer.get();
}
return tracer;
}

public Tracer getNullSafeTracer() {
return getNullSafeTracer(tracer);
}

public void decorate(Span span, Action action) {
try (Scope ignore = getNullSafeTracer().scopeManager().activate(span)) {
try (Scope ignore = tracer.scopeManager().activate(span)) {
action.execute();
} catch (Exception e) {
onError(e, span);
Expand All @@ -253,7 +253,7 @@ public void decorate(Span span, Action action) {
}

public <T extends Exception> void decorateThrowing(Span span, ThrowingAction<T> action) throws T {
try (Scope ignore = getNullSafeTracer().scopeManager().activate(span)) {
try (Scope ignore = tracer.scopeManager().activate(span)) {
action.execute();
} catch (Exception e) {
onError(e, span);
Expand All @@ -265,7 +265,7 @@ public <T extends Exception> void decorateThrowing(Span span, ThrowingAction<T>

public <T extends Exception, V> V decorateThrowing(Span span, ThrowingSupplier<T, V> supplier)
throws T {
try (Scope ignore = getNullSafeTracer().scopeManager().activate(span)) {
try (Scope ignore = tracer.scopeManager().activate(span)) {
return supplier.get();
} catch (Exception e) {
onError(e, span);
Expand All @@ -275,10 +275,38 @@ public <T extends Exception, V> V decorateThrowing(Span span, ThrowingSupplier<T
}
}

public static <T> T doInScope(String command, Supplier<T> supplier, boolean withActiveSpanOnly,
Tracer tracer) {
Span span = buildSpan(command, withActiveSpanOnly, tracer);
try (Scope ignored = getNullSafeTracer(tracer).activateSpan(span)) {
private static String deserialize(byte[] bytes) {
return (bytes == null ? "" : new String(bytes, StandardCharsets.UTF_8));
}

public <T> T doInScope(String command, byte[] key, Supplier<T> supplier) {
Span span = buildSpan(command, deserialize(key));
return activateAndCloseSpan(span, supplier);
}

public <T> T doInScope(String command, Supplier<T> supplier) {
Span span = buildSpan(command);
return activateAndCloseSpan(span, supplier);
}

public void doInScope(String command, byte[] key, Runnable runnable) {
Span span = buildSpan(command, deserialize(key));
activateAndCloseSpan(span, runnable);
}

public void doInScope(String command, Runnable runnable) {
Span span = buildSpan(command);
activateAndCloseSpan(span, runnable);
}

public <T> T doInScope(String command, byte[][] keys, Supplier<T> supplier) {
Span span = buildSpan(command);
span.setTag("keys", toStringWithDeserialization(limitKeys(keys)));
return activateAndCloseSpan(span, supplier);
}

private <T> T activateAndCloseSpan(Span span, Supplier<T> supplier) {
try (Scope ignored = tracer.activateSpan(span)) {
return supplier.get();
} catch (Exception e) {
TracingHelper.onError(e, span);
Expand All @@ -287,4 +315,15 @@ public static <T> T doInScope(String command, Supplier<T> supplier, boolean with
span.finish();
}
}

private void activateAndCloseSpan(Span span, Runnable runnable) {
try (Scope ignored = tracer.activateSpan(span)) {
runnable.run();
} catch (Exception e) {
TracingHelper.onError(e, span);
throw e;
} finally {
span.finish();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3086,7 +3086,7 @@ private <V> RedisFuture<V> setCompleteAction(RedisFuture<V> future, Span span) {
}

private <T> RedisFuture<T> continueScopeSpan(RedisFuture<T> redisFuture) {
Tracer tracer = TracingHelper.getNullSafeTracer(tracingConfiguration.getTracer());
Tracer tracer = tracingConfiguration.getTracer();
Span span = tracer.activeSpan();
CompletableRedisFuture<T> customRedisFuture = new CompletableRedisFuture<>(redisFuture);
redisFuture.whenComplete((v, throwable) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3110,7 +3110,7 @@ private <V> RedisFuture<V> setCompleteAction(RedisFuture<V> future, Span span) {
}

private <T> RedisFuture<T> continueScopeSpan(RedisFuture<T> redisFuture) {
Tracer tracer = TracingHelper.getNullSafeTracer(tracingConfiguration.getTracer());
Tracer tracer = tracingConfiguration.getTracer();
Span span = tracer.activeSpan();
CompletableRedisFuture<T> customRedisFuture = new CompletableRedisFuture<>(redisFuture);
redisFuture.whenComplete((v, throwable) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import io.opentracing.contrib.redis.common.TracingConfiguration;
import io.opentracing.mock.MockSpan;
import io.opentracing.mock.MockTracer;
import io.opentracing.util.ThreadLocalScopeManager;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.After;
Expand All @@ -35,8 +34,7 @@

public class TracingLettuceTest {

private MockTracer mockTracer = new MockTracer(new ThreadLocalScopeManager(),
MockTracer.Propagator.TEXT_MAP);
private MockTracer mockTracer = new MockTracer();

private RedisServer redisServer;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.contrib.redis.common.TracingConfiguration;
import io.opentracing.contrib.redis.common.TracingHelper;
import java.util.function.Supplier;
Expand All @@ -34,7 +33,6 @@ Span buildSpan(String operationName, RObject rObject) {


private <T> RFuture<T> continueScopeSpan(RFuture<T> redisFuture) {
Tracer tracer = getNullSafeTracer();
Span span = tracer.activeSpan();
CompletableRFuture<T> customRedisFuture = new CompletableRFuture<>(redisFuture);
redisFuture.whenComplete((v, throwable) -> {
Expand Down
11 changes: 3 additions & 8 deletions opentracing-redis-spring-data/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>opentracing-redis-parent</artifactId>
<groupId>io.opentracing.contrib</groupId>
Expand Down Expand Up @@ -67,13 +69,6 @@
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.opentracing</groupId>
<artifactId>opentracing-util</artifactId>
<type>test-jar</type>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.github.kstyrc</groupId>
<artifactId>embedded-redis</artifactId>
Expand Down
Loading

0 comments on commit 103df0b

Please sign in to comment.