From c2a63f7627f2aa6e2e51ec3e185abfa5234ad3e4 Mon Sep 17 00:00:00 2001 From: Mattie Fu Date: Mon, 15 Apr 2024 13:34:19 -0400 Subject: [PATCH] fix: add more error handling (#2203) --- .../data/v2/BigtableDataClientFactory.java | 22 ++++++++++++++----- .../data/v2/stub/EnhancedBigtableStub.java | 16 ++++++++++---- .../BigtableCloudMonitoringExporter.java | 12 ++++++++-- 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java index 45ec5af81..9b2f2e345 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java @@ -21,6 +21,8 @@ import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStub; import io.opentelemetry.api.OpenTelemetry; import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.annotation.Nonnull; /** @@ -63,6 +65,9 @@ */ @BetaApi("This feature is currently experimental and can change in the future") public final class BigtableDataClientFactory implements AutoCloseable { + + private static final Logger logger = Logger.getLogger(BigtableDataClientFactory.class.getName()); + private final BigtableDataSettings defaultSettings; private final ClientContext sharedClientContext; private final OpenTelemetry openTelemetry; @@ -77,11 +82,18 @@ public static BigtableDataClientFactory create(BigtableDataSettings defaultSetti throws IOException { ClientContext sharedClientContext = EnhancedBigtableStub.createClientContext(defaultSettings.getStubSettings()); - OpenTelemetry openTelemetry = - EnhancedBigtableStub.getOpenTelemetry( - defaultSettings.getProjectId(), - defaultSettings.getMetricsProvider(), - sharedClientContext.getCredentials()); + OpenTelemetry openTelemetry = null; + try { + // We don't want client side metrics to crash the client, so catch any exception when getting + // the OTEL instance and log the exception instead. + openTelemetry = + EnhancedBigtableStub.getOpenTelemetry( + defaultSettings.getProjectId(), + defaultSettings.getMetricsProvider(), + sharedClientContext.getCredentials()); + } catch (Throwable t) { + logger.log(Level.WARNING, "Failed to get OTEL, will skip exporting client side metrics", t); + } return new BigtableDataClientFactory(sharedClientContext, defaultSettings, openTelemetry); } diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStub.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStub.java index 5dbb59aed..57d9748cc 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStub.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStub.java @@ -203,15 +203,23 @@ public class EnhancedBigtableStub implements AutoCloseable { public static EnhancedBigtableStub create(EnhancedBigtableStubSettings settings) throws IOException { ClientContext clientContext = createClientContext(settings); - OpenTelemetry openTelemetry = - getOpenTelemetry( - settings.getProjectId(), settings.getMetricsProvider(), clientContext.getCredentials()); + OpenTelemetry openTelemetry = null; + try { + // We don't want client side metrics to crash the client, so catch any exception when getting + // the OTEL instance and log the exception instead. + openTelemetry = + getOpenTelemetry( + settings.getProjectId(), + settings.getMetricsProvider(), + clientContext.getCredentials()); + } catch (Throwable t) { + logger.log(Level.WARNING, "Failed to get OTEL, will skip exporting client side metrics", t); + } ClientContext contextWithTracer = clientContext .toBuilder() .setTracerFactory(createBigtableTracerFactory(settings, openTelemetry)) .build(); - return new EnhancedBigtableStub(settings, contextWithTracer); } diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporter.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporter.java index d3f88b88c..81473ae4d 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporter.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporter.java @@ -82,7 +82,7 @@ public final class BigtableCloudMonitoringExporter implements MetricExporter { System.getProperty("bigtable.test-monitoring-endpoint"), MetricServiceSettings.getDefaultEndpoint()); - private static String APPLICATION_RESOURCE_PROJECT_ID = "project_id"; + private static final String APPLICATION_RESOURCE_PROJECT_ID = "project_id"; private final MetricServiceClient client; @@ -133,7 +133,15 @@ public static BigtableCloudMonitoringExporter create( // Detect the resource that the client application is running on. For example, // this could be a GCE instance or a GKE pod. Currently, we only support GCE instance and // GKE pod. This method will return null for everything else. - MonitoredResource applicationResource = BigtableExporterUtils.detectResource(); + MonitoredResource applicationResource = null; + try { + applicationResource = BigtableExporterUtils.detectResource(); + } catch (Exception e) { + logger.log( + Level.WARNING, + "Failed to detect resource, will skip exporting application level metrics ", + e); + } return new BigtableCloudMonitoringExporter( projectId,