From afe9c8cd4e14347bc175034531c9240fbf0a8ccf Mon Sep 17 00:00:00 2001 From: jimit-j-shah <57637300+jimit-j-shah@users.noreply.github.com> Date: Wed, 18 Sep 2024 10:34:09 -0700 Subject: [PATCH 1/7] fix: Replace use of TraceUtil.SpanContext w/ TraceUtil.Context --- .../google/cloud/datastore/DatastoreImpl.java | 68 +++++-------------- .../telemetry/DisabledTraceUtil.java | 17 +---- .../datastore/telemetry/EnabledTraceUtil.java | 38 +++-------- .../cloud/datastore/telemetry/TraceUtil.java | 11 +-- .../telemetry/DisabledTraceUtilTest.java | 2 +- .../telemetry/EnabledTraceUtilTest.java | 4 +- 6 files changed, 29 insertions(+), 111 deletions(-) diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java index 11ff58bc9..ffb6a90f1 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java @@ -18,9 +18,6 @@ import static com.google.cloud.datastore.telemetry.TraceUtil.ATTRIBUTES_KEY_DEFERRED; import static com.google.cloud.datastore.telemetry.TraceUtil.ATTRIBUTES_KEY_DOCUMENT_COUNT; -import static com.google.cloud.datastore.telemetry.TraceUtil.ATTRIBUTES_KEY_EXCEPTION_MESSAGE; -import static com.google.cloud.datastore.telemetry.TraceUtil.ATTRIBUTES_KEY_EXCEPTION_STACKTRACE; -import static com.google.cloud.datastore.telemetry.TraceUtil.ATTRIBUTES_KEY_EXCEPTION_TYPE; import static com.google.cloud.datastore.telemetry.TraceUtil.ATTRIBUTES_KEY_MISSING; import static com.google.cloud.datastore.telemetry.TraceUtil.ATTRIBUTES_KEY_MORE_RESULTS; import static com.google.cloud.datastore.telemetry.TraceUtil.ATTRIBUTES_KEY_READ_CONSISTENCY; @@ -37,10 +34,10 @@ import com.google.cloud.ServiceOptions; import com.google.cloud.datastore.execution.AggregationQueryExecutor; import com.google.cloud.datastore.spi.v1.DatastoreRpc; +import com.google.cloud.datastore.telemetry.TraceUtil; import com.google.cloud.datastore.telemetry.TraceUtil.Scope; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; -import com.google.common.base.Throwables; import com.google.common.collect.AbstractIterator; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -53,11 +50,6 @@ import com.google.datastore.v1.RunQueryResponse; import com.google.datastore.v1.TransactionOptions; import com.google.protobuf.ByteString; -import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.trace.SpanBuilder; -import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.api.trace.StatusCode; -import io.opentelemetry.context.Context; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -122,18 +114,18 @@ static class ReadWriteTransactionCallable implements Callable { private volatile TransactionOptions options; private volatile Transaction transaction; - private final com.google.cloud.datastore.telemetry.TraceUtil.SpanContext parentSpanContext; + private final TraceUtil.Context parentContext; ReadWriteTransactionCallable( Datastore datastore, TransactionCallable callable, TransactionOptions options, - @Nullable com.google.cloud.datastore.telemetry.TraceUtil.SpanContext parentSpanContext) { + @Nullable com.google.cloud.datastore.telemetry.TraceUtil.Context parentContext) { this.datastore = datastore; this.callable = callable; this.options = options; this.transaction = null; - this.parentSpanContext = parentSpanContext; + this.parentContext = parentContext; } Datastore getDatastore() { @@ -154,51 +146,23 @@ void setPrevTransactionId(ByteString transactionId) { options = options.toBuilder().setReadWrite(readWrite).build(); } - private io.opentelemetry.api.trace.Span startSpanWithParentContext( - String spanName, - com.google.cloud.datastore.telemetry.TraceUtil.SpanContext parentSpanContext) { - com.google.cloud.datastore.telemetry.TraceUtil otelTraceUtil = - datastore.getOptions().getTraceUtil(); - SpanBuilder spanBuilder = - otelTraceUtil - .getTracer() - .spanBuilder(com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_TRANSACTION_RUN) - .setSpanKind(SpanKind.PRODUCER) - .setParent( - Context.current() - .with( - io.opentelemetry.api.trace.Span.wrap( - parentSpanContext.getSpanContext()))); - return otelTraceUtil.addSettingsAttributesToCurrentSpan(spanBuilder).startSpan(); - } - @Override public T call() throws DatastoreException { - // TODO Instead of using OTel Spans directly, TraceUtil.Span should be used here. However, - // the same code in startSpanInternal doesn't work when EnabledTraceUtil.StartSpan is called - // probably because of some thread-local caching that is getting lost. This needs more - // debugging. The code below works and is idiomatic but could be prettier and more consistent - // with the use of TraceUtil-provided framework. - io.opentelemetry.api.trace.Span span = - startSpanWithParentContext( - com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_TRANSACTION_RUN, - parentSpanContext); - try (io.opentelemetry.context.Scope ignored = span.makeCurrent()) { + TraceUtil.Span span = + datastore + .getOptions() + .getTraceUtil() + .startSpan( + com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_TRANSACTION_RUN, + parentContext); + try (TraceUtil.Scope ignored = span.makeCurrent()) { transaction = datastore.newTransaction(options); T value = callable.run(transaction); transaction.commit(); return value; } catch (Exception ex) { transaction.rollback(); - span.setStatus(StatusCode.ERROR, ex.getMessage()); - span.recordException( - ex, - Attributes.builder() - .put(ATTRIBUTES_KEY_EXCEPTION_MESSAGE, ex.getMessage()) - .put(ATTRIBUTES_KEY_EXCEPTION_TYPE, ex.getClass().getName()) - .put(ATTRIBUTES_KEY_EXCEPTION_STACKTRACE, Throwables.getStackTraceAsString(ex)) - .build()); - span.end(); + span.end(ex); throw DatastoreException.propagateUserException(ex); } finally { if (transaction.isActive()) { @@ -218,7 +182,7 @@ public T runInTransaction(final TransactionCallable callable) { try { return RetryHelper.runWithRetries( new ReadWriteTransactionCallable( - this, callable, null, otelTraceUtil.getCurrentSpanContext()), + this, callable, null, otelTraceUtil.getCurrentContext()), retrySettings, TRANSACTION_EXCEPTION_HANDLER, getOptions().getClock()); @@ -233,7 +197,7 @@ public T runInTransaction( try { return RetryHelper.runWithRetries( new ReadWriteTransactionCallable( - this, callable, transactionOptions, otelTraceUtil.getCurrentSpanContext()), + this, callable, transactionOptions, otelTraceUtil.getCurrentContext()), retrySettings, TRANSACTION_EXCEPTION_HANDLER, getOptions().getClock()); @@ -748,7 +712,7 @@ com.google.datastore.v1.BeginTransactionResponse beginTransaction( com.google.cloud.datastore.telemetry.TraceUtil.Span span = otelTraceUtil.startSpan( com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_BEGIN_TRANSACTION, - otelTraceUtil.getCurrentSpanContext()); + otelTraceUtil.getCurrentContext()); try (com.google.cloud.datastore.telemetry.TraceUtil.Scope scope = span.makeCurrent()) { return RetryHelper.runWithRetries( () -> datastoreRpc.beginTransaction(requestPb), diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java index 06941c721..df25f2618 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java @@ -19,7 +19,6 @@ import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; import com.google.api.core.InternalApi; -import com.google.cloud.datastore.telemetry.TraceUtil.SpanContext; import io.grpc.ManagedChannelBuilder; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; @@ -35,14 +34,6 @@ */ @InternalApi public class DisabledTraceUtil implements TraceUtil { - - static class SpanContext implements TraceUtil.SpanContext { - @Override - public io.opentelemetry.api.trace.SpanContext getSpanContext() { - return null; - } - } - static class Span implements TraceUtil.Span { @Override public void end() {} @@ -112,7 +103,7 @@ public Span startSpan(String spanName) { } @Override - public TraceUtil.Span startSpan(String spanName, TraceUtil.SpanContext parentSpanContext) { + public TraceUtil.Span startSpan(String spanName, TraceUtil.Context parentContext) { return new Span(); } @@ -132,12 +123,6 @@ public TraceUtil.Context getCurrentContext() { return new Context(); } - @Nonnull - @Override - public TraceUtil.SpanContext getCurrentSpanContext() { - return new SpanContext(); - } - @Override public Tracer getTracer() { return TracerProvider.noop().get(LIBRARY_NAME); diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java index 3b962754d..8c1661611 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java @@ -22,19 +22,16 @@ import com.google.api.core.ApiFutures; import com.google.api.core.InternalApi; import com.google.cloud.datastore.DatastoreOptions; -import com.google.cloud.datastore.telemetry.TraceUtil.SpanContext; import com.google.common.base.Throwables; import io.grpc.ManagedChannelBuilder; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; -import io.opentelemetry.context.Context; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -73,19 +70,6 @@ public ApiFunction getChannelConfi return null; } - static class SpanContext implements TraceUtil.SpanContext { - private final io.opentelemetry.api.trace.SpanContext spanContext; - - public SpanContext(io.opentelemetry.api.trace.SpanContext spanContext) { - this.spanContext = spanContext; - } - - @Override - public io.opentelemetry.api.trace.SpanContext getSpanContext() { - return this.spanContext; - } - } - static class Span implements TraceUtil.Span { private final io.opentelemetry.api.trace.Span span; private final String spanName; @@ -220,6 +204,11 @@ static class Scope implements TraceUtil.Scope { public void close() { scope.close(); } + + @Override + public String toString() { + return this.scope.toString(); + } } static class Context implements TraceUtil.Context { @@ -307,18 +296,13 @@ public Span startSpan(String spanName) { } @Override - public TraceUtil.Span startSpan(String spanName, TraceUtil.SpanContext parentSpanContext) { + public TraceUtil.Span startSpan(String spanName, TraceUtil.Context parentContext) { SpanBuilder spanBuilder = tracer .spanBuilder(spanName) .setSpanKind(SpanKind.PRODUCER) - .setParent( - io.opentelemetry.context.Context.current() - .with( - io.opentelemetry.api.trace.Span.wrap(parentSpanContext.getSpanContext()))); - io.opentelemetry.api.trace.Span span = - addSettingsAttributesToCurrentSpan(spanBuilder).startSpan(); - return new Span(span, spanName); + .setParent(((EnabledTraceUtil.Context) parentContext).context); + return new Span(addSettingsAttributesToCurrentSpan(spanBuilder).startSpan(), spanName); } @Nonnull @@ -333,12 +317,6 @@ public TraceUtil.Context getCurrentContext() { return new Context(io.opentelemetry.context.Context.current()); } - @Nonnull - @Override - public TraceUtil.SpanContext getCurrentSpanContext() { - return new SpanContext(io.opentelemetry.api.trace.Span.current().getSpanContext()); - } - @Override public Tracer getTracer() { return this.tracer; diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java index 245b825e1..7a4540e6c 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java @@ -95,11 +95,6 @@ static TraceUtil getInstance(@Nonnull DatastoreOptions datastoreOptions) { @Nullable ApiFunction getChannelConfigurator(); - /** Represents a trace span's context */ - interface SpanContext { - io.opentelemetry.api.trace.SpanContext getSpanContext(); - } - /** Represents a trace span. */ interface Span { /** Adds the given event to this span. */ @@ -156,7 +151,7 @@ interface Scope extends AutoCloseable { * Starts a new span with the given name and the span represented by the parentSpanContext as its * parents, sets it as the current span and returns it. */ - Span startSpan(String spanName, SpanContext parentSpanContext); + Span startSpan(String spanName, Context parentContext); /** * Adds common SpanAttributes to the current span, useful when hand-creating a new Span without @@ -172,10 +167,6 @@ interface Scope extends AutoCloseable { @Nonnull Context getCurrentContext(); - /** Returns the current SpanContext */ - @Nonnull - SpanContext getCurrentSpanContext(); - /** Returns the current OpenTelemetry Tracer when OpenTelemetry SDK is provided. */ Tracer getTracer(); } diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/DisabledTraceUtilTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/DisabledTraceUtilTest.java index 89c91b3a7..a24f55597 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/DisabledTraceUtilTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/DisabledTraceUtilTest.java @@ -38,7 +38,7 @@ public void usesDisabledSpan() { assertThat(traceUtil.getCurrentSpan() instanceof DisabledTraceUtil.Span).isTrue(); assertThat(traceUtil.startSpan("foo") instanceof DisabledTraceUtil.Span).isTrue(); assertThat( - traceUtil.startSpan("foo", traceUtil.getCurrentSpanContext()) + traceUtil.startSpan("foo", traceUtil.getCurrentContext()) instanceof DisabledTraceUtil.Span) .isTrue(); } diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/EnabledTraceUtilTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/EnabledTraceUtilTest.java index a3620bbc2..fa689ad32 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/EnabledTraceUtilTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/EnabledTraceUtilTest.java @@ -65,7 +65,7 @@ public void usesOpenTelemetryFromOptions() { @Test public void usesGlobalOpenTelemetryIfOpenTelemetryInstanceNotProvided() { - OpenTelemetrySdk globalOpenTelemetrySdk = OpenTelemetrySdk.builder().buildAndRegisterGlobal(); + OpenTelemetrySdk ignored = OpenTelemetrySdk.builder().buildAndRegisterGlobal(); DatastoreOptions firestoreOptions = getBaseOptions() .setOpenTelemetryOptions( @@ -92,7 +92,7 @@ public void usesEnabledSpan() { assertThat(traceUtil.getCurrentSpan() instanceof EnabledTraceUtil.Span).isTrue(); assertThat(traceUtil.startSpan("foo") != null).isTrue(); assertThat( - traceUtil.startSpan("foo", traceUtil.getCurrentSpanContext()) + traceUtil.startSpan("foo", traceUtil.getCurrentContext()) instanceof EnabledTraceUtil.Span) .isTrue(); } From 900cdefb88937afec544dc422ae36a480bdc7b6f Mon Sep 17 00:00:00 2001 From: jimit-j-shah <57637300+jimit-j-shah@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:35:25 -0700 Subject: [PATCH 2/7] fix: Fixing how span hierarchy is created across threads - using Span instead of Context --- .../google/cloud/datastore/DatastoreImpl.java | 41 ++++++++++--------- .../telemetry/DisabledTraceUtil.java | 5 +++ .../datastore/telemetry/EnabledTraceUtil.java | 21 ++++++++-- .../cloud/datastore/telemetry/TraceUtil.java | 2 + 4 files changed, 46 insertions(+), 23 deletions(-) diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java index ffb6a90f1..555539b7e 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java @@ -50,6 +50,7 @@ import com.google.datastore.v1.RunQueryResponse; import com.google.datastore.v1.TransactionOptions; import com.google.protobuf.ByteString; +import io.opentelemetry.context.Context; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -114,18 +115,18 @@ static class ReadWriteTransactionCallable implements Callable { private volatile TransactionOptions options; private volatile Transaction transaction; - private final TraceUtil.Context parentContext; + private final TraceUtil.Span parentSpan; ReadWriteTransactionCallable( Datastore datastore, TransactionCallable callable, TransactionOptions options, - @Nullable com.google.cloud.datastore.telemetry.TraceUtil.Context parentContext) { + @Nullable com.google.cloud.datastore.telemetry.TraceUtil.Span parentSpan) { this.datastore = datastore; this.callable = callable; this.options = options; this.transaction = null; - this.parentContext = parentContext; + this.parentSpan = parentSpan; } Datastore getDatastore() { @@ -148,27 +149,19 @@ void setPrevTransactionId(ByteString transactionId) { @Override public T call() throws DatastoreException { - TraceUtil.Span span = - datastore - .getOptions() - .getTraceUtil() - .startSpan( - com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_TRANSACTION_RUN, - parentContext); - try (TraceUtil.Scope ignored = span.makeCurrent()) { + try (io.opentelemetry.context.Scope ignored = + Context.current().with(parentSpan.getSpan()).makeCurrent()) { transaction = datastore.newTransaction(options); T value = callable.run(transaction); transaction.commit(); return value; } catch (Exception ex) { transaction.rollback(); - span.end(ex); throw DatastoreException.propagateUserException(ex); } finally { if (transaction.isActive()) { transaction.rollback(); } - span.end(); if (options != null && options.getModeCase().equals(TransactionOptions.ModeCase.READ_WRITE)) { setPrevTransactionId(transaction.getTransactionId()); @@ -179,30 +172,40 @@ public T call() throws DatastoreException { @Override public T runInTransaction(final TransactionCallable callable) { - try { + TraceUtil.Span span = + otelTraceUtil.startSpan( + com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_TRANSACTION_RUN); + try (Scope ignored = span.makeCurrent()) { return RetryHelper.runWithRetries( - new ReadWriteTransactionCallable( - this, callable, null, otelTraceUtil.getCurrentContext()), + new ReadWriteTransactionCallable(this, callable, null, span), retrySettings, TRANSACTION_EXCEPTION_HANDLER, getOptions().getClock()); } catch (RetryHelperException e) { + span.end(e); throw DatastoreException.translateAndThrow(e); + } finally { + span.end(); } } @Override public T runInTransaction( final TransactionCallable callable, TransactionOptions transactionOptions) { - try { + TraceUtil.Span span = + otelTraceUtil.startSpan( + com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_TRANSACTION_RUN); + try (Scope ignored = span.makeCurrent()) { return RetryHelper.runWithRetries( - new ReadWriteTransactionCallable( - this, callable, transactionOptions, otelTraceUtil.getCurrentContext()), + new ReadWriteTransactionCallable(this, callable, transactionOptions, span), retrySettings, TRANSACTION_EXCEPTION_HANDLER, getOptions().getClock()); } catch (RetryHelperException e) { + span.end(e); throw DatastoreException.translateAndThrow(e); + } finally { + span.end(); } } diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java index df25f2618..3239962e4 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java @@ -107,6 +107,11 @@ public TraceUtil.Span startSpan(String spanName, TraceUtil.Context parentContext return new Span(); } + @Override + public TraceUtil.Span startSpan(String spanName, TraceUtil.Span parentSpan) { + return new Span(); + } + public SpanBuilder addSettingsAttributesToCurrentSpan(SpanBuilder spanBuilder) { return getTracer().spanBuilder("TRACING_DISABLED_NO_OP"); } diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java index 8c1661611..a5471bc57 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java @@ -28,10 +28,12 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Context; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -79,6 +81,11 @@ public Span(io.opentelemetry.api.trace.Span span, String spanName) { this.spanName = spanName; } + @Override + public io.opentelemetry.api.trace.Span getSpan() { + return this.span; + } + /** Ends this span. */ @Override public void end() { @@ -181,10 +188,6 @@ public TraceUtil.Span setAttribute(String key, boolean value) { return this; } - public io.opentelemetry.api.trace.Span getSpan() { - return this.span; - } - @Override public Scope makeCurrent() { try (io.opentelemetry.context.Scope scope = span.makeCurrent()) { @@ -305,6 +308,16 @@ public TraceUtil.Span startSpan(String spanName, TraceUtil.Context parentContext return new Span(addSettingsAttributesToCurrentSpan(spanBuilder).startSpan(), spanName); } + @Override + public TraceUtil.Span startSpan(String spanName, TraceUtil.Span parentSpan) { + SpanBuilder spanBuilder = + tracer + .spanBuilder(spanName) + .setSpanKind(SpanKind.PRODUCER) + .setParent(io.opentelemetry.context.Context.current().with(parentSpan.getSpan())); + return new Span(addSettingsAttributesToCurrentSpan(spanBuilder).startSpan(), spanName); + } + @Nonnull @Override public TraceUtil.Span getCurrentSpan() { diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java index 7a4540e6c..fcd4e4137 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java @@ -153,6 +153,8 @@ interface Scope extends AutoCloseable { */ Span startSpan(String spanName, Context parentContext); + Span startSpan(String spanName, Span parentSpan); + /** * Adds common SpanAttributes to the current span, useful when hand-creating a new Span without * using the TraceUtil.Span interface. From 451aeabc078e0536a65fedbfb305d011bb401e09 Mon Sep 17 00:00:00 2001 From: jimit-j-shah <57637300+jimit-j-shah@users.noreply.github.com> Date: Wed, 18 Sep 2024 11:42:35 -0700 Subject: [PATCH 3/7] fix: cleaning up startSpan(spanName, parentContext) variant --- .../java/com/google/cloud/datastore/DatastoreImpl.java | 3 +-- .../cloud/datastore/telemetry/DisabledTraceUtil.java | 5 ----- .../cloud/datastore/telemetry/EnabledTraceUtil.java | 10 ---------- .../google/cloud/datastore/telemetry/TraceUtil.java | 6 ++---- .../datastore/telemetry/DisabledTraceUtilTest.java | 2 +- .../datastore/telemetry/EnabledTraceUtilTest.java | 3 +-- 6 files changed, 5 insertions(+), 24 deletions(-) diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java index 555539b7e..50880ba58 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java @@ -714,8 +714,7 @@ com.google.datastore.v1.BeginTransactionResponse beginTransaction( final com.google.datastore.v1.BeginTransactionRequest requestPb) { com.google.cloud.datastore.telemetry.TraceUtil.Span span = otelTraceUtil.startSpan( - com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_BEGIN_TRANSACTION, - otelTraceUtil.getCurrentContext()); + com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_BEGIN_TRANSACTION); try (com.google.cloud.datastore.telemetry.TraceUtil.Scope scope = span.makeCurrent()) { return RetryHelper.runWithRetries( () -> datastoreRpc.beginTransaction(requestPb), diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java index 3239962e4..d07a4946b 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java @@ -102,11 +102,6 @@ public Span startSpan(String spanName) { return new Span(); } - @Override - public TraceUtil.Span startSpan(String spanName, TraceUtil.Context parentContext) { - return new Span(); - } - @Override public TraceUtil.Span startSpan(String spanName, TraceUtil.Span parentSpan) { return new Span(); diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java index a5471bc57..5ed09ae41 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java @@ -298,16 +298,6 @@ public Span startSpan(String spanName) { return new Span(span, spanName); } - @Override - public TraceUtil.Span startSpan(String spanName, TraceUtil.Context parentContext) { - SpanBuilder spanBuilder = - tracer - .spanBuilder(spanName) - .setSpanKind(SpanKind.PRODUCER) - .setParent(((EnabledTraceUtil.Context) parentContext).context); - return new Span(addSettingsAttributesToCurrentSpan(spanBuilder).startSpan(), spanName); - } - @Override public TraceUtil.Span startSpan(String spanName, TraceUtil.Span parentSpan) { SpanBuilder spanBuilder = diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java index fcd4e4137..007dacff9 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java @@ -148,11 +148,9 @@ interface Scope extends AutoCloseable { Span startSpan(String spanName); /** - * Starts a new span with the given name and the span represented by the parentSpanContext as its - * parents, sets it as the current span and returns it. + * Starts a new span with the given name and the span represented by the parentSpan as its parent, + * sets it as the current span and returns it. */ - Span startSpan(String spanName, Context parentContext); - Span startSpan(String spanName, Span parentSpan); /** diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/DisabledTraceUtilTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/DisabledTraceUtilTest.java index a24f55597..c80ef9353 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/DisabledTraceUtilTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/DisabledTraceUtilTest.java @@ -38,7 +38,7 @@ public void usesDisabledSpan() { assertThat(traceUtil.getCurrentSpan() instanceof DisabledTraceUtil.Span).isTrue(); assertThat(traceUtil.startSpan("foo") instanceof DisabledTraceUtil.Span).isTrue(); assertThat( - traceUtil.startSpan("foo", traceUtil.getCurrentContext()) + traceUtil.startSpan("foo", traceUtil.getCurrentSpan()) instanceof DisabledTraceUtil.Span) .isTrue(); } diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/EnabledTraceUtilTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/EnabledTraceUtilTest.java index fa689ad32..50d7b6820 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/EnabledTraceUtilTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/telemetry/EnabledTraceUtilTest.java @@ -92,8 +92,7 @@ public void usesEnabledSpan() { assertThat(traceUtil.getCurrentSpan() instanceof EnabledTraceUtil.Span).isTrue(); assertThat(traceUtil.startSpan("foo") != null).isTrue(); assertThat( - traceUtil.startSpan("foo", traceUtil.getCurrentContext()) - instanceof EnabledTraceUtil.Span) + traceUtil.startSpan("foo", traceUtil.getCurrentSpan()) instanceof EnabledTraceUtil.Span) .isTrue(); } From 8e528efc4a8717995e8eb7d223364fe809232ad8 Mon Sep 17 00:00:00 2001 From: jimit-j-shah <57637300+jimit-j-shah@users.noreply.github.com> Date: Wed, 18 Sep 2024 13:00:15 -0700 Subject: [PATCH 4/7] fix: add TracedReadWriteTransactionCallable to bifurcate tracing enabled/disabled paths for the Transaction callback. - This change implements the idiomatic way to express nested spans as described in https://opentelemetry.io/docs/languages/java/instrumentation/#create-nested-spans --- .../google/cloud/datastore/DatastoreImpl.java | 74 +++++++++++++++++-- .../telemetry/DisabledTraceUtil.java | 6 ++ .../datastore/telemetry/EnabledTraceUtil.java | 11 ++- .../cloud/datastore/telemetry/TraceUtil.java | 3 + .../google/cloud/datastore/DatastoreTest.java | 3 + 5 files changed, 90 insertions(+), 7 deletions(-) diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java index 50880ba58..79b647acf 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreImpl.java @@ -108,8 +108,7 @@ public Transaction newTransaction() { return new TransactionImpl(this); } - static class ReadWriteTransactionCallable implements Callable { - + static class TracedReadWriteTransactionCallable implements Callable { private final Datastore datastore; private final TransactionCallable callable; private volatile TransactionOptions options; @@ -117,7 +116,7 @@ static class ReadWriteTransactionCallable implements Callable { private final TraceUtil.Span parentSpan; - ReadWriteTransactionCallable( + TracedReadWriteTransactionCallable( Datastore datastore, TransactionCallable callable, TransactionOptions options, @@ -170,14 +169,73 @@ public T call() throws DatastoreException { } } + static class ReadWriteTransactionCallable implements Callable { + private final Datastore datastore; + private final TransactionCallable callable; + private volatile TransactionOptions options; + private volatile Transaction transaction; + + ReadWriteTransactionCallable( + Datastore datastore, TransactionCallable callable, TransactionOptions options) { + this.datastore = datastore; + this.callable = callable; + this.options = options; + this.transaction = null; + } + + Datastore getDatastore() { + return datastore; + } + + TransactionOptions getOptions() { + return options; + } + + Transaction getTransaction() { + return transaction; + } + + void setPrevTransactionId(ByteString transactionId) { + TransactionOptions.ReadWrite readWrite = + TransactionOptions.ReadWrite.newBuilder().setPreviousTransaction(transactionId).build(); + options = options.toBuilder().setReadWrite(readWrite).build(); + } + + @Override + public T call() throws DatastoreException { + try { + transaction = datastore.newTransaction(options); + T value = callable.run(transaction); + transaction.commit(); + return value; + } catch (Exception ex) { + transaction.rollback(); + throw DatastoreException.propagateUserException(ex); + } finally { + if (transaction.isActive()) { + transaction.rollback(); + } + if (options != null + && options.getModeCase().equals(TransactionOptions.ModeCase.READ_WRITE)) { + setPrevTransactionId(transaction.getTransactionId()); + } + } + } + } + @Override public T runInTransaction(final TransactionCallable callable) { TraceUtil.Span span = otelTraceUtil.startSpan( com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_TRANSACTION_RUN); + Callable transactionCallable = + (getOptions().getOpenTelemetryOptions().isEnabled() + ? new TracedReadWriteTransactionCallable( + this, callable, /*transactionOptions=*/ null, span) + : new ReadWriteTransactionCallable(this, callable, /*transactionOptions=*/ null)); try (Scope ignored = span.makeCurrent()) { return RetryHelper.runWithRetries( - new ReadWriteTransactionCallable(this, callable, null, span), + transactionCallable, retrySettings, TRANSACTION_EXCEPTION_HANDLER, getOptions().getClock()); @@ -195,9 +253,15 @@ public T runInTransaction( TraceUtil.Span span = otelTraceUtil.startSpan( com.google.cloud.datastore.telemetry.TraceUtil.SPAN_NAME_TRANSACTION_RUN); + + Callable transactionCallable = + (getOptions().getOpenTelemetryOptions().isEnabled() + ? new TracedReadWriteTransactionCallable(this, callable, transactionOptions, span) + : new ReadWriteTransactionCallable(this, callable, transactionOptions)); + try (Scope ignored = span.makeCurrent()) { return RetryHelper.runWithRetries( - new ReadWriteTransactionCallable(this, callable, transactionOptions, span), + transactionCallable, retrySettings, TRANSACTION_EXCEPTION_HANDLER, getOptions().getClock()); diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java index d07a4946b..677a226ee 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java @@ -19,6 +19,7 @@ import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; import com.google.api.core.InternalApi; +import com.google.cloud.datastore.telemetry.TraceUtil.Context; import io.grpc.ManagedChannelBuilder; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; @@ -84,6 +85,11 @@ static class Context implements TraceUtil.Context { public Scope makeCurrent() { return new Scope(); } + + @Override + public TraceUtil.Context with(TraceUtil.Span withParentSpan) { + return this; + } } static class Scope implements TraceUtil.Scope { diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java index 5ed09ae41..3e50e728c 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java @@ -22,18 +22,19 @@ import com.google.api.core.ApiFutures; import com.google.api.core.InternalApi; import com.google.cloud.datastore.DatastoreOptions; +import com.google.cloud.datastore.telemetry.TraceUtil.Context; +import com.google.cloud.datastore.telemetry.TraceUtil.Scope; +import com.google.cloud.datastore.telemetry.TraceUtil.Span; import com.google.common.base.Throwables; import io.grpc.ManagedChannelBuilder; import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.AttributesBuilder; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.Tracer; -import io.opentelemetry.context.Context; import java.util.Map; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -227,6 +228,12 @@ public Scope makeCurrent() { return new Scope(scope); } } + + @Override + public TraceUtil.Context with(TraceUtil.Span withParentSpan) { + this.context.with(withParentSpan.getSpan()); + return this; + } } /** Applies the current Datastore instance settings as attributes to the current Span */ diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java index 007dacff9..a02f0745f 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java @@ -20,6 +20,7 @@ import com.google.api.core.ApiFuture; import com.google.api.core.InternalExtensionOnly; import com.google.cloud.datastore.DatastoreOptions; +import com.google.cloud.datastore.telemetry.EnabledTraceUtil.Context; import io.grpc.ManagedChannelBuilder; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; @@ -136,6 +137,8 @@ interface Span { interface Context { /** Makes this context the current context. */ Scope makeCurrent(); + + Context with(Span withParentSpan); } /** Represents a trace scope. */ diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreTest.java index cd768f986..b9c7473e8 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreTest.java @@ -176,11 +176,14 @@ public static void beforeClass() throws IOException, InterruptedException { public void setUp() { rpcFactoryMock = EasyMock.createStrictMock(DatastoreRpcFactory.class); rpcMock = EasyMock.createStrictMock(DatastoreRpc.class); + DatastoreOpenTelemetryOptions.Builder otelOptionsBuilder = + DatastoreOpenTelemetryOptions.newBuilder(); rpcMockOptions = options .toBuilder() .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) .setServiceRpcFactory(rpcFactoryMock) + .setOpenTelemetryOptions(otelOptionsBuilder.setTracingEnabled(false).build()) .build(); EasyMock.expect(rpcFactoryMock.create(rpcMockOptions)).andReturn(rpcMock); StructuredQuery query = Query.newKeyQueryBuilder().build(); From 00c718dc3059c1a33e3b1e5b4b0efde4eb57b796 Mon Sep 17 00:00:00 2001 From: jimit-j-shah <57637300+jimit-j-shah@users.noreply.github.com> Date: Wed, 18 Sep 2024 13:08:21 -0700 Subject: [PATCH 5/7] fix: cleanup --- .../google/cloud/datastore/telemetry/EnabledTraceUtil.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java index 3e50e728c..ea47f1f3f 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java @@ -208,11 +208,6 @@ static class Scope implements TraceUtil.Scope { public void close() { scope.close(); } - - @Override - public String toString() { - return this.scope.toString(); - } } static class Context implements TraceUtil.Context { From d25f0a19c7f489b6d11a67b7e1644f9f9ea84734 Mon Sep 17 00:00:00 2001 From: jimit-j-shah <57637300+jimit-j-shah@users.noreply.github.com> Date: Wed, 18 Sep 2024 13:10:53 -0700 Subject: [PATCH 6/7] fix: cleanup --- .../google/cloud/datastore/telemetry/DisabledTraceUtil.java | 5 ----- .../google/cloud/datastore/telemetry/EnabledTraceUtil.java | 6 ------ .../com/google/cloud/datastore/telemetry/TraceUtil.java | 2 -- 3 files changed, 13 deletions(-) diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java index 677a226ee..ebb630515 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/DisabledTraceUtil.java @@ -85,11 +85,6 @@ static class Context implements TraceUtil.Context { public Scope makeCurrent() { return new Scope(); } - - @Override - public TraceUtil.Context with(TraceUtil.Span withParentSpan) { - return this; - } } static class Scope implements TraceUtil.Scope { diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java index ea47f1f3f..40fc7308e 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/EnabledTraceUtil.java @@ -223,12 +223,6 @@ public Scope makeCurrent() { return new Scope(scope); } } - - @Override - public TraceUtil.Context with(TraceUtil.Span withParentSpan) { - this.context.with(withParentSpan.getSpan()); - return this; - } } /** Applies the current Datastore instance settings as attributes to the current Span */ diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java index a02f0745f..d4839a376 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java @@ -137,8 +137,6 @@ interface Span { interface Context { /** Makes this context the current context. */ Scope makeCurrent(); - - Context with(Span withParentSpan); } /** Represents a trace scope. */ From 0c57edbbe8641f113e1d8d56b2bf3e967858df08 Mon Sep 17 00:00:00 2001 From: jimit-j-shah <57637300+jimit-j-shah@users.noreply.github.com> Date: Wed, 18 Sep 2024 14:43:15 -0700 Subject: [PATCH 7/7] fix: cleanup --- .../java/com/google/cloud/datastore/telemetry/TraceUtil.java | 2 -- .../src/test/java/com/google/cloud/datastore/DatastoreTest.java | 1 - 2 files changed, 3 deletions(-) diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java index d4839a376..57b3eab9b 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/telemetry/TraceUtil.java @@ -20,9 +20,7 @@ import com.google.api.core.ApiFuture; import com.google.api.core.InternalExtensionOnly; import com.google.cloud.datastore.DatastoreOptions; -import com.google.cloud.datastore.telemetry.EnabledTraceUtil.Context; import io.grpc.ManagedChannelBuilder; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.Tracer; import java.util.Map; diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreTest.java index b9c7473e8..d88e1d1ec 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreTest.java @@ -183,7 +183,6 @@ public void setUp() { .toBuilder() .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) .setServiceRpcFactory(rpcFactoryMock) - .setOpenTelemetryOptions(otelOptionsBuilder.setTracingEnabled(false).build()) .build(); EasyMock.expect(rpcFactoryMock.create(rpcMockOptions)).andReturn(rpcMock); StructuredQuery query = Query.newKeyQueryBuilder().build();