2626import com .google .api .gax .rpc .ClientContext ;
2727import com .google .auth .Credentials ;
2828import com .google .auth .oauth2 .ServiceAccountJwtAccessCredentials ;
29- import com .google .cloud . bigtable .data . v2 .BigtableDataSettings ;
29+ import com .google .bigtable .v2 .InstanceName ;
3030import com .google .cloud .bigtable .data .v2 .internal .JwtCredentialsWithAudience ;
3131import com .google .cloud .bigtable .data .v2 .stub .metrics .BuiltinMetricsConstants ;
3232import com .google .cloud .bigtable .data .v2 .stub .metrics .ChannelPoolMetricsTracer ;
3333import com .google .cloud .bigtable .data .v2 .stub .metrics .CustomOpenTelemetryMetricsProvider ;
34- import com .google .cloud .bigtable .data .v2 .stub .metrics .DefaultMetricsProvider ;
35- import com .google .cloud .bigtable .data .v2 .stub .metrics .MetricsProvider ;
36- import com .google .cloud .bigtable .data .v2 .stub .metrics .NoopMetricsProvider ;
34+ import com .google .cloud .bigtable .data .v2 .stub .metrics .Util ;
3735import com .google .cloud .bigtable .gaxx .grpc .BigtableTransportChannelProvider ;
3836import com .google .cloud .bigtable .gaxx .grpc .ChannelPrimer ;
3937import io .grpc .ManagedChannelBuilder ;
@@ -57,9 +55,8 @@ public class BigtableClientContext {
5755
5856 private static final Logger logger = Logger .getLogger (BigtableClientContext .class .getName ());
5957
60- @ Nullable private final OpenTelemetry openTelemetry ;
61- @ Nullable private final OpenTelemetrySdk internalOpenTelemetry ;
62- private final MetricsProvider metricsProvider ;
58+ @ Nullable private final OpenTelemetrySdk builtinOpenTelemetry ;
59+ @ Nullable private final OpenTelemetry userOpenTelemetry ;
6360 private final ClientContext clientContext ;
6461 // the background executor shared for OTEL instances and monitoring client and all other
6562 // background tasks
@@ -89,17 +86,24 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
8986 builder .setBackgroundExecutorProvider (executorProvider );
9087
9188 // Set up OpenTelemetry
92- OpenTelemetry openTelemetry = null ;
89+ @ Nullable OpenTelemetry userOtel = null ;
90+ if (settings .getMetricsProvider () instanceof CustomOpenTelemetryMetricsProvider ) {
91+ userOtel =
92+ ((CustomOpenTelemetryMetricsProvider ) settings .getMetricsProvider ()).getOpenTelemetry ();
93+ }
94+
95+ @ Nullable OpenTelemetrySdk builtinOtel = null ;
9396 try {
94- // We don't want client side metrics to crash the client, so catch any exception when getting
95- // the OTEL instance and log the exception instead.
96- openTelemetry =
97- getOpenTelemetryFromMetricsProvider (
98- settings .getMetricsProvider (),
99- credentials ,
100- settings .getMetricsEndpoint (),
101- universeDomain ,
102- backgroundExecutor );
97+ if (settings .areInternalMetricsEnabled ()) {
98+ builtinOtel =
99+ Util .createBuiltinOtel (
100+ InstanceName .of (settings .getProjectId (), settings .getInstanceId ()),
101+ settings .getAppProfileId (),
102+ credentials ,
103+ settings .getMetricsEndpoint (),
104+ universeDomain ,
105+ backgroundExecutor );
106+ }
103107 } catch (Throwable t ) {
104108 logger .log (Level .WARNING , "Failed to get OTEL, will skip exporting client side metrics" , t );
105109 }
@@ -110,21 +114,16 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
110114 ? ((InstantiatingGrpcChannelProvider ) builder .getTransportChannelProvider ()).toBuilder ()
111115 : null ;
112116
113- @ Nullable OpenTelemetrySdk internalOtel = null ;
114117 @ Nullable ChannelPoolMetricsTracer channelPoolMetricsTracer = null ;
115118 // Internal metrics are scoped to the connections, so we need a mutable transportProvider,
116119 // otherwise there is
117120 // no reason to build the internal OtelProvider
118121 if (transportProvider != null ) {
119- internalOtel =
120- settings
121- .getInternalMetricsProvider ()
122- .createOtelProvider (settings , credentials , backgroundExecutor );
123- if (internalOtel != null ) {
124- channelPoolMetricsTracer = new ChannelPoolMetricsTracer (internalOtel );
122+ if (builtinOtel != null ) {
123+ channelPoolMetricsTracer = new ChannelPoolMetricsTracer (builtinOtel );
125124
126125 // Configure grpc metrics
127- configureGrpcOtel (transportProvider , internalOtel );
126+ configureGrpcOtel (transportProvider , builtinOtel );
128127 }
129128 }
130129
@@ -149,7 +148,7 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
149148
150149 BigtableTransportChannelProvider btTransportProvider =
151150 BigtableTransportChannelProvider .create (
152- ( InstantiatingGrpcChannelProvider ) transportProvider .build (),
151+ transportProvider .build (),
153152 channelPrimer ,
154153 channelPoolMetricsTracer ,
155154 backgroundExecutor );
@@ -162,12 +161,7 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings
162161 channelPoolMetricsTracer .start (clientContext .getExecutor ());
163162 }
164163
165- return new BigtableClientContext (
166- clientContext ,
167- openTelemetry ,
168- internalOtel ,
169- settings .getMetricsProvider (),
170- executorProvider );
164+ return new BigtableClientContext (clientContext , builtinOtel , userOtel , executorProvider );
171165 }
172166
173167 private static void configureGrpcOtel (
@@ -199,19 +193,23 @@ private static void configureGrpcOtel(
199193
200194 private BigtableClientContext (
201195 ClientContext clientContext ,
202- @ Nullable OpenTelemetry openTelemetry ,
203196 @ Nullable OpenTelemetrySdk internalOtel ,
204- MetricsProvider metricsProvider ,
197+ @ Nullable OpenTelemetry userOpenTelemetry ,
205198 ExecutorProvider backgroundExecutorProvider ) {
206199 this .clientContext = clientContext ;
207- this .openTelemetry = openTelemetry ;
208- this .internalOpenTelemetry = internalOtel ;
209- this .metricsProvider = metricsProvider ;
200+ this .userOpenTelemetry = userOpenTelemetry ;
201+ this .builtinOpenTelemetry = internalOtel ;
210202 this .backgroundExecutorProvider = backgroundExecutorProvider ;
211203 }
212204
213- public OpenTelemetry getOpenTelemetry () {
214- return this .openTelemetry ;
205+ @ Nullable
206+ public OpenTelemetrySdk getBuiltinOpenTelemetry () {
207+ return builtinOpenTelemetry ;
208+ }
209+
210+ @ Nullable
211+ public OpenTelemetry getUserOpenTelemetry () {
212+ return this .userOpenTelemetry ;
215213 }
216214
217215 public ClientContext getClientContext () {
@@ -220,53 +218,24 @@ public ClientContext getClientContext() {
220218
221219 public BigtableClientContext withClientContext (ClientContext clientContext ) {
222220 return new BigtableClientContext (
223- clientContext ,
224- openTelemetry ,
225- internalOpenTelemetry ,
226- metricsProvider ,
227- backgroundExecutorProvider );
221+ clientContext , builtinOpenTelemetry , userOpenTelemetry , backgroundExecutorProvider );
228222 }
229223
230224 public void close () throws Exception {
231225 for (BackgroundResource resource : clientContext .getBackgroundResources ()) {
232226 resource .close ();
233227 }
234- if (internalOpenTelemetry != null ) {
235- internalOpenTelemetry .close ();
228+ if (builtinOpenTelemetry != null ) {
229+ builtinOpenTelemetry .close ();
236230 }
237- if (metricsProvider instanceof DefaultMetricsProvider && openTelemetry != null ) {
238- (( OpenTelemetrySdk ) openTelemetry ) .close ();
231+ if (builtinOpenTelemetry != null ) {
232+ builtinOpenTelemetry .close ();
239233 }
240234 if (backgroundExecutorProvider .shouldAutoClose ()) {
241235 backgroundExecutorProvider .getExecutor ().shutdown ();
242236 }
243237 }
244238
245- private static OpenTelemetry getOpenTelemetryFromMetricsProvider (
246- MetricsProvider metricsProvider ,
247- @ Nullable Credentials defaultCredentials ,
248- @ Nullable String metricsEndpoint ,
249- String universeDomain ,
250- ScheduledExecutorService executor )
251- throws IOException {
252- if (metricsProvider instanceof CustomOpenTelemetryMetricsProvider ) {
253- CustomOpenTelemetryMetricsProvider customMetricsProvider =
254- (CustomOpenTelemetryMetricsProvider ) metricsProvider ;
255- return customMetricsProvider .getOpenTelemetry ();
256- } else if (metricsProvider instanceof DefaultMetricsProvider ) {
257- Credentials credentials =
258- BigtableDataSettings .getMetricsCredentials () != null
259- ? BigtableDataSettings .getMetricsCredentials ()
260- : defaultCredentials ;
261- DefaultMetricsProvider defaultMetricsProvider = (DefaultMetricsProvider ) metricsProvider ;
262- return defaultMetricsProvider .getOpenTelemetry (
263- metricsEndpoint , universeDomain , credentials , executor );
264- } else if (metricsProvider instanceof NoopMetricsProvider ) {
265- return null ;
266- }
267- throw new IOException ("Invalid MetricsProvider type " + metricsProvider );
268- }
269-
270239 private static void patchCredentials (EnhancedBigtableStubSettings .Builder settings )
271240 throws IOException {
272241 String audience = settings .getJwtAudience ();
0 commit comments