Skip to content

Commit 926a4c0

Browse files
committed
first draft implementation
1 parent 1d8c513 commit 926a4c0

File tree

5 files changed

+51
-12
lines changed

5 files changed

+51
-12
lines changed

instrumentation/lettuce/README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Settings for the Lettuce instrumentation
22

3-
| System property | Type | Default | Description |
4-
|-------------------------------------------------------------|---------|---------|-----------------------------------------------------|
5-
| `otel.instrumentation.lettuce.experimental-span-attributes` | Boolean | `false` | Enable the capture of experimental span attributes. |
6-
| `otel.instrumentation.lettuce.connection-telemetry.enabled` | Boolean | `false` | Enable the creation of Connect spans. |
3+
| System property | Type | Default | Description |
4+
|--------------------------------------------------------------------------|---------|---------|-----------------------------------------------------|
5+
| `otel.instrumentation.lettuce.experimental-span-attributes` | Boolean | `false` | Enable the capture of experimental span attributes. |
6+
| `otel.instrumentation.lettuce.connection-telemetry.enabled` | Boolean | `false` | Enable the creation of Connect spans. |
7+
| `otel.instrumentation.lettuce.experimental.encoding-span-events.enabled` | Boolean | `true` | Allows to toggle span encoding events. |

instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/TracingHolder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,19 @@
99
import io.opentelemetry.api.GlobalOpenTelemetry;
1010
import io.opentelemetry.instrumentation.lettuce.v5_1.LettuceTelemetry;
1111
import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig;
12+
import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig;
1213

