Skip to content

Commit e03f21b

Browse files
committed
Merge branch 'main' into add-option-for-api-tracer
2 parents 644e3d3 + 45cdcfc commit e03f21b

File tree

60 files changed

+1881
-706
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+1881
-706
lines changed

.readme-partials.yaml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,27 @@ custom_content: |
144144
.build()
145145
146146
SpannerOptions options = SpannerOptions.newBuilder()
147-
// Inject OpenTelemetry object via Spanner Options or register OpenTelmetry object as Global
147+
// Inject OpenTelemetry object via Spanner Options or register OpenTelemetry object as Global
148148
.setOpenTelemetry(openTelemetry)
149149
.build();
150150
151151
Spanner spanner = options.getService();
152152
```
153+
154+
#### OpenTelemetry SQL Statement Tracing
155+
The OpenTelemetry traces that are generated by the Java client include any request and transaction
156+
tags that have been set. The traces can also include the SQL statements that are executed. Enable
157+
this with the `enableExtendedTracing` option:
158+
159+
```
160+
SpannerOptions options = SpannerOptions.newBuilder()
161+
.setOpenTelemetry(openTelemetry)
162+
.setEnableExtendedTracing(true)
163+
.build();
164+
```
165+
166+
This option can also be enabled by setting the environment variable
167+
`SPANNER_ENABLE_EXTENDED_TRACING=true`.
153168
154169
### Instrument with OpenCensus
155170

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,28 @@ OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
250250
.build()
251251

252252
SpannerOptions options = SpannerOptions.newBuilder()
253-
// Inject OpenTelemetry object via Spanner Options or register OpenTelmetry object as Global
253+
// Inject OpenTelemetry object via Spanner Options or register OpenTelemetry object as Global
254254
.setOpenTelemetry(openTelemetry)
255255
.build();
256256

257257
Spanner spanner = options.getService();
258258
```
259259

260+
#### OpenTelemetry SQL Statement Tracing
261+
The OpenTelemetry traces that are generated by the Java client include any request and transaction
262+
tags that have been set. The traces can also include the SQL statements that are executed. Enable
263+
this with the `enableExtendedTracing` option:
264+
265+
```
266+
SpannerOptions options = SpannerOptions.newBuilder()
267+
.setOpenTelemetry(openTelemetry)
268+
.setEnableExtendedTracing(true)
269+
.build();
270+
```
271+
272+
This option can also be enabled by setting the environment variable
273+
`SPANNER_ENABLE_EXTENDED_TRACING=true`.
274+
260275
### Instrument with OpenCensus
261276

262277
> Note: OpenCensus project is deprecated. See [Sunsetting OpenCensus](https://opentelemetry.io/blog/2023/sunsetting-opencensus/).

benchmarks/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
<parent>
2525
<groupId>com.google.cloud</groupId>
2626
<artifactId>google-cloud-spanner-parent</artifactId>
27-
<version>6.66.0</version><!-- {x-version-update:google-cloud-spanner:current} -->
27+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-spanner:current} -->
2828
</parent>
2929

3030
<properties>
@@ -92,7 +92,7 @@
9292
<dependency>
9393
<groupId>com.google.cloud</groupId>
9494
<artifactId>google-cloud-spanner</artifactId>
95-
<version>6.65.1</version>
95+
<version>6.66.0</version>
9696
</dependency>
9797
<dependency>
9898
<groupId>commons-cli</groupId>

