Skip to content

Commit d9749ea

Browse files
committed
Created new grpc wrapper
1 parent 387fad5 commit d9749ea

File tree

5 files changed

+55
-18
lines changed

5 files changed

+55
-18
lines changed

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

-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ public class BuiltInMetricsConstant {
101101
DIRECT_PATH_ENABLED_KEY,
102102
DIRECT_PATH_USED_KEY);
103103

104-
public static boolean DIRECT_PATH_ENABLED;
105104
static Aggregation AGGREGATION_WITH_MILLIS_HISTOGRAM =
106105
Aggregation.explicitBucketHistogram(
107106
ImmutableList.of(

google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GapicSpannerRpc.java

+21-8
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import com.google.cloud.grpc.GrpcTransportOptions;
6565
import com.google.cloud.spanner.AdminRequestsPerMinuteExceededException;
6666
import com.google.cloud.spanner.BackupId;
67-
import com.google.cloud.spanner.BuiltInMetricsConstant;
6867
import com.google.cloud.spanner.ErrorCode;
6968
import com.google.cloud.spanner.Restore;
7069
import com.google.cloud.spanner.SpannerException;
@@ -80,13 +79,14 @@
8079
import com.google.cloud.spanner.admin.instance.v1.stub.InstanceAdminStub;
8180
import com.google.cloud.spanner.admin.instance.v1.stub.InstanceAdminStubSettings;
8281
import com.google.cloud.spanner.encryption.EncryptionConfigProtoMapper;
83-
import com.google.cloud.spanner.v1.stub.GrpcSpannerStubWrapper;
8482
import com.google.cloud.spanner.v1.stub.SpannerStub;
8583
import com.google.cloud.spanner.v1.stub.SpannerStubSettings;
8684
import com.google.common.annotations.VisibleForTesting;
8785
import com.google.common.base.Function;
8886
import com.google.common.base.MoreObjects;
8987
import com.google.common.base.Preconditions;
88+
import com.google.common.base.Supplier;
89+
import com.google.common.base.Suppliers;
9090
import com.google.common.collect.ImmutableList;
9191
import com.google.common.collect.ImmutableSet;
9292
import com.google.common.io.Resources;
@@ -278,6 +278,11 @@ public class GapicSpannerRpc implements SpannerRpc {
278278
private final int numChannels;
279279
private final boolean isGrpcGcpExtensionEnabled;
280280

281+
private Supplier<Boolean> directPathEnabledSupplier =
282+
() -> {
283+
return false;
284+
};;
285+
281286
public static GapicSpannerRpc create(SpannerOptions options) {
282287
return new GapicSpannerRpc(options);
283288
}
@@ -353,7 +358,9 @@ public GapicSpannerRpc(final SpannerOptions options) {
353358
SpannerInterceptorProvider.create(
354359
MoreObjects.firstNonNull(
355360
options.getInterceptorProvider(),
356-
SpannerInterceptorProvider.createDefault(options.getOpenTelemetry())))
361+
SpannerInterceptorProvider.createDefault(
362+
options.getOpenTelemetry(),
363+
(() -> directPathEnabledSupplier.get()))))
357364
// This sets the trace context headers.
358365
.withTraceContext(endToEndTracingEnabled, options.getOpenTelemetry())
359366
// This sets the response compressor (Server -> Client).
@@ -410,10 +417,15 @@ public GapicSpannerRpc(final SpannerOptions options) {
410417
/* isAdminClient = */ false, isEmulatorEnabled(options, emulatorHost)))
411418
.build();
412419
ClientContext clientContext = ClientContext.create(spannerStubSettings);
413-
this.spannerStub = GrpcSpannerStubWrapper.create(spannerStubSettings, clientContext);
414-
BuiltInMetricsConstant.DIRECT_PATH_ENABLED =
415-
((GrpcTransportChannel) clientContext.getTransportChannel()).isDirectPath()
416-
&& isAttemptDirectPathXds;
420+
this.spannerStub =
421+
GrpcSpannerStubWithStubSettingsAndClientContext.create(
422+
spannerStubSettings, clientContext);
423+
this.directPathEnabledSupplier =
424+
Suppliers.memoize(
425+
() -> {
426+
return ((GrpcTransportChannel) clientContext.getTransportChannel()).isDirectPath()
427+
&& isAttemptDirectPathXds;
428+
});
417429
this.readRetrySettings =
418430
options.getSpannerStubSettings().streamingReadSettings().getRetrySettings();
419431
this.readRetryableCodes =
@@ -461,7 +473,8 @@ public GapicSpannerRpc(final SpannerOptions options) {
461473
.getStreamWatchdogProvider()
462474
.withCheckInterval(pdmlSettings.getStreamWatchdogCheckInterval()));
463475
}
464-
this.partitionedDmlStub = GrpcSpannerStubWrapper.create(pdmlSettings.build());
476+
this.partitionedDmlStub =
477+
GrpcSpannerStubWithStubSettingsAndClientContext.create(pdmlSettings.build());
465478
this.instanceAdminStubSettings =
466479
options
467480
.getInstanceAdminStubSettings()

google-cloud-spanner/src/main/java/com/google/cloud/spanner/v1/stub/GrpcSpannerStubWrapper.java renamed to google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/GrpcSpannerStubWithStubSettingsAndClientContext.java

