From ecabc860e271df27cf09bbe00f2c67560d817261 Mon Sep 17 00:00:00 2001 From: Mattie Fu Date: Fri, 12 Apr 2024 15:45:22 -0400 Subject: [PATCH 1/4] fix: Fix export to log detect resource errors --- .../stub/metrics/BigtableExporterUtils.java | 43 +++++++++++++------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java index 9a4d928ce4..2ea205d723 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java @@ -151,16 +151,24 @@ static List convertToApplicationResourceTimeSeries( static MonitoredResource detectResource() { GCPPlatformDetector detector = GCPPlatformDetector.DEFAULT_INSTANCE; DetectedPlatform detectedPlatform = detector.detectPlatform(); - switch (detectedPlatform.getSupportedPlatform()) { - case GOOGLE_COMPUTE_ENGINE: - return createGceMonitoredResource( - detectedPlatform.getProjectId(), detectedPlatform.getAttributes()); - case GOOGLE_KUBERNETES_ENGINE: - return createGkeMonitoredResource( - detectedPlatform.getProjectId(), detectedPlatform.getAttributes()); - default: - return null; + MonitoredResource monitoredResource = null; + try { + switch (detectedPlatform.getSupportedPlatform()) { + case GOOGLE_COMPUTE_ENGINE: + monitoredResource = + createGceMonitoredResource( + detectedPlatform.getProjectId(), detectedPlatform.getAttributes()); + break; + case GOOGLE_KUBERNETES_ENGINE: + monitoredResource = + createGkeMonitoredResource( + detectedPlatform.getProjectId(), detectedPlatform.getAttributes()); + break; + } + } catch (IllegalStateException e) { + logger.log(Level.WARNING, "Failed to create monitored resource for GCE / GKE.", e); } + return monitoredResource; } private static MonitoredResource createGceMonitoredResource( @@ -168,8 +176,8 @@ private static MonitoredResource createGceMonitoredResource( return MonitoredResource.newBuilder() .setType("gce_instance") .putLabels("project_id", projectId) - .putLabels("instance_id", attributes.get(AttributeKeys.GCE_INSTANCE_ID)) - .putLabels("zone", attributes.get(AttributeKeys.GCE_AVAILABILITY_ZONE)) + .putLabels("instance_id", getAttribute(attributes, AttributeKeys.GCE_INSTANCE_ID)) + .putLabels("zone", getAttribute(attributes, AttributeKeys.GCE_AVAILABILITY_ZONE)) .build(); } @@ -178,14 +186,23 @@ private static MonitoredResource createGkeMonitoredResource( return MonitoredResource.newBuilder() .setType("k8s_container") .putLabels("project_id", projectId) - .putLabels("location", attributes.get(AttributeKeys.GKE_CLUSTER_LOCATION)) - .putLabels("cluster_name", attributes.get(AttributeKeys.GKE_CLUSTER_NAME)) + .putLabels("location", getAttribute(attributes, AttributeKeys.GKE_CLUSTER_LOCATION)) + .putLabels("cluster_name", getAttribute(attributes, AttributeKeys.GKE_CLUSTER_NAME)) .putLabels("namespace_name", MoreObjects.firstNonNull(System.getenv("NAMESPACE"), "")) .putLabels("pod_name", MoreObjects.firstNonNull(System.getenv("HOSTNAME"), "")) .putLabels("container_name", MoreObjects.firstNonNull(System.getenv("CONTAINER_NAME"), "")) .build(); } + private static String getAttribute(Map attributes, String key) { + String value = attributes.get(key); + if (value == null) { + throw new IllegalStateException( + "Required attribute " + key + " does not exist in the attributes map " + attributes); + } + return value; + } + private static TimeSeries convertPointToBigtableTimeSeries( MetricData metricData, PointData pointData, String taskId) { TimeSeries.Builder builder = From a1e3b29ec19189b38e6872942bee7e21e237dcde Mon Sep 17 00:00:00 2001 From: Mattie Fu Date: Fri, 12 Apr 2024 16:04:09 -0400 Subject: [PATCH 2/4] catch exceptions --- .../BigtableCloudMonitoringExporter.java | 236 +++++++++--------- .../v2/stub/metrics/BuiltinMetricsView.java | 19 +- 2 files changed, 137 insertions(+), 118 deletions(-) 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 d3f88b88c2..2d517dbdfe 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 @@ -172,143 +172,153 @@ public CompletableResultCode export(Collection collection) { /** Export metrics associated with a BigtableTable resource. */ private CompletableResultCode exportBigtableResourceMetrics(Collection collection) { - // Filter bigtable table metrics - List bigtableMetricData = - collection.stream() - .filter(md -> BIGTABLE_TABLE_METRICS.contains(md.getName())) - .collect(Collectors.toList()); - - // Skips exporting if there's none - if (bigtableMetricData.isEmpty()) { - return CompletableResultCode.ofSuccess(); - } - - // Verifies metrics project id are the same as the bigtable project id set on this client - if (!bigtableMetricData.stream() - .flatMap(metricData -> metricData.getData().getPoints().stream()) - .allMatch(pd -> bigtableProjectId.equals(BigtableExporterUtils.getProjectId(pd)))) { - logger.log(Level.WARNING, "Metric data has different a projectId. Skip exporting."); - return CompletableResultCode.ofFailure(); - } - - List bigtableTimeSeries; try { - bigtableTimeSeries = - BigtableExporterUtils.convertToBigtableTimeSeries(bigtableMetricData, taskId); - } catch (Throwable e) { - logger.log( - Level.WARNING, - "Failed to convert bigtable table metric data to cloud monitoring timeseries.", - e); - return CompletableResultCode.ofFailure(); - } - - ProjectName projectName = ProjectName.of(bigtableProjectId); - CreateTimeSeriesRequest bigtableRequest = - CreateTimeSeriesRequest.newBuilder() - .setName(projectName.toString()) - .addAllTimeSeries(bigtableTimeSeries) - .build(); - - ApiFuture future = - this.client.createServiceTimeSeriesCallable().futureCall(bigtableRequest); - - CompletableResultCode bigtableExportCode = new CompletableResultCode(); - ApiFutures.addCallback( - future, - new ApiFutureCallback() { - @Override - public void onFailure(Throwable throwable) { - logger.log( - Level.WARNING, - "createServiceTimeSeries request failed for bigtable metrics. ", - throwable); - bigtableExportCode.fail(); - } - - @Override - public void onSuccess(Empty empty) { - bigtableExportCode.succeed(); - } - }, - MoreExecutors.directExecutor()); - - return bigtableExportCode; - } - - /** Export metrics associated with the resource the Application is running on. */ - private CompletableResultCode exportApplicationResourceMetrics( - Collection collection) { - if (applicationResource == null) { - return CompletableResultCode.ofSuccess(); - } - - // Filter application level metrics - List metricData = - collection.stream() - .filter(md -> APPLICATION_METRICS.contains(md.getName())) - .collect(Collectors.toList()); - - // Skip exporting if there's none - if (metricData.isEmpty()) { - return CompletableResultCode.ofSuccess(); - } - - List timeSeries; - try { - timeSeries = - BigtableExporterUtils.convertToApplicationResourceTimeSeries( - metricData, taskId, applicationResource); - } catch (Throwable e) { - logger.log( - Level.WARNING, - "Failed to convert application metric data to cloud monitoring timeseries.", - e); - return CompletableResultCode.ofFailure(); - } - - // Construct the request. The project id will be the project id of the detected monitored - // resource. - ApiFuture gceOrGkeFuture; - CompletableResultCode exportCode = new CompletableResultCode(); - try { - ProjectName projectName = - ProjectName.of(applicationResource.getLabelsOrThrow(APPLICATION_RESOURCE_PROJECT_ID)); - CreateTimeSeriesRequest request = + // Filter bigtable table metrics + List bigtableMetricData = + collection.stream() + .filter(md -> BIGTABLE_TABLE_METRICS.contains(md.getName())) + .collect(Collectors.toList()); + + // Skips exporting if there's none + if (bigtableMetricData.isEmpty()) { + return CompletableResultCode.ofSuccess(); + } + + // Verifies metrics project id are the same as the bigtable project id set on this client + if (!bigtableMetricData.stream() + .flatMap(metricData -> metricData.getData().getPoints().stream()) + .allMatch(pd -> bigtableProjectId.equals(BigtableExporterUtils.getProjectId(pd)))) { + logger.log(Level.WARNING, "Metric data has different a projectId. Skip exporting."); + return CompletableResultCode.ofFailure(); + } + + List bigtableTimeSeries; + try { + bigtableTimeSeries = + BigtableExporterUtils.convertToBigtableTimeSeries(bigtableMetricData, taskId); + } catch (Throwable e) { + logger.log( + Level.WARNING, + "Failed to convert bigtable table metric data to cloud monitoring timeseries.", + e); + return CompletableResultCode.ofFailure(); + } + + ProjectName projectName = ProjectName.of(bigtableProjectId); + CreateTimeSeriesRequest bigtableRequest = CreateTimeSeriesRequest.newBuilder() .setName(projectName.toString()) - .addAllTimeSeries(timeSeries) + .addAllTimeSeries(bigtableTimeSeries) .build(); - gceOrGkeFuture = this.client.createServiceTimeSeriesCallable().futureCall(request); + ApiFuture future = + this.client.createServiceTimeSeriesCallable().futureCall(bigtableRequest); + CompletableResultCode bigtableExportCode = new CompletableResultCode(); ApiFutures.addCallback( - gceOrGkeFuture, + future, new ApiFutureCallback() { @Override public void onFailure(Throwable throwable) { logger.log( Level.WARNING, - "createServiceTimeSeries request failed for per connection error metrics.", + "createServiceTimeSeries request failed for bigtable metrics. ", throwable); - exportCode.fail(); + bigtableExportCode.fail(); } @Override public void onSuccess(Empty empty) { - exportCode.succeed(); + bigtableExportCode.succeed(); } }, MoreExecutors.directExecutor()); - } catch (Exception e) { - logger.log( - Level.WARNING, - "Failed to get projectName for application resource " + applicationResource); + return bigtableExportCode; + } catch (Throwable t) { + logger.log(Level.WARNING, "Failed to export Bigtable Resource Metrics.", t); return CompletableResultCode.ofFailure(); } + } - return exportCode; + /** Export metrics associated with the resource the Application is running on. */ + private CompletableResultCode exportApplicationResourceMetrics( + Collection collection) { + try { + if (applicationResource == null) { + return CompletableResultCode.ofSuccess(); + } + + // Filter application level metrics + List metricData = + collection.stream() + .filter(md -> APPLICATION_METRICS.contains(md.getName())) + .collect(Collectors.toList()); + + // Skip exporting if there's none + if (metricData.isEmpty()) { + return CompletableResultCode.ofSuccess(); + } + + List timeSeries; + try { + timeSeries = + BigtableExporterUtils.convertToApplicationResourceTimeSeries( + metricData, taskId, applicationResource); + } catch (Throwable e) { + logger.log( + Level.WARNING, + "Failed to convert application metric data to cloud monitoring timeseries.", + e); + return CompletableResultCode.ofFailure(); + } + + // Construct the request. The project id will be the project id of the detected monitored + // resource. + ApiFuture gceOrGkeFuture; + CompletableResultCode exportCode = new CompletableResultCode(); + try { + ProjectName projectName = + ProjectName.of(applicationResource.getLabelsOrThrow(APPLICATION_RESOURCE_PROJECT_ID)); + CreateTimeSeriesRequest request = + CreateTimeSeriesRequest.newBuilder() + .setName(projectName.toString()) + .addAllTimeSeries(timeSeries) + .build(); + + gceOrGkeFuture = this.client.createServiceTimeSeriesCallable().futureCall(request); + + ApiFutures.addCallback( + gceOrGkeFuture, + new ApiFutureCallback() { + @Override + public void onFailure(Throwable throwable) { + logger.log( + Level.WARNING, + "createServiceTimeSeries request failed for per connection error metrics.", + throwable); + exportCode.fail(); + } + + @Override + public void onSuccess(Empty empty) { + exportCode.succeed(); + } + }, + MoreExecutors.directExecutor()); + + } catch (Exception e) { + logger.log( + Level.WARNING, + "Failed to get projectName for application resource " + applicationResource); + return CompletableResultCode.ofFailure(); + } + + return exportCode; + } catch (Throwable t) { + logger.log(Level.WARNING, "Failed to export Application Resource Metrics.", t); + return CompletableResultCode.ofFailure(); + } } @Override diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java index 445160a146..38e79ddfad 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java @@ -24,6 +24,8 @@ import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import java.io.IOException; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.annotation.Nullable; /** @@ -33,6 +35,8 @@ */ public class BuiltinMetricsView { + private static final Logger logger = Logger.getLogger(BuiltinMetricsView.class.getName()); + private BuiltinMetricsView() {} /** @@ -49,11 +53,16 @@ public static void registerBuiltinMetrics(String projectId, SdkMeterProviderBuil public static void registerBuiltinMetrics( String projectId, @Nullable Credentials credentials, SdkMeterProviderBuilder builder) throws IOException { - MetricExporter metricExporter = BigtableCloudMonitoringExporter.create(projectId, credentials); - for (Map.Entry entry : - BuiltinMetricsConstants.getAllViews().entrySet()) { - builder.registerView(entry.getKey(), entry.getValue()); + try { + MetricExporter metricExporter = + BigtableCloudMonitoringExporter.create(projectId, credentials); + for (Map.Entry entry : + BuiltinMetricsConstants.getAllViews().entrySet()) { + builder.registerView(entry.getKey(), entry.getValue()); + } + builder.registerMetricReader(PeriodicMetricReader.create(metricExporter)); + } catch (Throwable t) { + logger.log(Level.WARNING, "Failed to register builtin metrics.", t); } - builder.registerMetricReader(PeriodicMetricReader.create(metricExporter)); } } From 7cdfde670fa327bf0a60352a5b17e6c64e78ec26 Mon Sep 17 00:00:00 2001 From: Mattie Fu Date: Fri, 12 Apr 2024 16:31:44 -0400 Subject: [PATCH 3/4] update error handling --- .../data/v2/stub/EnhancedBigtableStub.java | 22 +- .../BigtableCloudMonitoringExporter.java | 236 +++++++++--------- .../stub/metrics/BigtableExporterUtils.java | 5 +- .../v2/stub/metrics/BuiltinMetricsView.java | 16 +- 4 files changed, 140 insertions(+), 139 deletions(-) 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 f0aa852338..2f7b77a660 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 @@ -149,6 +149,8 @@ import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -166,6 +168,9 @@ */ @InternalApi public class EnhancedBigtableStub implements AutoCloseable { + + private static final Logger logger = Logger.getLogger(EnhancedBigtableStub.class.getName()); + private static final String CLIENT_NAME = "Bigtable"; private static final long FLOW_CONTROL_ADJUSTING_INTERVAL_MS = TimeUnit.SECONDS.toMillis(20); private final EnhancedBigtableStubSettings settings; @@ -238,8 +243,16 @@ public static ClientContext createClientContext(EnhancedBigtableStubSettings set ? ((InstantiatingGrpcChannelProvider) builder.getTransportChannelProvider()).toBuilder() : null; - OpenTelemetry openTelemetry = - getOpenTelemetry(settings.getProjectId(), settings.getMetricsProvider(), credentials); + 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(), credentials); + } catch (Throwable t) { + logger.log(Level.WARNING, "Failed to get OTEL, will skip exporting client side metrics", t); + } ErrorCountPerConnectionMetricTracker errorCountPerConnectionMetricTracker; // Skip setting up ErrorCountPerConnectionMetricTracker if openTelemetry is null if (openTelemetry != null && transportProvider != null) { @@ -291,7 +304,8 @@ public static ClientContext createClientContext(EnhancedBigtableStubSettings set } public static ApiTracerFactory createBigtableTracerFactory( - EnhancedBigtableStubSettings settings, OpenTelemetry openTelemetry) throws IOException { + EnhancedBigtableStubSettings settings, @Nullable OpenTelemetry openTelemetry) + throws IOException { return createBigtableTracerFactory( settings, Tags.getTagger(), Stats.getStatsRecorder(), openTelemetry); } @@ -301,7 +315,7 @@ public static ApiTracerFactory createBigtableTracerFactory( EnhancedBigtableStubSettings settings, Tagger tagger, StatsRecorder stats, - OpenTelemetry openTelemetry) + @Nullable OpenTelemetry openTelemetry) throws IOException { String projectId = settings.getProjectId(); String instanceId = settings.getInstanceId(); 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 2d517dbdfe..d3f88b88c2 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 @@ -172,153 +172,143 @@ public CompletableResultCode export(Collection collection) { /** Export metrics associated with a BigtableTable resource. */ private CompletableResultCode exportBigtableResourceMetrics(Collection collection) { + // Filter bigtable table metrics + List bigtableMetricData = + collection.stream() + .filter(md -> BIGTABLE_TABLE_METRICS.contains(md.getName())) + .collect(Collectors.toList()); + + // Skips exporting if there's none + if (bigtableMetricData.isEmpty()) { + return CompletableResultCode.ofSuccess(); + } + + // Verifies metrics project id are the same as the bigtable project id set on this client + if (!bigtableMetricData.stream() + .flatMap(metricData -> metricData.getData().getPoints().stream()) + .allMatch(pd -> bigtableProjectId.equals(BigtableExporterUtils.getProjectId(pd)))) { + logger.log(Level.WARNING, "Metric data has different a projectId. Skip exporting."); + return CompletableResultCode.ofFailure(); + } + + List bigtableTimeSeries; try { - // Filter bigtable table metrics - List bigtableMetricData = - collection.stream() - .filter(md -> BIGTABLE_TABLE_METRICS.contains(md.getName())) - .collect(Collectors.toList()); - - // Skips exporting if there's none - if (bigtableMetricData.isEmpty()) { - return CompletableResultCode.ofSuccess(); - } - - // Verifies metrics project id are the same as the bigtable project id set on this client - if (!bigtableMetricData.stream() - .flatMap(metricData -> metricData.getData().getPoints().stream()) - .allMatch(pd -> bigtableProjectId.equals(BigtableExporterUtils.getProjectId(pd)))) { - logger.log(Level.WARNING, "Metric data has different a projectId. Skip exporting."); - return CompletableResultCode.ofFailure(); - } - - List bigtableTimeSeries; - try { - bigtableTimeSeries = - BigtableExporterUtils.convertToBigtableTimeSeries(bigtableMetricData, taskId); - } catch (Throwable e) { - logger.log( - Level.WARNING, - "Failed to convert bigtable table metric data to cloud monitoring timeseries.", - e); - return CompletableResultCode.ofFailure(); - } - - ProjectName projectName = ProjectName.of(bigtableProjectId); - CreateTimeSeriesRequest bigtableRequest = + bigtableTimeSeries = + BigtableExporterUtils.convertToBigtableTimeSeries(bigtableMetricData, taskId); + } catch (Throwable e) { + logger.log( + Level.WARNING, + "Failed to convert bigtable table metric data to cloud monitoring timeseries.", + e); + return CompletableResultCode.ofFailure(); + } + + ProjectName projectName = ProjectName.of(bigtableProjectId); + CreateTimeSeriesRequest bigtableRequest = + CreateTimeSeriesRequest.newBuilder() + .setName(projectName.toString()) + .addAllTimeSeries(bigtableTimeSeries) + .build(); + + ApiFuture future = + this.client.createServiceTimeSeriesCallable().futureCall(bigtableRequest); + + CompletableResultCode bigtableExportCode = new CompletableResultCode(); + ApiFutures.addCallback( + future, + new ApiFutureCallback() { + @Override + public void onFailure(Throwable throwable) { + logger.log( + Level.WARNING, + "createServiceTimeSeries request failed for bigtable metrics. ", + throwable); + bigtableExportCode.fail(); + } + + @Override + public void onSuccess(Empty empty) { + bigtableExportCode.succeed(); + } + }, + MoreExecutors.directExecutor()); + + return bigtableExportCode; + } + + /** Export metrics associated with the resource the Application is running on. */ + private CompletableResultCode exportApplicationResourceMetrics( + Collection collection) { + if (applicationResource == null) { + return CompletableResultCode.ofSuccess(); + } + + // Filter application level metrics + List metricData = + collection.stream() + .filter(md -> APPLICATION_METRICS.contains(md.getName())) + .collect(Collectors.toList()); + + // Skip exporting if there's none + if (metricData.isEmpty()) { + return CompletableResultCode.ofSuccess(); + } + + List timeSeries; + try { + timeSeries = + BigtableExporterUtils.convertToApplicationResourceTimeSeries( + metricData, taskId, applicationResource); + } catch (Throwable e) { + logger.log( + Level.WARNING, + "Failed to convert application metric data to cloud monitoring timeseries.", + e); + return CompletableResultCode.ofFailure(); + } + + // Construct the request. The project id will be the project id of the detected monitored + // resource. + ApiFuture gceOrGkeFuture; + CompletableResultCode exportCode = new CompletableResultCode(); + try { + ProjectName projectName = + ProjectName.of(applicationResource.getLabelsOrThrow(APPLICATION_RESOURCE_PROJECT_ID)); + CreateTimeSeriesRequest request = CreateTimeSeriesRequest.newBuilder() .setName(projectName.toString()) - .addAllTimeSeries(bigtableTimeSeries) + .addAllTimeSeries(timeSeries) .build(); - ApiFuture future = - this.client.createServiceTimeSeriesCallable().futureCall(bigtableRequest); + gceOrGkeFuture = this.client.createServiceTimeSeriesCallable().futureCall(request); - CompletableResultCode bigtableExportCode = new CompletableResultCode(); ApiFutures.addCallback( - future, + gceOrGkeFuture, new ApiFutureCallback() { @Override public void onFailure(Throwable throwable) { logger.log( Level.WARNING, - "createServiceTimeSeries request failed for bigtable metrics. ", + "createServiceTimeSeries request failed for per connection error metrics.", throwable); - bigtableExportCode.fail(); + exportCode.fail(); } @Override public void onSuccess(Empty empty) { - bigtableExportCode.succeed(); + exportCode.succeed(); } }, MoreExecutors.directExecutor()); - return bigtableExportCode; - } catch (Throwable t) { - logger.log(Level.WARNING, "Failed to export Bigtable Resource Metrics.", t); + } catch (Exception e) { + logger.log( + Level.WARNING, + "Failed to get projectName for application resource " + applicationResource); return CompletableResultCode.ofFailure(); } - } - /** Export metrics associated with the resource the Application is running on. */ - private CompletableResultCode exportApplicationResourceMetrics( - Collection collection) { - try { - if (applicationResource == null) { - return CompletableResultCode.ofSuccess(); - } - - // Filter application level metrics - List metricData = - collection.stream() - .filter(md -> APPLICATION_METRICS.contains(md.getName())) - .collect(Collectors.toList()); - - // Skip exporting if there's none - if (metricData.isEmpty()) { - return CompletableResultCode.ofSuccess(); - } - - List timeSeries; - try { - timeSeries = - BigtableExporterUtils.convertToApplicationResourceTimeSeries( - metricData, taskId, applicationResource); - } catch (Throwable e) { - logger.log( - Level.WARNING, - "Failed to convert application metric data to cloud monitoring timeseries.", - e); - return CompletableResultCode.ofFailure(); - } - - // Construct the request. The project id will be the project id of the detected monitored - // resource. - ApiFuture gceOrGkeFuture; - CompletableResultCode exportCode = new CompletableResultCode(); - try { - ProjectName projectName = - ProjectName.of(applicationResource.getLabelsOrThrow(APPLICATION_RESOURCE_PROJECT_ID)); - CreateTimeSeriesRequest request = - CreateTimeSeriesRequest.newBuilder() - .setName(projectName.toString()) - .addAllTimeSeries(timeSeries) - .build(); - - gceOrGkeFuture = this.client.createServiceTimeSeriesCallable().futureCall(request); - - ApiFutures.addCallback( - gceOrGkeFuture, - new ApiFutureCallback() { - @Override - public void onFailure(Throwable throwable) { - logger.log( - Level.WARNING, - "createServiceTimeSeries request failed for per connection error metrics.", - throwable); - exportCode.fail(); - } - - @Override - public void onSuccess(Empty empty) { - exportCode.succeed(); - } - }, - MoreExecutors.directExecutor()); - - } catch (Exception e) { - logger.log( - Level.WARNING, - "Failed to get projectName for application resource " + applicationResource); - return CompletableResultCode.ofFailure(); - } - - return exportCode; - } catch (Throwable t) { - logger.log(Level.WARNING, "Failed to export Application Resource Metrics.", t); - return CompletableResultCode.ofFailure(); - } + return exportCode; } @Override diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java index 2ea205d723..5bf6688e17 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java @@ -166,7 +166,10 @@ static MonitoredResource detectResource() { break; } } catch (IllegalStateException e) { - logger.log(Level.WARNING, "Failed to create monitored resource for GCE / GKE.", e); + logger.log( + Level.WARNING, + "Failed to create monitored resource for " + detectedPlatform.getSupportedPlatform(), + e); } return monitoredResource; } diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java index 38e79ddfad..73eb17284f 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java @@ -24,7 +24,6 @@ import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import java.io.IOException; import java.util.Map; -import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -53,16 +52,11 @@ public static void registerBuiltinMetrics(String projectId, SdkMeterProviderBuil public static void registerBuiltinMetrics( String projectId, @Nullable Credentials credentials, SdkMeterProviderBuilder builder) throws IOException { - try { - MetricExporter metricExporter = - BigtableCloudMonitoringExporter.create(projectId, credentials); - for (Map.Entry entry : - BuiltinMetricsConstants.getAllViews().entrySet()) { - builder.registerView(entry.getKey(), entry.getValue()); - } - builder.registerMetricReader(PeriodicMetricReader.create(metricExporter)); - } catch (Throwable t) { - logger.log(Level.WARNING, "Failed to register builtin metrics.", t); + MetricExporter metricExporter = BigtableCloudMonitoringExporter.create(projectId, credentials); + for (Map.Entry entry : + BuiltinMetricsConstants.getAllViews().entrySet()) { + builder.registerView(entry.getKey(), entry.getValue()); } + builder.registerMetricReader(PeriodicMetricReader.create(metricExporter)); } } From 6148b647c0644e3e6cefbabef07a0ec6f972da5a Mon Sep 17 00:00:00 2001 From: Mattie Fu Date: Fri, 12 Apr 2024 16:33:30 -0400 Subject: [PATCH 4/4] remove imports --- .../cloud/bigtable/data/v2/stub/EnhancedBigtableStub.java | 3 +-- .../bigtable/data/v2/stub/metrics/BuiltinMetricsView.java | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) 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 2f7b77a660..5dbb59aedf 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 @@ -246,8 +246,7 @@ public static ClientContext createClientContext(EnhancedBigtableStubSettings set 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. + // the OTEL instance and log the exception instead. openTelemetry = getOpenTelemetry(settings.getProjectId(), settings.getMetricsProvider(), credentials); } catch (Throwable t) { diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java index 73eb17284f..445160a146 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsView.java @@ -24,7 +24,6 @@ import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; import java.io.IOException; import java.util.Map; -import java.util.logging.Logger; import javax.annotation.Nullable; /** @@ -34,8 +33,6 @@ */ public class BuiltinMetricsView { - private static final Logger logger = Logger.getLogger(BuiltinMetricsView.class.getName()); - private BuiltinMetricsView() {} /**