Skip to content

Commit 4f7d28b

Browse files
chore: add support for OpenTelemetry metrics to Connection API (#2896)
* chore: add support for OpenTelemetry metrics to Connection API * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent c6d82d4 commit 4f7d28b

File tree

3 files changed

+60
-2
lines changed

3 files changed

+60
-2
lines changed

google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import com.google.common.base.Strings;
4040
import com.google.common.collect.Sets;
4141
import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions;
42+
import io.opentelemetry.api.OpenTelemetry;
4243
import java.io.IOException;
4344
import java.lang.reflect.Constructor;
4445
import java.lang.reflect.InvocationTargetException;
@@ -484,6 +485,7 @@ public static class Builder {
484485
private List<StatementExecutionInterceptor> statementExecutionInterceptors =
485486
Collections.emptyList();
486487
private SpannerOptionsConfigurator configurator;
488+
private OpenTelemetry openTelemetry;
487489

488490
private Builder() {}
489491

@@ -633,6 +635,11 @@ Builder setCredentials(Credentials credentials) {
633635
return this;
634636
}
635637

638+
public Builder setOpenTelemetry(OpenTelemetry openTelemetry) {
639+
this.openTelemetry = openTelemetry;
640+
return this;
641+
}
642+
636643
/** @return the {@link ConnectionOptions} */
637644
public ConnectionOptions build() {
638645
Preconditions.checkState(this.uri != null, "Connection URI is required");
@@ -691,6 +698,7 @@ public static Builder newBuilder() {
691698
private final boolean retryAbortsInternally;
692699
private final boolean useVirtualThreads;
693700
private final boolean useVirtualGrpcTransportThreads;
701+
private final OpenTelemetry openTelemetry;
694702
private final List<StatementExecutionInterceptor> statementExecutionInterceptors;
695703
private final SpannerOptionsConfigurator configurator;
696704

@@ -792,6 +800,7 @@ private ConnectionOptions(Builder builder) {
792800
this.retryAbortsInternally = parseRetryAbortsInternally(this.uri);
793801
this.useVirtualThreads = parseUseVirtualThreads(this.uri);
794802
this.useVirtualGrpcTransportThreads = parseUseVirtualGrpcTransportThreads(this.uri);
803+
this.openTelemetry = builder.openTelemetry;
795804
this.statementExecutionInterceptors =
796805
Collections.unmodifiableList(builder.statementExecutionInterceptors);
797806
this.configurator = builder.configurator;
@@ -856,6 +865,14 @@ private static Integer parseIntegerProperty(String propertyName, String value) {
856865
return null;
857866
}
858867

868+
/**
869+
* @return an instance of OpenTelemetry. If OpenTelemetry object is not set then <code>null</code>
870+
* will be returned.
871+
*/
872+
OpenTelemetry getOpenTelemetry() {
873+
return this.openTelemetry;
874+
}
875+
859876
SpannerOptionsConfigurator getConfigurator() {
860877
return configurator;
861878
}

google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/SpannerPool.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.google.common.base.Preconditions;
3030
import com.google.common.base.Ticker;
3131
import io.grpc.ManagedChannelBuilder;
32+
import io.opentelemetry.api.OpenTelemetry;
3233
import java.io.IOException;
3334
import java.util.ArrayList;
3435
import java.util.HashMap;
@@ -156,6 +157,7 @@ static class SpannerPoolKey {
156157
private final String databaseRole;
157158
private final boolean routeToLeader;
158159
private final boolean useVirtualGrpcTransportThreads;
160+
private final OpenTelemetry openTelemetry;
159161

160162
@VisibleForTesting
161163
static SpannerPoolKey of(ConnectionOptions options) {
@@ -183,6 +185,7 @@ private SpannerPoolKey(ConnectionOptions options) throws IOException {
183185
this.userAgent = options.getUserAgent();
184186
this.routeToLeader = options.isRouteToLeader();
185187
this.useVirtualGrpcTransportThreads = options.isUseVirtualGrpcTransportThreads();
188+
this.openTelemetry = options.getOpenTelemetry();
186189
}
187190

188191
@Override
@@ -201,7 +204,8 @@ public boolean equals(Object o) {
201204
&& Objects.equals(this.userAgent, other.userAgent)
202205
&& Objects.equals(this.routeToLeader, other.routeToLeader)
203206
&& Objects.equals(
204-
this.useVirtualGrpcTransportThreads, other.useVirtualGrpcTransportThreads);
207+
this.useVirtualGrpcTransportThreads, other.useVirtualGrpcTransportThreads)
208+
&& Objects.equals(this.openTelemetry, other.openTelemetry);
205209
}
206210

207211
@Override
@@ -216,7 +220,8 @@ public int hashCode() {
216220
this.databaseRole,
217221
this.userAgent,
218222
this.routeToLeader,
219-
this.useVirtualGrpcTransportThreads);
223+
this.useVirtualGrpcTransportThreads,
224+
this.openTelemetry);
220225
}
221226
}
222227

@@ -349,6 +354,9 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) {
349354
.setDatabaseRole(options.getDatabaseRole())
350355
.setCredentials(options.getCredentials());
351356
builder.setSessionPoolOption(key.sessionPoolOptions);
357+
if (key.openTelemetry != null) {
358+
builder.setOpenTelemetry(key.openTelemetry);
359+
}
352360
if (key.numChannels != null) {
353361
builder.setNumChannels(key.numChannels);
354362
}

google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/SpannerPoolTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import com.google.cloud.spanner.connection.SpannerPool.SpannerPoolKey;
4040
import com.google.common.base.Ticker;
4141
import com.google.common.testing.FakeTicker;
42+
import io.opentelemetry.api.OpenTelemetry;
43+
import io.opentelemetry.sdk.OpenTelemetrySdk;
4244
import java.io.ByteArrayOutputStream;
4345
import java.io.OutputStream;
4446
import java.util.concurrent.TimeUnit;
@@ -69,6 +71,10 @@ public class SpannerPoolTest {
6971
private ConnectionOptions options7 = mock(ConnectionOptions.class);
7072
private ConnectionOptions options8 = mock(ConnectionOptions.class);
7173

74+
private ConnectionOptions optionsOpenTelemetry1 = mock(ConnectionOptions.class);
75+
private ConnectionOptions optionsOpenTelemetry2 = mock(ConnectionOptions.class);
76+
private ConnectionOptions optionsOpenTelemetry3 = mock(ConnectionOptions.class);
77+
7278
private SpannerPool createSubjectAndMocks() {
7379
return createSubjectAndMocks(0L, Ticker.systemTicker());
7480
}
@@ -83,6 +89,9 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) {
8389
}
8490
};
8591

92+
OpenTelemetry openTelemetry1 = OpenTelemetrySdk.builder().build();
93+
OpenTelemetry openTelemetry2 = OpenTelemetrySdk.builder().build();
94+
8695
when(options1.getCredentialsUrl()).thenReturn(credentials1);
8796
when(options1.getProjectId()).thenReturn("test-project-1");
8897
when(options2.getCredentialsUrl()).thenReturn(credentials2);
@@ -101,6 +110,13 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) {
101110
when(options8.getProjectId()).thenReturn("test-project-3");
102111
when(options8.isRouteToLeader()).thenReturn(false);
103112

113+
when(optionsOpenTelemetry1.getProjectId()).thenReturn("test-project-1");
114+
when(optionsOpenTelemetry1.getOpenTelemetry()).thenReturn(openTelemetry1);
115+
when(optionsOpenTelemetry2.getProjectId()).thenReturn("test-project-1");
116+
when(optionsOpenTelemetry2.getOpenTelemetry()).thenReturn(openTelemetry1);
117+
when(optionsOpenTelemetry3.getProjectId()).thenReturn("test-project-1");
118+
when(optionsOpenTelemetry3.getOpenTelemetry()).thenReturn(openTelemetry2);
119+
104120
return pool;
105121
}
106122

@@ -498,4 +514,21 @@ public void testSpannerPoolKeyEquality() {
498514
assertEquals(key3, key4);
499515
assertNotEquals(key4, key5);
500516
}
517+
518+
@Test
519+
public void testOpenTelemetry() {
520+
SpannerPool pool = createSubjectAndMocks();
521+
Spanner spanner1;
522+
Spanner spanner2;
523+
524+
// assert equal
525+
spanner1 = pool.getSpanner(optionsOpenTelemetry1, connection1);
526+
spanner2 = pool.getSpanner(optionsOpenTelemetry2, connection2);
527+
assertEquals(spanner1, spanner2);
528+
529+
// assert not equal
530+
spanner1 = pool.getSpanner(optionsOpenTelemetry1, connection1);
531+
spanner2 = pool.getSpanner(optionsOpenTelemetry3, connection2);
532+
assertNotEquals(spanner1, spanner2);
533+
}
501534
}

0 commit comments

Comments
 (0)