Skip to content

Commit cd3467c

Browse files
authored
feat: migrate per connection error count metric to otel (#2133)
* feat: migrate per connection error count metric to otel * update test * address comments * remove unnecessary check * clean up statsRecorder * remove dependency * address comments
1 parent 65493e7 commit cd3467c

13 files changed

+285
-146
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,10 @@
186186
<className>com/google/cloud/bigtable/data/v2/models/MutateRowsException</className>
187187
<method>*</method>
188188
</difference>
189+
<!-- InternalApi was updated -->
190+
<difference>
191+
<differenceType>7004</differenceType>
192+
<className>com/google/cloud/bigtable/data/v2/stub/metrics/ErrorCountPerConnectionMetricTracker</className>
193+
<method>*</method>
194+
</difference>
189195
</differences>

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

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.google.api.gax.core.BackgroundResource;
2020
import com.google.api.gax.rpc.ClientContext;
2121
import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStub;
22+
import io.opentelemetry.api.OpenTelemetry;
2223
import java.io.IOException;
2324
import javax.annotation.Nonnull;
2425

@@ -64,6 +65,7 @@
6465
public final class BigtableDataClientFactory implements AutoCloseable {
6566
private final BigtableDataSettings defaultSettings;
6667
private final ClientContext sharedClientContext;
68+
private final OpenTelemetry openTelemetry;
6769

6870
/**
6971
* Create a instance of this factory.
@@ -75,13 +77,21 @@ public static BigtableDataClientFactory create(BigtableDataSettings defaultSetti
7577
throws IOException {
7678
ClientContext sharedClientContext =
7779
EnhancedBigtableStub.createClientContext(defaultSettings.getStubSettings());
78-
return new BigtableDataClientFactory(sharedClientContext, defaultSettings);
80+
OpenTelemetry openTelemetry =
81+
EnhancedBigtableStub.getOpenTelemetry(
82+
defaultSettings.getProjectId(),
83+
defaultSettings.getMetricsProvider(),
84+
sharedClientContext.getCredentials());
85+
return new BigtableDataClientFactory(sharedClientContext, defaultSettings, openTelemetry);
7986
}
8087

8188
private BigtableDataClientFactory(
82-
ClientContext sharedClientContext, BigtableDataSettings defaultSettings) {
89+
ClientContext sharedClientContext,
90+
BigtableDataSettings defaultSettings,
91+
OpenTelemetry openTelemetry) {
8392
this.sharedClientContext = sharedClientContext;
8493
this.defaultSettings = defaultSettings;
94+
this.openTelemetry = openTelemetry;
8595
}
8696

8797
/**
@@ -112,7 +122,7 @@ public BigtableDataClient createDefault() {
112122
.toBuilder()
113123
.setTracerFactory(
114124
EnhancedBigtableStub.createBigtableTracerFactory(
115-
defaultSettings.getStubSettings(), sharedClientContext))
125+
defaultSettings.getStubSettings(), openTelemetry))
116126
.build();
117127

118128
return BigtableDataClient.createWithClientContext(defaultSettings, clientContext);
@@ -141,7 +151,7 @@ public BigtableDataClient createForAppProfile(@Nonnull String appProfileId) thro
141151
.toBuilder()
142152
.setTracerFactory(
143153
EnhancedBigtableStub.createBigtableTracerFactory(
144-
settings.getStubSettings(), sharedClientContext))
154+
settings.getStubSettings(), openTelemetry))
145155
.build();
146156
return BigtableDataClient.createWithClientContext(settings, clientContext);
147157
}
@@ -170,7 +180,7 @@ public BigtableDataClient createForInstance(@Nonnull String projectId, @Nonnull
170180
.toBuilder()
171181
.setTracerFactory(
172182
EnhancedBigtableStub.createBigtableTracerFactory(
173-
settings.getStubSettings(), sharedClientContext))
183+
settings.getStubSettings(), openTelemetry))
174184
.build();
175185

176186
return BigtableDataClient.createWithClientContext(settings, clientContext);
@@ -200,7 +210,7 @@ public BigtableDataClient createForInstance(
200210
.toBuilder()
201211
.setTracerFactory(
202212
EnhancedBigtableStub.createBigtableTracerFactory(
203-
settings.getStubSettings(), sharedClientContext))
213+
settings.getStubSettings(), openTelemetry))
204214
.build();
205215
return BigtableDataClient.createWithClientContext(settings, clientContext);
206216
}

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

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

1818
import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.APP_PROFILE_KEY;
19+
import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CLIENT_NAME_KEY;
1920
import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.INSTANCE_ID_KEY;
2021
import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.PROJECT_ID_KEY;
2122

@@ -99,12 +100,11 @@
99100
import com.google.cloud.bigtable.data.v2.stub.metrics.BigtableTracerStreamingCallable;
100101
import com.google.cloud.bigtable.data.v2.stub.metrics.BigtableTracerUnaryCallable;
101102
import com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsTracerFactory;
102-
import com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsView;
103103
import com.google.cloud.bigtable.data.v2.stub.metrics.CompositeTracerFactory;
104104
import com.google.cloud.bigtable.data.v2.stub.metrics.CustomOpenTelemetryMetricsProvider;
105105
import com.google.cloud.bigtable.data.v2.stub.metrics.DefaultMetricsProvider;
106-
import com.google.cloud.bigtable.data.v2.stub.metrics.MetricsProvider;
107106
import com.google.cloud.bigtable.data.v2.stub.metrics.ErrorCountPerConnectionMetricTracker;
107+
import com.google.cloud.bigtable.data.v2.stub.metrics.MetricsProvider;
108108
import com.google.cloud.bigtable.data.v2.stub.metrics.MetricsTracerFactory;
109109
import com.google.cloud.bigtable.data.v2.stub.metrics.NoopMetricsProvider;
110110
import com.google.cloud.bigtable.data.v2.stub.metrics.RpcMeasureConstants;
@@ -138,9 +138,6 @@
138138
import io.opencensus.tags.Tags;
139139
import io.opentelemetry.api.OpenTelemetry;
140140
import io.opentelemetry.api.common.Attributes;
141-
import io.opentelemetry.sdk.OpenTelemetrySdk;
142-
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
143-
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
144141
import java.io.IOException;
145142
import java.net.URI;
146143
import java.net.URISyntaxException;
@@ -194,10 +191,13 @@ public class EnhancedBigtableStub implements AutoCloseable {
194191
public static EnhancedBigtableStub create(EnhancedBigtableStubSettings settings)
195192
throws IOException {
196193
ClientContext clientContext = createClientContext(settings);
194+
OpenTelemetry openTelemetry =
195+
getOpenTelemetry(
196+
settings.getProjectId(), settings.getMetricsProvider(), clientContext.getCredentials());
197197
ClientContext contextWithTracer =
198198
clientContext
199199
.toBuilder()
200-
.setTracerFactory(createBigtableTracerFactory(settings, clientContext))
200+
.setTracerFactory(createBigtableTracerFactory(settings, openTelemetry))
201201
.build();
202202

203203
return new EnhancedBigtableStub(settings, contextWithTracer);
@@ -219,15 +219,26 @@ public static ClientContext createClientContext(EnhancedBigtableStubSettings set
219219
// workaround JWT audience issues
220220
patchCredentials(builder);
221221

222+
// Fix the credentials so that they can be shared
223+
Credentials credentials = null;
224+
if (builder.getCredentialsProvider() != null) {
225+
credentials = builder.getCredentialsProvider().getCredentials();
226+
}
227+
builder.setCredentialsProvider(FixedCredentialsProvider.create(credentials));
228+
222229
InstantiatingGrpcChannelProvider.Builder transportProvider =
223230
builder.getTransportChannelProvider() instanceof InstantiatingGrpcChannelProvider
224231
? ((InstantiatingGrpcChannelProvider) builder.getTransportChannelProvider()).toBuilder()
225232
: null;
226233

234+
OpenTelemetry openTelemetry =
235+
getOpenTelemetry(settings.getProjectId(), settings.getMetricsProvider(), credentials);
227236
ErrorCountPerConnectionMetricTracker errorCountPerConnectionMetricTracker;
228-
if (transportProvider != null) {
237+
// Skip setting up ErrorCountPerConnectionMetricTracker if openTelemetry is null
238+
if (openTelemetry != null && transportProvider != null) {
229239
errorCountPerConnectionMetricTracker =
230-
new ErrorCountPerConnectionMetricTracker(createBuiltinAttributes(builder));
240+
new ErrorCountPerConnectionMetricTracker(
241+
openTelemetry, createBuiltinAttributes(settings));
231242
ApiFunction<ManagedChannelBuilder, ManagedChannelBuilder> oldChannelConfigurator =
232243
transportProvider.getChannelConfigurator();
233244
transportProvider.setChannelConfigurator(
@@ -249,12 +260,6 @@ public static ClientContext createClientContext(EnhancedBigtableStubSettings set
249260

250261
// Inject channel priming
251262
if (settings.isRefreshingChannel()) {
252-
// Fix the credentials so that they can be shared
253-
Credentials credentials = null;
254-
if (builder.getCredentialsProvider() != null) {
255-
credentials = builder.getCredentialsProvider().getCredentials();
256-
}
257-
builder.setCredentialsProvider(FixedCredentialsProvider.create(credentials));
258263

259264
if (transportProvider != null) {
260265
transportProvider.setChannelPrimer(
@@ -279,17 +284,17 @@ public static ClientContext createClientContext(EnhancedBigtableStubSettings set
279284
}
280285

281286
public static ApiTracerFactory createBigtableTracerFactory(
282-
EnhancedBigtableStubSettings settings, ClientContext clientContext) throws IOException {
287+
EnhancedBigtableStubSettings settings, OpenTelemetry openTelemetry) throws IOException {
283288
return createBigtableTracerFactory(
284-
settings, Tags.getTagger(), Stats.getStatsRecorder(), clientContext);
289+
settings, Tags.getTagger(), Stats.getStatsRecorder(), openTelemetry);
285290
}
286291

287292
@VisibleForTesting
288293
public static ApiTracerFactory createBigtableTracerFactory(
289294
EnhancedBigtableStubSettings settings,
290295
Tagger tagger,
291296
StatsRecorder stats,
292-
ClientContext clientContext)
297+
OpenTelemetry openTelemetry)
293298
throws IOException {
294299
String projectId = settings.getProjectId();
295300
String instanceId = settings.getInstanceId();
@@ -302,8 +307,6 @@ public static ApiTracerFactory createBigtableTracerFactory(
302307
.put(RpcMeasureConstants.BIGTABLE_APP_PROFILE_ID, TagValue.create(appProfileId))
303308
.build();
304309

305-
ImmutableMap<String, String> builtinAttributes = createBuiltinAttributes(settings.toBuilder());
306-
307310
ImmutableList.Builder<ApiTracerFactory> tracerFactories = ImmutableList.builder();
308311
tracerFactories
309312
.add(
@@ -323,53 +326,47 @@ public static ApiTracerFactory createBigtableTracerFactory(
323326
.add(MetricsTracerFactory.create(tagger, stats, attributes))
324327
// Add user configured tracer
325328
.add(settings.getTracerFactory());
326-
Attributes otelAttributes =
327-
Attributes.of(
328-
PROJECT_ID_KEY, projectId, INSTANCE_ID_KEY, instanceId, APP_PROFILE_KEY, appProfileId);
329329
BuiltinMetricsTracerFactory builtinMetricsTracerFactory =
330-
createBuiltinMetricsTracerFactory(
331-
projectId, settings.getMetricsProvider(), otelAttributes, clientContext);
330+
openTelemetry != null
331+
? BuiltinMetricsTracerFactory.create(openTelemetry, createBuiltinAttributes(settings))
332+
: null;
332333
if (builtinMetricsTracerFactory != null) {
333334
tracerFactories.add(builtinMetricsTracerFactory);
334335
}
335336
return new CompositeTracerFactory(tracerFactories.build());
336337
}
337338

338-
private static BuiltinMetricsTracerFactory createBuiltinMetricsTracerFactory(
339-
String projectId,
340-
MetricsProvider metricsProvider,
341-
Attributes attributes,
342-
ClientContext clientContext)
339+
@Nullable
340+
public static OpenTelemetry getOpenTelemetry(
341+
String projectId, MetricsProvider metricsProvider, @Nullable Credentials defaultCredentials)
343342
throws IOException {
344343
if (metricsProvider instanceof CustomOpenTelemetryMetricsProvider) {
345344
CustomOpenTelemetryMetricsProvider customMetricsProvider =
346345
(CustomOpenTelemetryMetricsProvider) metricsProvider;
347-
return BuiltinMetricsTracerFactory.create(
348-
customMetricsProvider.getOpenTelemetry(), attributes);
346+
return customMetricsProvider.getOpenTelemetry();
349347
} else if (metricsProvider instanceof DefaultMetricsProvider) {
350-
SdkMeterProviderBuilder meterProvider = SdkMeterProvider.builder();
351348
Credentials credentials =
352349
BigtableDataSettings.getMetricsCredentials() != null
353350
? BigtableDataSettings.getMetricsCredentials()
354-
: clientContext.getCredentials();
355-
BuiltinMetricsView.registerBuiltinMetrics(projectId, credentials, meterProvider);
356-
OpenTelemetry openTelemetry =
357-
OpenTelemetrySdk.builder().setMeterProvider(meterProvider.build()).build();
358-
return BuiltinMetricsTracerFactory.create(openTelemetry, attributes);
351+
: defaultCredentials;
352+
DefaultMetricsProvider defaultMetricsProvider = (DefaultMetricsProvider) metricsProvider;
353+
return defaultMetricsProvider.getOpenTelemetry(projectId, credentials);
359354
} else if (metricsProvider instanceof NoopMetricsProvider) {
360355
return null;
361356
}
362357
throw new IOException("Invalid MetricsProvider type " + metricsProvider);
363358
}
364359

365-
private static ImmutableMap<String, String> createBuiltinAttributes(
366-
EnhancedBigtableStubSettings.Builder builder) {
367-
return ImmutableMap.<String, String>builder()
368-
.put("project_id", builder.getProjectId())
369-
.put("instance", builder.getInstanceId())
370-
.put("app_profile", builder.getAppProfileId())
371-
.put("client_name", "bigtable-java/" + Version.VERSION)
372-
.build();
360+
private static Attributes createBuiltinAttributes(EnhancedBigtableStubSettings settings) {
361+
return Attributes.of(
362+
PROJECT_ID_KEY,
363+
settings.getProjectId(),
364+
INSTANCE_ID_KEY,
365+
settings.getInstanceId(),
366+
APP_PROFILE_KEY,
367+
settings.getAppProfileId(),
368+
CLIENT_NAME_KEY,
369+
"bigtable-java/" + Version.VERSION);
373370
}
374371

375372
private static void patchCredentials(EnhancedBigtableStubSettings.Builder settings)

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import com.google.api.core.ApiFutureCallback;
2121
import com.google.api.core.ApiFutures;
2222
import com.google.api.core.InternalApi;
23+
import com.google.api.gax.core.CredentialsProvider;
2324
import com.google.api.gax.core.FixedCredentialsProvider;
25+
import com.google.api.gax.core.NoCredentialsProvider;
2426
import com.google.auth.Credentials;
2527
import com.google.cloud.monitoring.v3.MetricServiceClient;
2628
import com.google.cloud.monitoring.v3.MetricServiceSettings;
@@ -43,6 +45,7 @@
4345
import java.util.concurrent.atomic.AtomicBoolean;
4446
import java.util.logging.Level;
4547
import java.util.logging.Logger;
48+
import javax.annotation.Nullable;
4649
import org.threeten.bp.Duration;
4750

4851
/**
@@ -75,10 +78,16 @@ public final class BigtableCloudMonitoringExporter implements MetricExporter {
7578

7679
private CompletableResultCode lastExportCode;
7780

78-
public static BigtableCloudMonitoringExporter create(String projectId, Credentials credentials)
79-
throws IOException {
81+
public static BigtableCloudMonitoringExporter create(
82+
String projectId, @Nullable Credentials credentials) throws IOException {
8083
MetricServiceSettings.Builder settingsBuilder = MetricServiceSettings.newBuilder();
81-
settingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(credentials));
84+
CredentialsProvider credentialsProvider;
85+
if (credentials == null) {
86+
credentialsProvider = NoCredentialsProvider.create();
87+
} else {
88+
credentialsProvider = FixedCredentialsProvider.create(credentials);
89+
}
90+
settingsBuilder.setCredentialsProvider(credentialsProvider);
8291
settingsBuilder.setEndpoint(MONITORING_ENDPOINT);
8392

8493
org.threeten.bp.Duration timeout = Duration.ofMinutes(1);

0 commit comments

Comments
 (0)