Skip to content
This repository was archived by the owner on May 8, 2026. It is now read-only.

Commit c0f6ebf

Browse files
committed
Merge branch 'main' into view
2 parents 250d0e3 + 3a58f9b commit c0f6ebf

17 files changed

Lines changed: 331 additions & 106 deletions

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@
3434
<className>com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStub</className>
3535
<method>*</method>
3636
</difference>
37+
<difference>
38+
<!-- change method types is ok because EnhancedBigtableStub is InternalApi -->
39+
<differenceType>7005</differenceType>
40+
<className>com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStub</className>
41+
<method>*</method>
42+
<to>*</to>
43+
</difference>
3744
<difference>
3845
<!-- method name change is ok because EnhancedBigtableStub is InternalApi -->
3946
<differenceType>7002</differenceType>
@@ -504,4 +511,16 @@
504511
<className>com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants</className>
505512
<method>*</method>
506513
</difference>
514+
<difference>
515+
<!-- InternalApi was updated -->
516+
<differenceType>7004</differenceType>
517+
<className>com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings$InternalMetricsProvider</className>
518+
<method>*</method>
519+
</difference>
520+
<difference>
521+
<!-- InternalApi was updated -->
522+
<differenceType>7004</differenceType>
523+
<className>com/google/cloud/bigtable/data/v2/stub/metrics/Util</className>
524+
<method>*</method>
525+
</difference>
507526
</differences>

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import com.google.api.gax.batching.Batcher;
2626
import com.google.api.gax.grpc.GrpcCallContext;
2727
import com.google.api.gax.rpc.ApiExceptions;
28-
import com.google.api.gax.rpc.ClientContext;
2928
import com.google.api.gax.rpc.ResponseObserver;
3029
import com.google.api.gax.rpc.ServerStream;
3130
import com.google.api.gax.rpc.ServerStreamingCallable;
@@ -55,6 +54,7 @@
5554
import com.google.cloud.bigtable.data.v2.models.sql.PreparedStatement;
5655
import com.google.cloud.bigtable.data.v2.models.sql.ResultSet;
5756
import com.google.cloud.bigtable.data.v2.models.sql.SqlType;
57+
import com.google.cloud.bigtable.data.v2.stub.BigtableClientContext;
5858
import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStub;
5959
import com.google.cloud.bigtable.data.v2.stub.sql.SqlServerStream;
6060
import com.google.common.util.concurrent.MoreExecutors;
@@ -186,7 +186,7 @@ public static BigtableDataClient create(BigtableDataSettings settings) throws IO
186186
* BigtableDataClientFactory#close()} is called.
187187
*/
188188
static BigtableDataClient createWithClientContext(
189-
BigtableDataSettings settings, ClientContext context) throws IOException {
189+
BigtableDataSettings settings, BigtableClientContext context) throws IOException {
190190
EnhancedBigtableStub stub =
191191
EnhancedBigtableStub.createWithClientContext(settings.getStubSettings(), context);
192192
return new BigtableDataClient(stub);

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,8 @@ public BigtableDataClient createDefault() {
116116
sharedClientContext.getInternalOpenTelemtry()))
117117
.build();
118118

119-
return BigtableDataClient.createWithClientContext(defaultSettings, clientContext);
119+
return BigtableDataClient.createWithClientContext(
120+
defaultSettings, sharedClientContext.withClientContext(clientContext));
120121
} catch (IOException e) {
121122
// Should never happen because the connection has been established already
122123
throw new RuntimeException(
@@ -145,7 +146,8 @@ public BigtableDataClient createForAppProfile(@Nonnull String appProfileId) thro
145146
sharedClientContext.getOpenTelemetry(),
146147
sharedClientContext.getInternalOpenTelemtry()))
147148
.build();
148-
return BigtableDataClient.createWithClientContext(settings, clientContext);
149+
return BigtableDataClient.createWithClientContext(
150+
settings, sharedClientContext.withClientContext(clientContext));
149151
}
150152