benchmarks/src/main/java/com/google/cloud/spanner/benchmark/BenchmarkRunner.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
public interface BenchmarkRunner {
2323
enum TransactionType {
2424
READ_ONLY_SINGLE_USE,
25+
READ_ONLY_MULTI_USE,
2526
READ_WRITE
2627
}
2728

benchmarks/src/main/java/com/google/cloud/spanner/benchmark/JavaClientRunner.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.google.cloud.opentelemetry.trace.TraceExporter;
2121
import com.google.cloud.spanner.DatabaseClient;
2222
import com.google.cloud.spanner.DatabaseId;
23+
import com.google.cloud.spanner.ReadOnlyTransaction;
2324
import com.google.cloud.spanner.ResultSet;
2425
import com.google.cloud.spanner.SessionPoolOptions;
2526
import com.google.cloud.spanner.SessionPoolOptionsHelper;
@@ -161,7 +162,10 @@ private Duration executeTransaction(
161162
Stopwatch watch = Stopwatch.createStarted();
162163
switch (transactionType) {
163164
case READ_ONLY_SINGLE_USE:
164-
executeReadOnlyTransaction(client);
165+
executeSingleUseReadOnlyTransaction(client);
166+
break;
167+
case READ_ONLY_MULTI_USE:
168+
executeMultiUseReadOnlyTransaction(client);
165169
break;
166170
case READ_WRITE:
167171
executeReadWriteTransaction(client);
@@ -172,7 +176,7 @@ private Duration executeTransaction(
172176
return elapsedTime;
173177
}
174178

175-
private void executeReadOnlyTransaction(DatabaseClient client) {
179+
private void executeSingleUseReadOnlyTransaction(DatabaseClient client) {
176180
try (ResultSet resultSet = client.singleUse().executeQuery(getRandomisedReadStatement())) {
177181
while (resultSet.next()) {
178182
for (int i = 0; i < resultSet.getColumnCount(); i++) {
@@ -186,6 +190,34 @@ private void executeReadOnlyTransaction(DatabaseClient client) {
186190
}
187191
}
188192

193+
private void executeMultiUseReadOnlyTransaction(DatabaseClient client) {
194+
try (ReadOnlyTransaction transaction = client.readOnlyTransaction()) {
195+
ResultSet resultSet = transaction.executeQuery(getRandomisedReadStatement());
196+
iterateResultSet(resultSet);
197+
198+
ResultSet resultSet1 = transaction.executeQuery(getRandomisedReadStatement());
199+
iterateResultSet(resultSet1);
200+
201+
ResultSet resultSet2 = transaction.executeQuery(getRandomisedReadStatement());
202+
iterateResultSet(resultSet2);
203+
204+
ResultSet resultSet3 = transaction.executeQuery(getRandomisedReadStatement());
205+
iterateResultSet(resultSet3);
206+
}
207+
}
208+
209+
private void iterateResultSet(ResultSet resultSet) {
210+
while (resultSet.next()) {
211+
for (int i = 0; i < resultSet.getColumnCount(); i++) {
212+
if (resultSet.isNull(i)) {
213+
numNullValues++;
214+
} else {
215+
numNonNullValues++;
216+
}
217+
}
218+
}
219+
}
220+
189221
private void executeReadWriteTransaction(DatabaseClient client) {
190222
client
191223
.readWriteTransaction()

google-cloud-spanner-bom/pom.xml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>com.google.cloud</groupId>
55
<artifactId>google-cloud-spanner-bom</artifactId>
6-
<version>6.66.0</version><!-- {x-version-update:google-cloud-spanner:current} -->
6+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-spanner:current} -->
77
<packaging>pom</packaging>
88
<parent>
99
<groupId>com.google.cloud</groupId>
@@ -53,43 +53,43 @@
5353
<dependency>
5454
<groupId>com.google.cloud</groupId>
5555
<artifactId>google-cloud-spanner</artifactId>
56-
<version>6.66.0</version><!-- {x-version-update:google-cloud-spanner:current} -->
56+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-spanner:current} -->
5757
</dependency>
5858
<dependency>
5959
<groupId>com.google.cloud</groupId>
6060
<artifactId>google-cloud-spanner</artifactId>
6161
<type>test-jar</type>
62-
<version>6.66.0</version><!-- {x-version-update:google-cloud-spanner:current} -->
62+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-spanner:current} -->
6363
</dependency>
6464
<dependency>
6565
<groupId>com.google.api.grpc</groupId>
6666
<artifactId>grpc-google-cloud-spanner-v1</artifactId>
67-
<version>6.66.0</version><!-- {x-version-update:grpc-google-cloud-spanner-v1:current} -->
67+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-spanner-v1:current} -->
6868
</dependency>
6969
<dependency>
7070
<groupId>com.google.api.grpc</groupId>
7171
<artifactId>grpc-google-cloud-spanner-admin-instance-v1</artifactId>
72-
<version>6.66.0</version><!-- {x-version-update:grpc-google-cloud-spanner-admin-instance-v1:current} -->
72+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-spanner-admin-instance-v1:current} -->
7373
</dependency>
7474
<dependency>
7575
<groupId>com.google.api.grpc</groupId>
7676
<artifactId>grpc-google-cloud-spanner-admin-database-v1</artifactId>
77-
<version>6.66.0</version><!-- {x-version-update:grpc-google-cloud-spanner-admin-database-v1:current} -->
77+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-spanner-admin-database-v1:current} -->
7878
</dependency>
7979
<dependency>
8080
<groupId>com.google.api.grpc</groupId>
8181
<artifactId>proto-google-cloud-spanner-admin-instance-v1</artifactId>
82-
<version>6.66.0</version><!-- {x-version-update:proto-google-cloud-spanner-admin-instance-v1:current} -->
82+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-spanner-admin-instance-v1:current} -->
8383
</dependency>
8484
<dependency>
8585
<groupId>com.google.api.grpc</groupId>
8686
<artifactId>proto-google-cloud-spanner-v1</artifactId>
87-
<version>6.66.0</version><!-- {x-version-update:proto-google-cloud-spanner-v1:current} -->
87+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-spanner-v1:current} -->
8888
</dependency>
8989
<dependency>
9090
<groupId>com.google.api.grpc</groupId>
9191
<artifactId>proto-google-cloud-spanner-admin-database-v1</artifactId>
92-
<version>6.66.0</version><!-- {x-version-update:proto-google-cloud-spanner-admin-database-v1:current} -->
92+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-spanner-admin-database-v1:current} -->
9393
</dependency>
9494
</dependencies>
9595
</dependencyManagement>

