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 ) {
@@ -128,10 +152,7 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
128152 }
129153
130154 if (transportProvider != null ) {
131- // Set up cookie holder if routing cookie is enabled
132- if (builder .getEnableRoutingCookie ()) {
133- setupCookieHolder (transportProvider );
134- }
155+ setupCookieHolder (transportProvider );
135156
136157 ChannelPrimer channelPrimer = NoOpChannelPrimer .create ();
137158
@@ -161,7 +182,17 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
161182 channelPoolMetricsTracer .start (clientContext .getExecutor ());
162183 }
163184
164- 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 );
165196 }
166197
167198 private static void configureGrpcOtel (
@@ -192,14 +223,53 @@ private static void configureGrpcOtel(
192223 }
193224
194225 private BigtableClientContext (
226+ boolean isChild ,
227+ InstanceName instanceName ,
228+ String appProfileId ,
195229 ClientContext clientContext ,
196- @ Nullable OpenTelemetrySdk internalOtel ,
197- @ Nullable OpenTelemetry userOpenTelemetry ,
198- ExecutorProvider backgroundExecutorProvider ) {
199- this .clientContext = clientContext ;
200- this .userOpenTelemetry = userOpenTelemetry ;
201- 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 ;
202246 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 ;
203273 }
204274
205275 @ Nullable
@@ -216,12 +286,26 @@ public ClientContext getClientContext() {
216286 return this .clientContext ;
217287 }
218288
219- public BigtableClientContext withClientContext (ClientContext clientContext ) {
289+ public BigtableClientContext createChild (InstanceName instanceName , String appProfileId )
290+ throws IOException {
220291 return new BigtableClientContext (
221- clientContext , builtinOpenTelemetry , userOpenTelemetry , backgroundExecutorProvider );
292+ true ,
293+ instanceName ,
294+ appProfileId ,
295+ clientContext ,
296+ userTracerFactory ,
297+ builtinOpenTelemetry ,
298+ userOpenTelemetry ,
299+ ocTagger ,
300+ ocRecorder ,
301+ backgroundExecutorProvider );
222302 }
223303
224304 public void close () throws Exception {
305+ if (isChild ) {
306+ return ;
307+ }
308+
225309 for (BackgroundResource resource : clientContext .getBackgroundResources ()) {
226310 resource .close ();
227311 }
0 commit comments