Skip to content

Commit e67d869

Browse files
chore: move tracer creation to bigtable client context (#2797)
- BigtableClientContext stores the resource anchor (instance name/app profile) - BigtableClientContext stores the opencensus deps - This allows it to create all of the tracers during initialization - BigtableClientContext can create lightweight copies of itself for BigtableDataClientFactory - close logic of shared contexts is now stored in BigtableClientContext via isChild
1 parent 99b1412 commit e67d869

File tree

7 files changed

+205
-230
lines changed

7 files changed

+205
-230
lines changed

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,7 @@ public static BigtableDataClient create(BigtableDataSettings settings) throws IO
187187
*/
188188
static BigtableDataClient createWithClientContext(
189189
BigtableDataSettings settings, BigtableClientContext context) throws IOException {
190-
EnhancedBigtableStub stub =
191-
EnhancedBigtableStub.createWithClientContext(settings.getStubSettings(), context);
190+
EnhancedBigtableStub stub = new EnhancedBigtableStub(settings.getStubSettings(), context);
192191
return new BigtableDataClient(stub);
193192
}
194193

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

Lines changed: 22 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
package com.google.cloud.bigtable.data.v2;
1717

1818
import com.google.api.core.BetaApi;
19-
import com.google.api.gax.rpc.ClientContext;
19+
import com.google.bigtable.v2.InstanceName;
2020
import com.google.cloud.bigtable.data.v2.stub.BigtableClientContext;
21-
import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStub;
2221
import java.io.IOException;
2322
import javax.annotation.Nonnull;
2423

@@ -75,8 +74,7 @@ public final class BigtableDataClientFactory implements AutoCloseable {
7574
public static BigtableDataClientFactory create(BigtableDataSettings defaultSettings)
7675
throws IOException {
7776
BigtableClientContext sharedClientContext =
78-
EnhancedBigtableStub.createBigtableClientContext(defaultSettings.getStubSettings());
79-
77+
BigtableClientContext.create(defaultSettings.getStubSettings());
8078
return new BigtableDataClientFactory(sharedClientContext, defaultSettings);
8179
}
8280

@@ -107,17 +105,11 @@ public void close() throws Exception {
107105
*/
108106
public BigtableDataClient createDefault() {
109107
try {
110-
ClientContext clientContext =
111-
sharedClientContext.getClientContext().toBuilder()
112-
.setTracerFactory(
113-
EnhancedBigtableStub.createBigtableTracerFactory(
114-
defaultSettings.getStubSettings(),
115-
sharedClientContext.getBuiltinOpenTelemetry(),
116-
sharedClientContext.getUserOpenTelemetry()))
117-
.build();
108+
BigtableClientContext ctx =
109+
sharedClientContext.createChild(
110+
sharedClientContext.getInstanceName(), sharedClientContext.getAppProfileId());
118111

119-
return BigtableDataClient.createWithClientContext(
120-
defaultSettings, sharedClientContext.withClientContext(clientContext));
112+
return BigtableDataClient.createWithClientContext(defaultSettings, ctx);
121113
} catch (IOException e) {
122114
// Should never happen because the connection has been established already
123115
throw new RuntimeException(
@@ -137,17 +129,12 @@ public BigtableDataClient createDefault() {
137129
public BigtableDataClient createForAppProfile(@Nonnull String appProfileId) throws IOException {
138130
BigtableDataSettings settings =
139131
defaultSettings.toBuilder().setAppProfileId(appProfileId).build();
132+
BigtableClientContext ctx =
133+
sharedClientContext.createChild(
134+
InstanceName.of(settings.getProjectId(), settings.getInstanceId()),
135+
settings.getAppProfileId());
140136

141-
ClientContext clientContext =
142-
sharedClientContext.getClientContext().toBuilder()
143-
.setTracerFactory(
144-
EnhancedBigtableStub.createBigtableTracerFactory(
145-
settings.getStubSettings(),
146-
sharedClientContext.getBuiltinOpenTelemetry(),
147-
sharedClientContext.getUserOpenTelemetry()))
148-
.build();
149-
return BigtableDataClient.createWithClientContext(
150-
settings, sharedClientContext.withClientContext(clientContext));
137+
return BigtableDataClient.createWithClientContext(settings, ctx);
151138
}
152139

153140
/**
@@ -167,18 +154,12 @@ public BigtableDataClient createForInstance(@Nonnull String projectId, @Nonnull
167154
.setInstanceId(instanceId)
168155
.setDefaultAppProfileId()
169156
.build();
157+
BigtableClientContext ctx =
158+
sharedClientContext.createChild(
159+
InstanceName.of(settings.getProjectId(), settings.getInstanceId()),
160+
settings.getAppProfileId());
170161

171-
ClientContext clientContext =
172-
sharedClientContext.getClientContext().toBuilder()
173-
.setTracerFactory(
174-
EnhancedBigtableStub.createBigtableTracerFactory(
175-
settings.getStubSettings(),
176-
sharedClientContext.getBuiltinOpenTelemetry(),
177-
sharedClientContext.getUserOpenTelemetry()))
178-
.build();
179-
180-
return BigtableDataClient.createWithClientContext(
181-
settings, sharedClientContext.withClientContext(clientContext));
162+
return BigtableDataClient.createWithClientContext(settings, ctx);
182163
}
183164

184165
/**
@@ -199,15 +180,11 @@ public BigtableDataClient createForInstance(
199180
.setInstanceId(instanceId)
200181
.setAppProfileId(appProfileId)
201182
.build();
202-
ClientContext clientContext =
203-
sharedClientContext.getClientContext().toBuilder()
204-
.setTracerFactory(
205-
EnhancedBigtableStub.createBigtableTracerFactory(
206-
settings.getStubSettings(),
207-
sharedClientContext.getBuiltinOpenTelemetry(),
208-
sharedClientContext.getUserOpenTelemetry()))
209-
.build();
210-
return BigtableDataClient.createWithClientContext(
211-
settings, sharedClientContext.withClientContext(clientContext));
183+
BigtableClientContext ctx =
184+
sharedClientContext.createChild(
185+
InstanceName.of(settings.getProjectId(), settings.getInstanceId()),
186+
settings.getAppProfileId());
187+
188+
return BigtableDataClient.createWithClientContext(settings, ctx);
212189
}
213190
}

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

Lines changed: 96 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,25 @@
2424
import com.google.api.gax.core.FixedExecutorProvider;
2525
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
2626
import com.google.api.gax.rpc.ClientContext;
27+
import com.google.api.gax.tracing.ApiTracerFactory;
2728
import com.google.auth.Credentials;
2829
import com.google.auth.oauth2.ServiceAccountJwtAccessCredentials;
2930
import com.google.bigtable.v2.InstanceName;
3031
import com.google.cloud.bigtable.data.v2.internal.JwtCredentialsWithAudience;
3132
import com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants;
3233
import com.google.cloud.bigtable.data.v2.stub.metrics.ChannelPoolMetricsTracer;
34+
import com.google.cloud.bigtable.data.v2.stub.metrics.CompositeTracerFactory;
3335
import com.google.cloud.bigtable.data.v2.stub.metrics.CustomOpenTelemetryMetricsProvider;
3436
import com.google.cloud.bigtable.data.v2.stub.metrics.Util;
3537
import com.google.cloud.bigtable.gaxx.grpc.BigtableTransportChannelProvider;
3638
import com.google.cloud.bigtable.gaxx.grpc.ChannelPrimer;
39+
import com.google.common.collect.ImmutableList;
3740
import io.grpc.ManagedChannelBuilder;
3841
import io.grpc.opentelemetry.GrpcOpenTelemetry;
42+
import io.opencensus.stats.Stats;
43+
import io.opencensus.stats.StatsRecorder;
44+
import io.opencensus.tags.Tagger;
45+
import io.opencensus.tags.Tags;
3946
import io.opentelemetry.api.OpenTelemetry;
4047
import io.opentelemetry.sdk.OpenTelemetrySdk;
4148
import java.io.IOException;
@@ -55,15 +62,30 @@ public class BigtableClientContext {
5562

5663
private static final Logger logger = Logger.getLogger(BigtableClientContext.class.getName());
5764

65+
private final boolean isChild;
66+
private final InstanceName instanceName;
67+
private final String appProfileId;
68+
private final ApiTracerFactory userTracerFactory;
5869
@Nullable private final OpenTelemetrySdk builtinOpenTelemetry;
5970
@Nullable private final OpenTelemetry userOpenTelemetry;
6071
private final ClientContext clientContext;
6172
// the background executor shared for OTEL instances and monitoring client and all other
6273
// background tasks
6374
private final ExecutorProvider backgroundExecutorProvider;
75+
private final Tagger ocTagger;
76+
private final StatsRecorder ocRecorder;
6477

6578
public static BigtableClientContext create(EnhancedBigtableStubSettings settings)
6679
throws IOException {
80+
return create(settings, Tags.getTagger(), Stats.getStatsRecorder());
81+
}
82+
83+
public static BigtableClientContext create(
84+
EnhancedBigtableStubSettings settings, Tagger ocTagger, StatsRecorder ocRecorder)
85+
throws IOException {
86+
InstanceName instanceName = InstanceName.of(settings.getProjectId(), settings.getInstanceId());
87+
String appProfileId = settings.getAppProfileId();
88+
6789
EnhancedBigtableStubSettings.Builder builder = settings.toBuilder();
6890

6991
// Set up credentials
@@ -85,6 +107,8 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
85107
FixedExecutorProvider.create(backgroundExecutor, shouldAutoClose);
86108
builder.setBackgroundExecutorProvider(executorProvider);
87109

110+
ApiTracerFactory userTracerFactory = settings.getTracerFactory();
111+
88112
// Set up OpenTelemetry
89113
@Nullable OpenTelemetry userOtel = null;
90114
if (settings.getMetricsProvider() instanceof CustomOpenTelemetryMetricsProvider) {
@@ -158,7 +182,17 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
158182
channelPoolMetricsTracer.start(clientContext.getExecutor());
159183
}
160184

161-
return new BigtableClientContext(clientContext, builtinOtel, userOtel, executorProvider);
185+
return new BigtableClientContext(
186+
false,
187+
instanceName,
188+
appProfileId,
189+
clientContext,
190+
userTracerFactory,
191+
builtinOtel,
192+
userOtel,
193+
ocTagger,
194+
ocRecorder,
195+
executorProvider);
162196
}
163197

164198
private static void configureGrpcOtel(
@@ -189,14 +223,53 @@ private static void configureGrpcOtel(
189223
}
190224

191225
private BigtableClientContext(
226+
boolean isChild,
227+
InstanceName instanceName,
228+
String appProfileId,
192229
ClientContext clientContext,
193-
@Nullable OpenTelemetrySdk internalOtel,
194-
@Nullable OpenTelemetry userOpenTelemetry,
195-
ExecutorProvider backgroundExecutorProvider) {
196-
this.clientContext = clientContext;
197-
this.userOpenTelemetry = userOpenTelemetry;
198-
this.builtinOpenTelemetry = internalOtel;
230+
ApiTracerFactory userTracerFactory,
231+
@Nullable OpenTelemetrySdk builtinOtel,
232+
@Nullable OpenTelemetry userOtel,
233+
Tagger ocTagger,
234+
StatsRecorder ocRecorder,
235+
ExecutorProvider backgroundExecutorProvider)
236+
throws IOException {
237+
this.isChild = isChild;
238+
this.instanceName = instanceName;
239+
this.appProfileId = appProfileId;
240+
241+
this.userTracerFactory = userTracerFactory;
242+
this.builtinOpenTelemetry = builtinOtel;
243+
this.userOpenTelemetry = userOtel;
244+
this.ocTagger = ocTagger;
245+
this.ocRecorder = ocRecorder;
199246
this.backgroundExecutorProvider = backgroundExecutorProvider;
247+
248+
ImmutableList.Builder<ApiTracerFactory> tracerFactories = ImmutableList.builder();
249+
tracerFactories
250+
.add(Util.createOCTracingFactory(instanceName, appProfileId))
251+
.add(Util.createOCMetricsFactory(instanceName, appProfileId, ocTagger, ocRecorder))
252+
.add(userTracerFactory);
253+
254+
if (builtinOtel != null) {
255+
tracerFactories.add(Util.createOtelMetricsFactory(builtinOtel, instanceName, appProfileId));
256+
}
257+
if (userOtel != null) {
258+
tracerFactories.add(Util.createOtelMetricsFactory(userOtel, instanceName, appProfileId));
259+
}
260+
261+
this.clientContext =
262+
clientContext.toBuilder()
263+
.setTracerFactory(new CompositeTracerFactory(tracerFactories.build()))
264+
.build();
265+
}
266+
267+
public InstanceName getInstanceName() {
268+
return instanceName;
269+
}
270+
271+
public String getAppProfileId() {
272+
return appProfileId;
200273
}
201274

202275
@Nullable
@@ -213,12 +286,26 @@ public ClientContext getClientContext() {
213286
return this.clientContext;
214287
}
215288

216-
public BigtableClientContext withClientContext(ClientContext clientContext) {
289+
public BigtableClientContext createChild(InstanceName instanceName, String appProfileId)
290+
throws IOException {
217291
return new BigtableClientContext(
218-
clientContext, builtinOpenTelemetry, userOpenTelemetry, backgroundExecutorProvider);
292+
true,
293+
instanceName,
294+
appProfileId,
295+
clientContext,
296+
userTracerFactory,
297+
builtinOpenTelemetry,
298+
userOpenTelemetry,
299+
ocTagger,
300+
ocRecorder,
301+
backgroundExecutorProvider);
219302
}
220303

221304
public void close() throws Exception {
305+
if (isChild) {
306+
return;
307+
}
308+
222309
for (BackgroundResource resource : clientContext.getBackgroundResources()) {
223310
resource.close();
224311
}

0 commit comments

Comments
 (0)