151153
/**
@@ -175,7 +177,8 @@ public BigtableDataClient createForInstance(@Nonnull String projectId, @Nonnull
175177
sharedClientContext.getInternalOpenTelemtry()))
176178
.build();
177179

178-
return BigtableDataClient.createWithClientContext(settings, clientContext);
180+
return BigtableDataClient.createWithClientContext(
181+
settings, sharedClientContext.withClientContext(clientContext));
179182
}
180183

181184
/**
@@ -204,6 +207,7 @@ public BigtableDataClient createForInstance(
204207
sharedClientContext.getOpenTelemetry(),
205208
sharedClientContext.getInternalOpenTelemtry()))
206209
.build();
207-
return BigtableDataClient.createWithClientContext(settings, clientContext);
210+
return BigtableDataClient.createWithClientContext(
211+
settings, sharedClientContext.withClientContext(clientContext));
208212
}
209213
}

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.api.core.InternalApi;
2020
import com.google.api.gax.core.BackgroundResource;
2121
import com.google.api.gax.core.CredentialsProvider;
22+
import com.google.api.gax.core.ExecutorProvider;
2223
import com.google.api.gax.core.FixedCredentialsProvider;
2324
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
2425
import com.google.api.gax.rpc.ClientContext;
@@ -41,6 +42,7 @@
4142
import java.io.IOException;
4243
import java.net.URI;
4344
import java.net.URISyntaxException;
45+
import java.util.concurrent.ScheduledExecutorService;
4446
import java.util.logging.Level;
4547
import java.util.logging.Logger;
4648
import javax.annotation.Nullable;
@@ -58,6 +60,9 @@ public class BigtableClientContext {
5860
@Nullable private final OpenTelemetrySdk internalOpenTelemetry;
5961
private final MetricsProvider metricsProvider;
6062
private final ClientContext clientContext;
63+
// the background executor shared for OTEL instances and monitoring client and all other
64+
// background tasks
65+
private final ExecutorProvider backgroundExecutorProvider;
6166

6267
public static BigtableClientContext create(EnhancedBigtableStubSettings settings)
6368
throws IOException {
@@ -75,6 +80,14 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
7580

7681
String universeDomain = settings.getUniverseDomain();
7782

83+
boolean shouldAutoClose = settings.getBackgroundExecutorProvider().shouldAutoClose();
84+
ScheduledExecutorService backgroundExecutor =
85+
settings.getBackgroundExecutorProvider().getExecutor();
86+
// TODO: after gax change is merged, migrate to use gax's FixedExecutorProvider
87+
BigtableExecutorProvider executorProvider =
88+
BigtableExecutorProvider.create(backgroundExecutor, shouldAutoClose);
89+
builder.setBackgroundExecutorProvider(executorProvider);
90+
7891
// Set up OpenTelemetry
7992
OpenTelemetry openTelemetry = null;
8093
try {
@@ -85,7 +98,8 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
8598
settings.getMetricsProvider(),
8699
credentials,
87100
settings.getMetricsEndpoint(),
88-
universeDomain);
101+
universeDomain,
102+
backgroundExecutor);
89103
} catch (Throwable t) {
90104
logger.log(Level.WARNING, "Failed to get OTEL, will skip exporting client side metrics", t);
91105
}
@@ -103,7 +117,9 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
103117
// no reason to build the internal OtelProvider
104118
if (transportProvider != null) {
105119
internalOtel =
106-
settings.getInternalMetricsProvider().createOtelProvider(settings, credentials);
120+
settings
121+
.getInternalMetricsProvider()
122+
.createOtelProvider(settings, credentials, backgroundExecutor);
107123
if (internalOtel != null) {
108124
channelPoolMetricsTracer =
109125
new ChannelPoolMetricsTracer(
@@ -148,7 +164,11 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
148164
}
149165

150166
return new BigtableClientContext(
151-
clientContext, openTelemetry, internalOtel, settings.getMetricsProvider());
167+
clientContext,
168+
openTelemetry,
169+
internalOtel,
170+
settings.getMetricsProvider(),
171+
executorProvider);
152172
}
153173

154174
private static void configureGrpcOtel(
@@ -182,11 +202,13 @@ private BigtableClientContext(
182202
ClientContext clientContext,
183203
@Nullable OpenTelemetry openTelemetry,
184204
@Nullable OpenTelemetrySdk internalOtel,
185-
MetricsProvider metricsProvider) {
205+
MetricsProvider metricsProvider,
206+
ExecutorProvider backgroundExecutorProvider) {
186207
this.clientContext = clientContext;
187208
this.openTelemetry = openTelemetry;
188209
this.internalOpenTelemetry = internalOtel;
189210
this.metricsProvider = metricsProvider;
211+
this.backgroundExecutorProvider = backgroundExecutorProvider;
190212
}
191213

192214
public OpenTelemetry getOpenTelemetry() {
@@ -201,6 +223,15 @@ public ClientContext getClientContext() {
201223
return this.clientContext;
202224
}
203225

226+
public BigtableClientContext withClientContext(ClientContext clientContext) {
227+
return new BigtableClientContext(
228+
clientContext,
229+
openTelemetry,
230+
internalOpenTelemetry,
231+
metricsProvider,
232+
backgroundExecutorProvider);
233+
}
234+
204235
public void close() throws Exception {
205236
for (BackgroundResource resource : clientContext.getBackgroundResources()) {
206237
resource.close();
@@ -211,13 +242,17 @@ public void close() throws Exception {
211242
if (metricsProvider instanceof DefaultMetricsProvider && openTelemetry != null) {
212243
((OpenTelemetrySdk) openTelemetry).close();
213244
}
245+
if (backgroundExecutorProvider.shouldAutoClose()) {
246+
backgroundExecutorProvider.getExecutor().shutdown();
247+
}
214248
}
215249

216250
private static OpenTelemetry getOpenTelemetryFromMetricsProvider(
217251
MetricsProvider metricsProvider,
218252
@Nullable Credentials defaultCredentials,
219253
@Nullable String metricsEndpoint,
220-
String universeDomain)
254+
String universeDomain,
255+
ScheduledExecutorService executor)
221256
throws IOException {
222257
if (metricsProvider instanceof CustomOpenTelemetryMetricsProvider) {
223258
CustomOpenTelemetryMetricsProvider customMetricsProvider =
@@ -229,7 +264,8 @@ private static OpenTelemetry getOpenTelemetryFromMetricsProvider(
229264
? BigtableDataSettings.getMetricsCredentials()
230265
: defaultCredentials;
231266
DefaultMetricsProvider defaultMetricsProvider = (DefaultMetricsProvider) metricsProvider;
232-
return defaultMetricsProvider.getOpenTelemetry(metricsEndpoint, universeDomain, credentials);
267+
return defaultMetricsProvider.getOpenTelemetry(
268+
metricsEndpoint, universeDomain, credentials, executor);
233269
} else if (metricsProvider instanceof NoopMetricsProvider) {
234270
return null;
235271
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright 2025 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.google.cloud.bigtable.data.v2.stub;
17+
18+
import com.google.api.gax.core.ExecutorProvider;
19+
import java.util.concurrent.ScheduledExecutorService;
20+
21+
// TODO: migrate to gax's FixedExecutorProvider once the change is merged
22+
class BigtableExecutorProvider implements ExecutorProvider {
23+
24+
private final ScheduledExecutorService executorService;
25+
private final boolean shouldAutoClose;
26+
27+
@Override
28+
public boolean shouldAutoClose() {
29+
return shouldAutoClose;
30+
}
31+
32+
@Override
33+
public ScheduledExecutorService getExecutor() {
34+
return executorService;
35+
}
36+
37+
static BigtableExecutorProvider create(
38+
ScheduledExecutorService executor, boolean shouldAutoClose) {
39+
return new BigtableExecutorProvider(executor, shouldAutoClose);
40+
}
41+
42+
private BigtableExecutorProvider(
43+
ScheduledExecutorService executorService, boolean shouldAutoClose) {
44+
this.shouldAutoClose = shouldAutoClose;
45+
this.executorService = executorService;
46+
}
47+
}

0 commit comments

Comments
 (0)