Skip to content

Commit 6ecce9e

Browse files
feat: TPC support
1 parent 5e26596 commit 6ecce9e

File tree

9 files changed

+82
-54
lines changed

9 files changed

+82
-54
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,4 +1043,16 @@
10431043
<className>com/google/cloud/spanner/connection/Connection</className>
10441044
<method>com.google.spanner.v1.TransactionOptions$ReadWrite$ReadLockMode getReadLockMode()</method>
10451045
</difference>
1046+
1047+
<!-- Removed getMonitoringHost() which was added as part of TPU -->
1048+
<difference>
1049+
<differenceType>7002</differenceType>
1050+
<className>com/google/cloud/spanner/SpannerOptions$SpannerEnvironment</className>
1051+
<method>java.lang.String getMonitoringHost()</method>
1052+
</difference>
1053+
<difference>
1054+
<differenceType>7002</differenceType>
1055+
<className>com/google/cloud/spanner/SpannerOptions$Builder</className>
1056+
<method>com.google.cloud.spanner.SpannerOptions$Builder setMonitoringHost(java.lang.String)</method>
1057+
</difference>
10461058
</differences>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ final class BuiltInMetricsProvider {
6868
private BuiltInMetricsProvider() {}
6969

7070
OpenTelemetry getOrCreateOpenTelemetry(
71-
String projectId, @Nullable Credentials credentials, @Nullable String monitoringHost) {
71+
String projectId, @Nullable Credentials credentials, String universeDomain) {
7272
try {
7373
if (this.openTelemetry == null) {
7474
SdkMeterProviderBuilder sdkMeterProviderBuilder = SdkMeterProvider.builder();
7575
BuiltInMetricsView.registerBuiltinMetrics(
76-
SpannerCloudMonitoringExporter.create(projectId, credentials, monitoringHost),
76+
SpannerCloudMonitoringExporter.create(projectId, credentials, universeDomain),
7777
sdkMeterProviderBuilder);
7878
sdkMeterProviderBuilder.setResource(Resource.create(createResourceAttributes(projectId)));
7979
SdkMeterProvider sdkMeterProvider = sdkMeterProviderBuilder.build();
@@ -95,10 +95,10 @@ void enableGrpcMetrics(
9595
InstantiatingGrpcChannelProvider.Builder channelProviderBuilder,
9696
String projectId,
9797
@Nullable Credentials credentials,
98-
@Nullable String monitoringHost) {
98+
String universeDomain) {
9999
GrpcOpenTelemetry grpcOpenTelemetry =
100100
GrpcOpenTelemetry.newBuilder()
101-
.sdk(this.getOrCreateOpenTelemetry(projectId, credentials, monitoringHost))
101+
.sdk(this.getOrCreateOpenTelemetry(projectId, credentials, universeDomain))
102102
.enableMetrics(BuiltInMetricsConstant.GRPC_METRICS_TO_ENABLE)
103103
// Disable gRPCs default metrics as they are not needed for Spanner.
104104
.disableMetrics(BuiltInMetricsConstant.GRPC_METRICS_ENABLED_BY_DEFAULT)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class SpannerCloudMonitoringExporter implements MetricExporter {
7171
private final String spannerProjectId;
7272

7373
static SpannerCloudMonitoringExporter create(
74-
String projectId, @Nullable Credentials credentials, @Nullable String monitoringHost)
74+
String projectId, @Nullable Credentials credentials, String universeDomain)
7575
throws IOException {
7676
MetricServiceSettings.Builder settingsBuilder = MetricServiceSettings.newBuilder();
7777
CredentialsProvider credentialsProvider;
@@ -81,8 +81,8 @@ static SpannerCloudMonitoringExporter create(
8181
credentialsProvider = FixedCredentialsProvider.create(credentials);
8282
}
8383
settingsBuilder.setCredentialsProvider(credentialsProvider);
84-
if (monitoringHost != null) {
85-
settingsBuilder.setEndpoint(monitoringHost);
84+
if (universeDomain != null && !universeDomain.isEmpty()) {
85+
settingsBuilder.setUniverseDomain(universeDomain);
8686
}
8787

8888
Duration timeout = Duration.ofMinutes(1);

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

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ public class SpannerOptions extends ServiceOptions<Spanner, SpannerOptions> {
120120
private static final String PG_ADAPTER_CLIENT_LIB_TOKEN = "pg-adapter";
121121

122122
private static final String API_SHORT_NAME = "Spanner";
123-
private static final String DEFAULT_HOST = "https://spanner.googleapis.com";
123+
private static final String SPANNER_SERVICE_NAME = "spanner";
124+
private static final String GOOGLE_DEFAULT_UNIVERSE = "googleapis.com";
124125
private static final String EXPERIMENTAL_HOST_PROJECT_ID = "default";
125126

126127
private static final ImmutableSet<String> SCOPES =
@@ -185,7 +186,6 @@ public class SpannerOptions extends ServiceOptions<Spanner, SpannerOptions> {
185186
private final boolean enableBuiltInMetrics;
186187
private final boolean enableExtendedTracing;
187188
private final boolean enableEndToEndTracing;
188-
private final String monitoringHost;
189189
private final TransactionOptions defaultTransactionOptions;
190190

191191
enum TracingFramework {
@@ -780,9 +780,18 @@ protected SpannerOptions(Builder builder) {
780780
databaseRole = builder.databaseRole;
781781
sessionLabels = builder.sessionLabels;
782782
try {
783-
spannerStubSettings = builder.spannerStubSettingsBuilder.build();
784-
instanceAdminStubSettings = builder.instanceAdminStubSettingsBuilder.build();
785-
databaseAdminStubSettings = builder.databaseAdminStubSettingsBuilder.build();
783+
spannerStubSettings =
784+
builder.spannerStubSettingsBuilder.setUniverseDomain(getResolvedUniverseDomain()).build();
785+
instanceAdminStubSettings =
786+
builder
787+
.instanceAdminStubSettingsBuilder
788+
.setUniverseDomain(getResolvedUniverseDomain())
789+
.build();
790+
databaseAdminStubSettings =
791+
builder
792+
.databaseAdminStubSettingsBuilder
793+
.setUniverseDomain(getResolvedUniverseDomain())
794+
.build();
786795
} catch (IOException e) {
787796
throw SpannerExceptionFactory.newSpannerException(e);
788797
}
@@ -820,10 +829,16 @@ protected SpannerOptions(Builder builder) {
820829
enableBuiltInMetrics = builder.enableBuiltInMetrics;
821830
}
822831
enableEndToEndTracing = builder.enableEndToEndTracing;
823-
monitoringHost = builder.monitoringHost;
824832
defaultTransactionOptions = builder.defaultTransactionOptions;
825833
}
826834

835+
private String getResolvedUniverseDomain() {
836+
String universeDomain = getUniverseDomain();
837+
return (universeDomain == null || universeDomain.isEmpty())
838+
? GOOGLE_DEFAULT_UNIVERSE
839+
: universeDomain;
840+
}
841+
827842
/**
828843
* The environment to read configuration values from. The default implementation uses environment
829844
* variables.
@@ -871,10 +886,6 @@ default boolean isEnableEndToEndTracing() {
871886
return false;
872887
}
873888

874-
default String getMonitoringHost() {
875-
return null;
876-
}
877-
878889
default GoogleCredentials getDefaultExperimentalHostCredentials() {
879890
return null;
880891
}
@@ -901,7 +912,6 @@ private static class SpannerEnvironmentImpl implements SpannerEnvironment {
901912
private static final String SPANNER_DISABLE_BUILTIN_METRICS = "SPANNER_DISABLE_BUILTIN_METRICS";
902913
private static final String SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS =
903914
"SPANNER_DISABLE_DIRECT_ACCESS_GRPC_BUILTIN_METRICS";
904-
private static final String SPANNER_MONITORING_HOST = "SPANNER_MONITORING_HOST";
905915

906916
private SpannerEnvironmentImpl() {}
907917

@@ -951,11 +961,6 @@ public boolean isEnableEndToEndTracing() {
951961
return Boolean.parseBoolean(System.getenv(SPANNER_ENABLE_END_TO_END_TRACING));
952962
}
953963

954-
@Override
955-
public String getMonitoringHost() {
956-
return System.getenv(SPANNER_MONITORING_HOST);
957-
}
958-
959964
@Override
960965
public GoogleCredentials getDefaultExperimentalHostCredentials() {
961966
return getOAuthTokenFromFile(System.getenv(DEFAULT_SPANNER_EXPERIMENTAL_HOST_CREDENTIALS));
@@ -1025,7 +1030,6 @@ public static class Builder
10251030
private boolean enableExtendedTracing = SpannerOptions.environment.isEnableExtendedTracing();
10261031
private boolean enableEndToEndTracing = SpannerOptions.environment.isEnableEndToEndTracing();
10271032
private boolean enableBuiltInMetrics = SpannerOptions.environment.isEnableBuiltInMetrics();
1028-
private String monitoringHost = SpannerOptions.environment.getMonitoringHost();
10291033
private SslContext mTLSContext = null;
10301034
private boolean isExperimentalHost = false;
10311035
private TransactionOptions defaultTransactionOptions = TransactionOptions.getDefaultInstance();
@@ -1096,7 +1100,6 @@ protected Builder() {
10961100
this.enableExtendedTracing = options.enableExtendedTracing;
10971101
this.enableBuiltInMetrics = options.enableBuiltInMetrics;
10981102
this.enableEndToEndTracing = options.enableEndToEndTracing;
1099-
this.monitoringHost = options.monitoringHost;
11001103
this.defaultTransactionOptions = options.defaultTransactionOptions;
11011104
}
11021105

@@ -1664,12 +1667,6 @@ public Builder setBuiltInMetricsEnabled(boolean enableBuiltInMetrics) {
16641667
return this;
16651668
}
16661669

1667-
/** Sets the monitoring host to be used for Built-in client side metrics */
1668-
public Builder setMonitoringHost(String monitoringHost) {
1669-
this.monitoringHost = monitoringHost;
1670-
return this;
1671-
}
1672-
16731670
/**
16741671
* Sets whether to enable extended OpenTelemetry tracing. Enabling this option will add the
16751672
* following additional attributes to the traces that are generated by the client:
@@ -2035,7 +2032,7 @@ public ApiTracerFactory getApiTracerFactory() {
20352032
public void enablegRPCMetrics(InstantiatingGrpcChannelProvider.Builder channelProviderBuilder) {
20362033
if (SpannerOptions.environment.isEnableGRPCBuiltInMetrics()) {
20372034
this.builtInMetricsProvider.enableGrpcMetrics(
2038-
channelProviderBuilder, this.getProjectId(), getCredentials(), this.monitoringHost);
2035+
channelProviderBuilder, this.getProjectId(), getCredentials(), getUniverseDomain());
20392036
}
20402037
}
20412038

@@ -2081,7 +2078,7 @@ private ApiTracerFactory getDefaultApiTracerFactory() {
20812078
private ApiTracerFactory createMetricsApiTracerFactory() {
20822079
OpenTelemetry openTelemetry =
20832080
this.builtInMetricsProvider.getOrCreateOpenTelemetry(
2084-
this.getProjectId(), getCredentials(), this.monitoringHost);
2081+
this.getProjectId(), getCredentials(), getUniverseDomain());
20852082

20862083
return openTelemetry != null
20872084
? new BuiltInMetricsTracerFactory(
@@ -2115,11 +2112,6 @@ public boolean isEnableBuiltInMetrics() {
21152112
return enableBuiltInMetrics;
21162113
}
21172114

2118-
/** Returns the override metrics Host. */
2119-
String getMonitoringHost() {
2120-
return monitoringHost;
2121-
}
2122-
21232115
public TransactionOptions getDefaultTransactionOptions() {
21242116
return defaultTransactionOptions;
21252117
}
@@ -2181,7 +2173,11 @@ public static GrpcTransportOptions getDefaultGrpcTransportOptions() {
21812173

21822174
@Override
21832175
protected String getDefaultHost() {
2184-
return DEFAULT_HOST;
2176+
String universeDomain = getUniverseDomain();
2177+
if (universeDomain == null || universeDomain.isEmpty()) {
2178+
universeDomain = GOOGLE_DEFAULT_UNIVERSE;
2179+
}
2180+
return String.format("https://%s.%s", SPANNER_SERVICE_NAME, universeDomain);
21852181
}
21862182

21872183
private static class SpannerDefaults implements ServiceDefaults<Spanner, SpannerOptions> {

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import static com.google.cloud.spanner.connection.ConnectionProperties.TRACING_PREFIX;
5050
import static com.google.cloud.spanner.connection.ConnectionProperties.TRACK_CONNECTION_LEAKS;
5151
import static com.google.cloud.spanner.connection.ConnectionProperties.TRACK_SESSION_LEAKS;
52+
import static com.google.cloud.spanner.connection.ConnectionProperties.UNIVERSE_DOMAIN;
5253
import static com.google.cloud.spanner.connection.ConnectionProperties.USER_AGENT;
5354
import static com.google.cloud.spanner.connection.ConnectionProperties.USE_AUTO_SAVEPOINTS_FOR_EMULATOR;
5455
import static com.google.cloud.spanner.connection.ConnectionProperties.USE_PLAIN_TEXT;
@@ -1086,6 +1087,10 @@ Boolean isEnableDirectAccess() {
10861087
return getInitialConnectionPropertyValue(ENABLE_DIRECT_ACCESS);
10871088
}
10881089

1090+
String getUniverseDomain() {
1091+
return getInitialConnectionPropertyValue(UNIVERSE_DOMAIN);
1092+
}
1093+
10891094
String getClientCertificate() {
10901095
return getInitialConnectionPropertyValue(CLIENT_CERTIFICATE);
10911096
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,14 @@ public class ConnectionProperties {
200200
BOOLEANS,
201201
BooleanConverter.INSTANCE,
202202
Context.STARTUP);
203+
static final ConnectionProperty<String> UNIVERSE_DOMAIN =
204+
create(
205+
"universeDomain",
206+
"Configure the connection to try to connect to Spanner using "
207+
+ "different partner Google Universe other than GDU(googleapis.com).",
208+
"googleapis.com",
209+
StringValueConverter.INSTANCE,
210+
Context.STARTUP);
203211
static final ConnectionProperty<Boolean> USE_AUTO_SAVEPOINTS_FOR_EMULATOR =
204212
create(
205213
"useAutoSavepointsForEmulator",

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ static class SpannerPoolKey {
165165
private final String clientCertificateKey;
166166
private final boolean isExperimentalHost;
167167
private final Boolean enableDirectAccess;
168+
private final String universeDomain;
168169

169170
@VisibleForTesting
170171
static SpannerPoolKey of(ConnectionOptions options) {
@@ -200,6 +201,7 @@ private SpannerPoolKey(ConnectionOptions options) throws IOException {
200201
this.clientCertificateKey = options.getClientCertificateKey();
201202
this.isExperimentalHost = options.isExperimentalHost();
202203
this.enableDirectAccess = options.isEnableDirectAccess();
204+
this.universeDomain = options.getUniverseDomain();
203205
}
204206

205207
@Override
@@ -226,7 +228,8 @@ public boolean equals(Object o) {
226228
&& Objects.equals(this.clientCertificate, other.clientCertificate)
227229
&& Objects.equals(this.clientCertificateKey, other.clientCertificateKey)
228230
&& Objects.equals(this.isExperimentalHost, other.isExperimentalHost)
229-
&& Objects.equals(this.enableDirectAccess, other.enableDirectAccess);
231+
&& Objects.equals(this.enableDirectAccess, other.enableDirectAccess)
232+
&& Objects.equals(this.universeDomain, other.universeDomain);
230233
}
231234

232235
@Override
@@ -249,7 +252,8 @@ public int hashCode() {
249252
this.clientCertificate,
250253
this.clientCertificateKey,
251254
this.isExperimentalHost,
252-
this.enableDirectAccess);
255+
this.enableDirectAccess,
256+
this.universeDomain);
253257
}
254258
}
255259

@@ -419,6 +423,9 @@ Spanner createSpanner(SpannerPoolKey key, ConnectionOptions options) {
419423
if (key.enableDirectAccess != null) {
420424
builder.setEnableDirectAccess(key.enableDirectAccess);
421425
}
426+
if (key.universeDomain != null) {
427+
builder.setUniverseDomain(key.universeDomain);
428+
}
422429
if (options.getConfigurator() != null) {
423430
options.getConfigurator().configure(builder);
424431
}

google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerOptionsTest.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -756,19 +756,6 @@ public void testEndToEndTracingEnablement() {
756756
.isEndToEndTracingEnabled());
757757
}
758758

759-
@Test
760-
public void testMonitoringHost() {
761-
String metricsEndpoint = "test-endpoint:443";
762-
assertNull(SpannerOptions.newBuilder().setProjectId("p").build().getMonitoringHost());
763-
assertThat(
764-
SpannerOptions.newBuilder()
765-
.setProjectId("p")
766-
.setMonitoringHost(metricsEndpoint)
767-
.build()
768-
.getMonitoringHost())
769-
.isEqualTo(metricsEndpoint);
770-
}
771-
772759
@Test
773760
public void testTransactionOptions() {
774761
DefaultReadWriteTransactionOptions transactionOptions =

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,4 +1329,17 @@ public void testEnableDirectAccess() {
13291329
"spanner://localhost:15000/projects/default/instances/default/databases/singers-db;usePlainText=true;enableDirectAccess=true");
13301330
assertTrue(builderWithDirectPathParam.build().isEnableDirectAccess());
13311331
}
1332+
1333+
@Test
1334+
public void testUniverseDomain() {
1335+
ConnectionOptions.Builder builderWithNoUniverseDomainParam = ConnectionOptions.newBuilder();
1336+
builderWithNoUniverseDomainParam.setUri(
1337+
"spanner://localhost:15000/instances/default/databases/singers-db;usePlainText=true");
1338+
assertEquals("googleapis.com", builderWithNoUniverseDomainParam.build().getUniverseDomain());
1339+
1340+
ConnectionOptions.Builder builderWithUniverseDomainParam = ConnectionOptions.newBuilder();
1341+
builderWithUniverseDomainParam.setUri(
1342+
"spanner://localhost:15000/projects/default/instances/default/databases/singers-db;usePlainText=true;universeDomain=abc.goog");
1343+
assertEquals("abc.goog", builderWithUniverseDomainParam.build().getUniverseDomain());
1344+
}
13321345
}

0 commit comments

Comments
 (0)