+13-6
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,27 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.google.cloud.spanner.v1.stub;
17+
package com.google.cloud.spanner.spi.v1;
1818

1919
import com.google.api.gax.rpc.ClientContext;
20+
import com.google.cloud.spanner.v1.stub.GrpcSpannerStub;
21+
import com.google.cloud.spanner.v1.stub.SpannerStubSettings;
2022
import java.io.IOException;
2123

22-
public class GrpcSpannerStubWrapper extends GrpcSpannerStub {
24+
/**
25+
* Wrapper around {@link GrpcSpannerStub} to make the constructor available inside this package.
26+
* This makes it possible to create a {@link GrpcSpannerStub} with a {@link SpannerStubSettings} and
27+
* a {@link ClientContext}.
28+
*/
29+
class GrpcSpannerStubWithStubSettingsAndClientContext extends GrpcSpannerStub {
2330

24-
public static final GrpcSpannerStubWrapper create(
31+
public static final GrpcSpannerStubWithStubSettingsAndClientContext create(
2532
SpannerStubSettings settings, ClientContext clientContext) throws IOException {
26-
return new GrpcSpannerStubWrapper(settings, clientContext);
33+
return new GrpcSpannerStubWithStubSettingsAndClientContext(settings, clientContext);
2734
}
2835

29-
protected GrpcSpannerStubWrapper(SpannerStubSettings settings, ClientContext clientContext)
30-
throws IOException {
36+
protected GrpcSpannerStubWithStubSettingsAndClientContext(
37+
SpannerStubSettings settings, ClientContext clientContext) throws IOException {
3138
super(settings, clientContext);
3239
}
3340
}

google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/HeaderInterceptor.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import com.google.cloud.spanner.CompositeTracer;
2929
import com.google.cloud.spanner.SpannerExceptionFactory;
3030
import com.google.cloud.spanner.SpannerRpcMetrics;
31+
import com.google.common.base.Supplier;
3132
import com.google.common.cache.Cache;
3233
import com.google.common.cache.CacheBuilder;
3334
import com.google.spanner.admin.database.v1.DatabaseName;
@@ -93,8 +94,12 @@ class HeaderInterceptor implements ClientInterceptor {
9394
private static final Level LEVEL = Level.INFO;
9495
private final SpannerRpcMetrics spannerRpcMetrics;
9596

96-
HeaderInterceptor(SpannerRpcMetrics spannerRpcMetrics) {
97+
private final Supplier<Boolean> directPathEnabledSupplier;
98+
99+
HeaderInterceptor(
100+
SpannerRpcMetrics spannerRpcMetrics, Supplier<Boolean> directPathEnabledSupplier) {
97101
this.spannerRpcMetrics = spannerRpcMetrics;
102+
this.directPathEnabledSupplier = directPathEnabledSupplier;
98103
}
99104

100105
@Override
@@ -230,7 +235,7 @@ private Map<String, String> getBuiltInMetricAttributes(String key, DatabaseName
230235
BuiltInMetricsConstant.INSTANCE_ID_KEY.getKey(), databaseName.getInstance());
231236
attributes.put(
232237
BuiltInMetricsConstant.DIRECT_PATH_ENABLED_KEY.getKey(),
233-
String.valueOf(BuiltInMetricsConstant.DIRECT_PATH_ENABLED));
238+
String.valueOf(this.directPathEnabledSupplier.get()));
234239
return attributes;
235240
});
236241
}

google-cloud-spanner/src/main/java/com/google/cloud/spanner/spi/v1/SpannerInterceptorProvider.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import com.google.api.core.ObsoleteApi;
2020
import com.google.api.gax.grpc.GrpcInterceptorProvider;
2121
import com.google.cloud.spanner.SpannerRpcMetrics;
22+
import com.google.common.base.Supplier;
23+
import com.google.common.base.Suppliers;
2224
import com.google.common.collect.ImmutableList;
2325
import io.grpc.ClientInterceptor;
2426
import io.opentelemetry.api.GlobalOpenTelemetry;
@@ -46,11 +48,22 @@ public static SpannerInterceptorProvider createDefault() {
4648
}
4749

4850
public static SpannerInterceptorProvider createDefault(OpenTelemetry openTelemetry) {
51+
return createDefault(
52+
openTelemetry,
53+
Suppliers.memoize(
54+
() -> {
55+
return false;
56+
}));
57+
}
58+
59+
public static SpannerInterceptorProvider createDefault(
60+
OpenTelemetry openTelemetry, Supplier<Boolean> directPathEnabledSupplier) {
4961
List<ClientInterceptor> defaultInterceptorList = new ArrayList<>();
5062
defaultInterceptorList.add(new SpannerErrorInterceptor());
5163
defaultInterceptorList.add(
5264
new LoggingInterceptor(Logger.getLogger(GapicSpannerRpc.class.getName()), Level.FINER));
53-
defaultInterceptorList.add(new HeaderInterceptor(new SpannerRpcMetrics(openTelemetry)));
65+
defaultInterceptorList.add(
66+
new HeaderInterceptor(new SpannerRpcMetrics(openTelemetry), directPathEnabledSupplier));
5467
return new SpannerInterceptorProvider(ImmutableList.copyOf(defaultInterceptorList));
5568
}
5669

0 commit comments

Comments
 (0)