2424import com .google .api .gax .core .FixedExecutorProvider ;
2525import com .google .api .gax .grpc .InstantiatingGrpcChannelProvider ;
2626import com .google .api .gax .rpc .ClientContext ;
27+ import com .google .api .gax .tracing .ApiTracerFactory ;
2728import com .google .auth .Credentials ;
2829import com .google .auth .oauth2 .ServiceAccountJwtAccessCredentials ;
2930import com .google .bigtable .v2 .InstanceName ;
3031import com .google .cloud .bigtable .data .v2 .internal .JwtCredentialsWithAudience ;
3132import com .google .cloud .bigtable .data .v2 .stub .metrics .BuiltinMetricsConstants ;
3233import com .google .cloud .bigtable .data .v2 .stub .metrics .ChannelPoolMetricsTracer ;
34+ import com .google .cloud .bigtable .data .v2 .stub .metrics .CompositeTracerFactory ;
3335import com .google .cloud .bigtable .data .v2 .stub .metrics .CustomOpenTelemetryMetricsProvider ;
3436import com .google .cloud .bigtable .data .v2 .stub .metrics .Util ;
3537import com .google .cloud .bigtable .gaxx .grpc .BigtableTransportChannelProvider ;
3638import com .google .cloud .bigtable .gaxx .grpc .ChannelPrimer ;
39+ import com .google .common .collect .ImmutableList ;
3740import io .grpc .ManagedChannelBuilder ;
3841import 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 ;
3946import io .opentelemetry .api .OpenTelemetry ;
4047import io .opentelemetry .sdk .OpenTelemetrySdk ;
4148import 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