google-cloud-spanner-executor/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
<modelVersion>4.0.0</modelVersion>
66
<groupId>com.google.cloud</groupId>
77
<artifactId>google-cloud-spanner-executor</artifactId>
8-
<version>6.66.0</version><!-- {x-version-update:google-cloud-spanner-executor:current} -->
8+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-spanner-executor:current} -->
99
<packaging>jar</packaging>
1010
<name>Google Cloud Spanner Executor</name>
1111

1212
<parent>
1313
<groupId>com.google.cloud</groupId>
1414
<artifactId>google-cloud-spanner-parent</artifactId>
15-
<version>6.66.0</version><!-- {x-version-update:google-cloud-spanner:current} -->
15+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-spanner:current} -->
1616
</parent>
1717

1818
<properties>

google-cloud-spanner/clirr-ignored-differences.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,5 +668,12 @@
668668
<className>com/google/cloud/spanner/connection/Connection</className>
669669
<method>com.google.cloud.spanner.connection.DdlInTransactionMode getDdlInTransactionMode()</method>
670670
</difference>
671+
672+
<!-- Added extended tracing option -->
673+
<difference>
674+
<differenceType>7012</differenceType>
675+
<className>com/google/cloud/spanner/SpannerOptions$SpannerEnvironment</className>
676+
<method>boolean isEnableExtendedTracing()</method>
677+
</difference>
671678

672679
</differences>

google-cloud-spanner/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>com.google.cloud</groupId>
55
<artifactId>google-cloud-spanner</artifactId>
6-
<version>6.66.0</version><!-- {x-version-update:google-cloud-spanner:current} -->
6+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-spanner:current} -->
77
<packaging>jar</packaging>
88
<name>Google Cloud Spanner</name>
99
<url>https://github.com/googleapis/java-spanner</url>
1010
<description>Java idiomatic client for Google Cloud Spanner.</description>
1111
<parent>
1212
<groupId>com.google.cloud</groupId>
1313
<artifactId>google-cloud-spanner-parent</artifactId>
14-
<version>6.66.0</version><!-- {x-version-update:google-cloud-spanner:current} -->
14+
<version>6.66.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-spanner:current} -->
1515
</parent>
1616
<properties>
1717
<site.installationModule>google-cloud-spanner</site.installationModule>

