2525import com .google .cloud .ServiceOptions ;
2626import com .google .cloud .datastore .execution .AggregationQueryExecutor ;
2727import com .google .cloud .datastore .spi .v1 .DatastoreRpc ;
28+ import com .google .cloud .datastore .telemetry .TraceUtil .Context ;
2829import com .google .common .base .MoreObjects ;
2930import com .google .common .base .Preconditions ;
3031import com .google .common .collect .AbstractIterator ;
5253import java .util .Optional ;
5354import java .util .Set ;
5455import java .util .concurrent .Callable ;
56+ import javax .annotation .Nonnull ;
5557
5658final class DatastoreImpl extends BaseService <DatastoreOptions > implements Datastore {
5759
@@ -103,13 +105,18 @@ static class ReadWriteTransactionCallable<T> implements Callable<T> {
103105 private final TransactionCallable <T > callable ;
104106 private volatile TransactionOptions options ;
105107 private volatile Transaction transaction ;
108+ @ Nonnull private final Context transactionTraceContext ;
106109
107110 ReadWriteTransactionCallable (
108- Datastore datastore , TransactionCallable <T > callable , TransactionOptions options ) {
111+ Datastore datastore ,
112+ TransactionCallable <T > callable ,
113+ TransactionOptions options ,
114+ @ Nonnull Context parentTraceContext ) {
109115 this .datastore = datastore ;
110116 this .callable = callable ;
111117 this .options = options ;
112118 this .transaction = null ;
119+ this .transactionTraceContext = parentTraceContext ;
113120 }
114121
115122 Datastore getDatastore () {
@@ -132,8 +139,9 @@ void setPrevTransactionId(ByteString transactionId) {
132139
133140 @ Override
134141 public T call () throws DatastoreException {
135- transaction = datastore .newTransaction (options );
136- try {
142+ try (com .google .cloud .datastore .telemetry .TraceUtil .Scope ignored =
143+ transactionTraceContext .makeCurrent ()) {
144+ transaction = datastore .newTransaction (options );
137145 T value = callable .run (transaction );
138146 transaction .commit ();
139147 return value ;
@@ -154,36 +162,41 @@ public T call() throws DatastoreException {
154162
155163 @ Override
156164 public <T > T runInTransaction (final TransactionCallable <T > callable ) {
157- Span span = traceUtil .startSpan (TraceUtil .SPAN_NAME_TRANSACTION );
158- try (Scope scope = traceUtil .getTracer ().withSpan (span )) {
165+ com .google .cloud .datastore .telemetry .TraceUtil .Span span =
166+ otelTraceUtil .startSpan (
167+ com .google .cloud .datastore .telemetry .TraceUtil .SPAN_NAME_TRANSACTION_RUN );
168+ try (com .google .cloud .datastore .telemetry .TraceUtil .Scope ignored = span .makeCurrent ()) {
159169 return RetryHelper .runWithRetries (
160- new ReadWriteTransactionCallable <T >(this , callable , null ),
170+ new ReadWriteTransactionCallable <T >(this , callable , null , otelTraceUtil . currentContext () ),
161171 retrySettings ,
162172 TRANSACTION_EXCEPTION_HANDLER ,
163173 getOptions ().getClock ());
164174 } catch (RetryHelperException e ) {
165- span .setStatus ( Status . UNKNOWN . withDescription ( e . getMessage ()) );
175+ span .end ( e );
166176 throw DatastoreException .translateAndThrow (e );
167177 } finally {
168- span .end (TraceUtil . END_SPAN_OPTIONS );
178+ span .end ();
169179 }
170180 }
171181
172182 @ Override
173183 public <T > T runInTransaction (
174184 final TransactionCallable <T > callable , TransactionOptions transactionOptions ) {
175- Span span = traceUtil .startSpan (TraceUtil .SPAN_NAME_TRANSACTION );
176- try (Scope scope = traceUtil .getTracer ().withSpan (span )) {
185+ com .google .cloud .datastore .telemetry .TraceUtil .Span span =
186+ otelTraceUtil .startSpan (
187+ com .google .cloud .datastore .telemetry .TraceUtil .SPAN_NAME_TRANSACTION_RUN );
188+ try (com .google .cloud .datastore .telemetry .TraceUtil .Scope ignored = span .makeCurrent ()) {
177189 return RetryHelper .runWithRetries (
178- new ReadWriteTransactionCallable <T >(this , callable , transactionOptions ),
190+ new ReadWriteTransactionCallable <T >(
191+ this , callable , transactionOptions , otelTraceUtil .currentContext ()),
179192 retrySettings ,
180193 TRANSACTION_EXCEPTION_HANDLER ,
181194 getOptions ().getClock ());
182195 } catch (RetryHelperException e ) {
183- span .setStatus ( Status . UNKNOWN . withDescription ( e . getMessage ()) );
196+ span .end ( e );
184197 throw DatastoreException .translateAndThrow (e );
185198 } finally {
186- span .end (TraceUtil . END_SPAN_OPTIONS );
199+ span .end ();
187200 }
188201 }
189202
@@ -634,10 +647,14 @@ private com.google.datastore.v1.CommitResponse commitMutation(
634647
635648 com .google .datastore .v1 .CommitResponse commit (
636649 final com .google .datastore .v1 .CommitRequest requestPb ) {
637- com .google .cloud .datastore .telemetry .TraceUtil .Span span =
638- otelTraceUtil .startSpan (com .google .cloud .datastore .telemetry .TraceUtil .SPAN_NAME_COMMIT );
650+ final boolean isTransactional =
651+ requestPb .hasTransaction () || requestPb .hasSingleUseTransaction ();
652+ final String spanName =
653+ isTransactional
654+ ? com .google .cloud .datastore .telemetry .TraceUtil .SPAN_NAME_TRANSACTION_COMMIT
655+ : com .google .cloud .datastore .telemetry .TraceUtil .SPAN_NAME_COMMIT ;
656+ com .google .cloud .datastore .telemetry .TraceUtil .Span span = otelTraceUtil .startSpan (spanName );
639657 span .setAttribute ("isTransactional" , requestPb .hasTransaction ());
640-
641658 try (com .google .cloud .datastore .telemetry .TraceUtil .Scope ignored = span .makeCurrent ()) {
642659 return RetryHelper .runWithRetries (
643660 () -> datastoreRpc .commit (requestPb ),
0 commit comments