1314
public final class TracingHolder {
1415

16+
private static final boolean CAPTURE_ENCODING_SPAN_EVENTS =
17+
AgentInstrumentationConfig.get()
18+
.getBoolean(
19+
"otel.instrumentation.lettuce.experimental.encoding-span-events.enabled", true);
20+
1521
public static final Tracing TRACING =
1622
LettuceTelemetry.builder(GlobalOpenTelemetry.get())
1723
.setStatementSanitizationEnabled(AgentCommonConfig.get().isStatementSanitizationEnabled())
24+
.setEncodingSpanEventsEnabled(CAPTURE_ENCODING_SPAN_EVENTS)
1825
.build()
1926
.newTracing();
2027

instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceTelemetry.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,12 @@ public static LettuceTelemetryBuilder builder(OpenTelemetry openTelemetry) {
3333
private final Tracer tracer;
3434
private final RedisCommandSanitizer sanitizer;
3535
private final OperationListener metrics;
36+
private final boolean encodingEventsEnabled;
3637

3738
LettuceTelemetry(
3839
OpenTelemetry openTelemetry,
3940
boolean statementSanitizationEnabled,
41+
boolean encodingEventsEnabled,
4042
OperationListener metrics) {
4143
this.metrics = metrics;
4244
TracerBuilder tracerBuilder = openTelemetry.tracerBuilder(INSTRUMENTATION_NAME);
@@ -46,13 +48,14 @@ public static LettuceTelemetryBuilder builder(OpenTelemetry openTelemetry) {
4648
}
4749
tracer = tracerBuilder.build();
4850
sanitizer = RedisCommandSanitizer.create(statementSanitizationEnabled);
51+
this.encodingEventsEnabled = encodingEventsEnabled;
4952
}
5053

5154
/**
5255
* Returns a new {@link Tracing} which can be used with methods like {@link
5356
* io.lettuce.core.resource.ClientResources.Builder#tracing(Tracing)}.
5457
*/
5558
public Tracing newTracing() {
56-
return new OpenTelemetryTracing(tracer, sanitizer, metrics);
59+
return new OpenTelemetryTracing(tracer, sanitizer, metrics, encodingEventsEnabled);
5760
}
5861
}

instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/LettuceTelemetryBuilder.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public final class LettuceTelemetryBuilder {
1818

1919
private boolean statementSanitizationEnabled = true;
2020

21+
private boolean encodingEventsEnabled = true;
22+
2123
LettuceTelemetryBuilder(OpenTelemetry openTelemetry) {
2224
this.openTelemetry = openTelemetry;
2325
}
@@ -34,6 +36,16 @@ public LettuceTelemetryBuilder setStatementSanitizationEnabled(
3436
return this;
3537
}
3638

39+
/**
40+
* Sets whether the {@code redis.encode.start} and {@code redis.encode.end} span events should be
41+
* emitted by the constructed {@link LettuceTelemetry}. Enabled by default.
42+
*/
43+
@CanIgnoreReturnValue
44+
public LettuceTelemetryBuilder setEncodingSpanEventsEnabled(boolean encodingEventsEnabled) {
45+
this.encodingEventsEnabled = encodingEventsEnabled;
46+
return this;
47+
}
48+
3749
/**
3850
* Returns a new {@link LettuceTelemetry} with the settings of this {@link
3951
* LettuceTelemetryBuilder}.
@@ -42,6 +54,7 @@ public LettuceTelemetry build() {
4254
return new LettuceTelemetry(
4355
openTelemetry,
4456
statementSanitizationEnabled,
57+
encodingEventsEnabled,
4558
DbClientMetrics.get().create(openTelemetry.getMeterProvider().get(INSTRUMENTATION_NAME)));
4659
}
4760
}

instrumentation/lettuce/lettuce-5.1/library/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/OpenTelemetryTracing.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ final class OpenTelemetryTracing implements Tracing {
5959
OpenTelemetryTracing(
6060
io.opentelemetry.api.trace.Tracer tracer,
6161
RedisCommandSanitizer sanitizer,
62-
OperationListener metrics) {
63-
this.tracerProvider = new OpenTelemetryTracerProvider(tracer, sanitizer, metrics);
62+
OperationListener metrics,
63+
boolean encodingEventsEnabled) {
64+
this.tracerProvider =
65+
new OpenTelemetryTracerProvider(tracer, sanitizer, metrics, encodingEventsEnabled);
6466
}
6567

6668
@Override
@@ -100,8 +102,10 @@ private static class OpenTelemetryTracerProvider implements TracerProvider {
100102
OpenTelemetryTracerProvider(
101103
io.opentelemetry.api.trace.Tracer tracer,
102104
RedisCommandSanitizer sanitizer,
103-
OperationListener metrics) {
104-
openTelemetryTracer = new OpenTelemetryTracer(tracer, sanitizer, metrics);
105+
OperationListener metrics,
106+
boolean encodingEventsEnabled) {
107+
openTelemetryTracer =
108+
new OpenTelemetryTracer(tracer, sanitizer, metrics, encodingEventsEnabled);
105109
}
106110

107111
@Override
@@ -143,14 +147,17 @@ private static class OpenTelemetryTracer extends Tracer {
143147
private final io.opentelemetry.api.trace.Tracer tracer;
144148
private final RedisCommandSanitizer sanitizer;
145149
private final OperationListener metrics;
150+
private final boolean encodingEventsEnabled;
146151

147152
OpenTelemetryTracer(
148153
io.opentelemetry.api.trace.Tracer tracer,
149154
RedisCommandSanitizer sanitizer,
150-
OperationListener metrics) {
155+
OperationListener metrics,
156+
boolean encodingEventsEnabled) {
151157
this.tracer = tracer;
152158
this.sanitizer = sanitizer;
153159
this.metrics = metrics;
160+
this.encodingEventsEnabled = encodingEventsEnabled;
154161
}
155162

156163
@Override
@@ -179,7 +186,7 @@ private OpenTelemetrySpan nextSpan(Context context) {
179186
if (SemconvStability.emitOldDatabaseSemconv()) {
180187
spanBuilder.setAttribute(DB_SYSTEM, REDIS);
181188
}
182-
return new OpenTelemetrySpan(context, spanBuilder, sanitizer, metrics);
189+
return new OpenTelemetrySpan(context, spanBuilder, sanitizer, metrics, encodingEventsEnabled);
183190
}
184191
}
185192

@@ -193,6 +200,7 @@ private static class OpenTelemetrySpan extends Tracer.Span {
193200
private final SpanBuilder spanBuilder;
194201
private final RedisCommandSanitizer sanitizer;
195202
private final OperationListener metrics;
203+
private final boolean encodingEventsEnabled;
196204

197205
@Nullable private String name;
198206
@Nullable private List<Object> events;
@@ -207,12 +215,14 @@ private static class OpenTelemetrySpan extends Tracer.Span {
207215
Context context,
208216
SpanBuilder spanBuilder,
209217
RedisCommandSanitizer sanitizer,
210-
OperationListener metrics) {
218+
OperationListener metrics,
219+
boolean encodingEventsEnabled) {
211220
this.context = context;
212221
this.spanBuilder = spanBuilder;
213222
this.sanitizer = sanitizer;
214223
this.metrics = metrics;
215224
this.attributesBuilder = Attributes.builder();
225+
this.encodingEventsEnabled = encodingEventsEnabled;
216226
if (SemconvStability.emitStableDatabaseSemconv()) {
217227
attributesBuilder.put(DB_SYSTEM_NAME, REDIS);
218228
}
@@ -326,6 +336,11 @@ public synchronized Tracer.Span start() {
326336
@Override
327337
@CanIgnoreReturnValue
328338
public synchronized Tracer.Span annotate(String value) {
339+
if (!encodingEventsEnabled && value.startsWith("redis.encode.")) {
340+
// skip noisy encode events produced by io.lettuce.core.protocol.TracedCommand
341+
return this;
342+
}
343+
329344
if (span != null) {
330345
span.addEvent(value);
331346
} else {

0 commit comments

Comments
 (0)