google-cloud-spanner/src/main/java/com/google/cloud/spanner/AbstractReadContext.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,7 @@ ResultSet executeQueryInternalWithOptions(
735735
SpannerImpl.QUERY,
736736
span,
737737
tracer,
738+
tracer.createStatementAttributes(statement, options),
738739
rpc.getExecuteQueryRetrySettings(),
739740
rpc.getExecuteQueryRetryableCodes()) {
740741
@Override

google-cloud-spanner/src/main/java/com/google/cloud/spanner/DatabaseClientImpl.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public Timestamp write(final Iterable<Mutation> mutations) throws SpannerExcepti
9292
public CommitResponse writeWithOptions(
9393
final Iterable<Mutation> mutations, final TransactionOption... options)
9494
throws SpannerException {
95-
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION);
95+
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, options);
9696
try (IScope s = tracer.withSpan(span)) {
9797
return runWithSessionRetry(session -> session.writeWithOptions(mutations, options));
9898
} catch (RuntimeException e) {
@@ -112,7 +112,7 @@ public Timestamp writeAtLeastOnce(final Iterable<Mutation> mutations) throws Spa
112112
public CommitResponse writeAtLeastOnceWithOptions(
113113
final Iterable<Mutation> mutations, final TransactionOption... options)
114114
throws SpannerException {
115-
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION);
115+
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, options);
116116
try (IScope s = tracer.withSpan(span)) {
117117
return runWithSessionRetry(
118118
session -> session.writeAtLeastOnceWithOptions(mutations, options));
@@ -128,7 +128,7 @@ public CommitResponse writeAtLeastOnceWithOptions(
128128
public ServerStream<BatchWriteResponse> batchWriteAtLeastOnce(
129129
final Iterable<MutationGroup> mutationGroups, final TransactionOption... options)
130130
throws SpannerException {
131-
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION);
131+
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, options);
132132
try (IScope s = tracer.withSpan(span)) {
133133
return runWithSessionRetry(session -> session.batchWriteAtLeastOnce(mutationGroups, options));
134134
} catch (RuntimeException e) {
@@ -213,7 +213,7 @@ public ReadOnlyTransaction readOnlyTransaction(TimestampBound bound) {
213213

214214
@Override
215215
public TransactionRunner readWriteTransaction(TransactionOption... options) {
216-
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION);
216+
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, options);
217217
try (IScope s = tracer.withSpan(span)) {
218218
return getSession().readWriteTransaction(options);
219219
} catch (RuntimeException e) {
@@ -225,7 +225,7 @@ public TransactionRunner readWriteTransaction(TransactionOption... options) {
225225

226226
@Override
227227
public TransactionManager transactionManager(TransactionOption... options) {
228-
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION);
228+
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, options);
229229
try (IScope s = tracer.withSpan(span)) {
230230
return getSession().transactionManager(options);
231231
} catch (RuntimeException e) {
@@ -237,7 +237,7 @@ public TransactionManager transactionManager(TransactionOption... options) {
237237

238238
@Override
239239
public AsyncRunner runAsync(TransactionOption... options) {
240-
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION);
240+
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, options);
241241
try (IScope s = tracer.withSpan(span)) {
242242
return getSession().runAsync(options);
243243
} catch (RuntimeException e) {
@@ -249,7 +249,7 @@ public AsyncRunner runAsync(TransactionOption... options) {
249249

250250
@Override
251251
public AsyncTransactionManager transactionManagerAsync(TransactionOption... options) {
252-
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION);
252+
ISpan span = tracer.spanBuilder(READ_WRITE_TRANSACTION, options);
253253
try (IScope s = tracer.withSpan(span)) {
254254
return getSession().transactionManagerAsync(options);
255255
} catch (RuntimeException e) {

google-cloud-spanner/src/main/java/com/google/cloud/spanner/Options.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,10 @@ static final class TagOption extends InternalOption implements ReadQueryUpdateTr
355355
this.tag = tag;
356356
}
357357

358+
String getTag() {
359+
return tag;
360+
}
361+
358362
@Override
359363
void appendToOptions(Options options) {
360364
options.tag = tag;

google-cloud-spanner/src/main/java/com/google/cloud/spanner/ResumableStreamIterator.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.google.protobuf.ByteString;
3535
import com.google.spanner.v1.PartialResultSet;
3636
import io.grpc.Context;
37+
import io.opentelemetry.api.common.Attributes;
3738
import java.io.IOException;
3839
import java.util.LinkedList;
3940
import java.util.Objects;
@@ -81,10 +82,28 @@ protected ResumableStreamIterator(
8182
TraceWrapper tracer,
8283
RetrySettings streamingRetrySettings,
8384
Set<Code> retryableCodes) {
85+
this(
86+
maxBufferSize,
87+
streamName,
88+
parent,
89+
tracer,
90+
Attributes.empty(),
91+
streamingRetrySettings,
92+
retryableCodes);
93+
}
94+
95+
protected ResumableStreamIterator(
96+
int maxBufferSize,
97+
String streamName,
98+
ISpan parent,
99+
TraceWrapper tracer,
100+
Attributes attributes,
101+
RetrySettings streamingRetrySettings,
102+
Set<Code> retryableCodes) {
84103
checkArgument(maxBufferSize >= 0);
85104
this.maxBufferSize = maxBufferSize;
86105
this.tracer = tracer;
87-
this.span = tracer.spanBuilderWithExplicitParent(streamName, parent);
106+
this.span = tracer.spanBuilderWithExplicitParent(streamName, parent, attributes);
88107
this.streamingRetrySettings = Preconditions.checkNotNull(streamingRetrySettings);
89108
this.retryableCodes = Preconditions.checkNotNull(retryableCodes);
90109
this.backOff = newBackOff();

0 commit comments

Comments
 (0)