From 1ecc267625678e15ed6a9c2b34dbfbc255f913bd Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 20:50:22 +0000 Subject: [PATCH 1/8] chore(main): release 2.57.2-SNAPSHOT (#2543) :robot: I have created a release *beep* *boop* --- ### Updating meta-information for bleeding-edge SNAPSHOT release. --- This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please). --- google-cloud-bigtable-bom/pom.xml | 16 ++++++++-------- google-cloud-bigtable-deps-bom/pom.xml | 2 +- google-cloud-bigtable-emulator-core/pom.xml | 4 ++-- google-cloud-bigtable-emulator/pom.xml | 10 +++++----- google-cloud-bigtable/pom.xml | 10 +++++----- .../java/com/google/cloud/bigtable/Version.java | 2 +- grpc-google-cloud-bigtable-admin-v2/pom.xml | 8 ++++---- grpc-google-cloud-bigtable-v2/pom.xml | 8 ++++---- pom.xml | 12 ++++++------ proto-google-cloud-bigtable-admin-v2/pom.xml | 8 ++++---- proto-google-cloud-bigtable-v2/pom.xml | 8 ++++---- samples/snapshot/pom.xml | 2 +- test-proxy/pom.xml | 4 ++-- versions.txt | 14 +++++++------- 14 files changed, 54 insertions(+), 54 deletions(-) diff --git a/google-cloud-bigtable-bom/pom.xml b/google-cloud-bigtable-bom/pom.xml index 3b98a74657cd..944ac42dc4fa 100644 --- a/google-cloud-bigtable-bom/pom.xml +++ b/google-cloud-bigtable-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-bigtable-bom - 2.57.1 + 2.57.2-SNAPSHOT pom com.google.cloud @@ -63,37 +63,37 @@ com.google.cloud google-cloud-bigtable - 2.57.1 + 2.57.2-SNAPSHOT com.google.cloud google-cloud-bigtable-emulator - 0.194.1 + 0.194.2-SNAPSHOT com.google.cloud google-cloud-bigtable-emulator-core - 0.194.1 + 0.194.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-bigtable-admin-v2 - 2.57.1 + 2.57.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-bigtable-v2 - 2.57.1 + 2.57.2-SNAPSHOT com.google.api.grpc proto-google-cloud-bigtable-admin-v2 - 2.57.1 + 2.57.2-SNAPSHOT com.google.api.grpc proto-google-cloud-bigtable-v2 - 2.57.1 + 2.57.2-SNAPSHOT diff --git a/google-cloud-bigtable-deps-bom/pom.xml b/google-cloud-bigtable-deps-bom/pom.xml index ce4ae5fd2258..d398cec7b4c2 100644 --- a/google-cloud-bigtable-deps-bom/pom.xml +++ b/google-cloud-bigtable-deps-bom/pom.xml @@ -13,7 +13,7 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.1 + 2.57.2-SNAPSHOT pom diff --git a/google-cloud-bigtable-emulator-core/pom.xml b/google-cloud-bigtable-emulator-core/pom.xml index c7ae4011b2fd..e225da411284 100644 --- a/google-cloud-bigtable-emulator-core/pom.xml +++ b/google-cloud-bigtable-emulator-core/pom.xml @@ -7,11 +7,11 @@ google-cloud-bigtable-parent com.google.cloud - 2.57.1 + 2.57.2-SNAPSHOT google-cloud-bigtable-emulator-core - 0.194.1 + 0.194.2-SNAPSHOT A Java wrapper for the Cloud Bigtable emulator. diff --git a/google-cloud-bigtable-emulator/pom.xml b/google-cloud-bigtable-emulator/pom.xml index ca3591a4a191..e32d0a9b0974 100644 --- a/google-cloud-bigtable-emulator/pom.xml +++ b/google-cloud-bigtable-emulator/pom.xml @@ -5,7 +5,7 @@ 4.0.0 google-cloud-bigtable-emulator - 0.194.1 + 0.194.2-SNAPSHOT Google Cloud Java - Bigtable Emulator https://github.com/googleapis/java-bigtable @@ -14,7 +14,7 @@ com.google.cloud google-cloud-bigtable-parent - 2.57.1 + 2.57.2-SNAPSHOT scm:git:git@github.com:googleapis/java-bigtable.git @@ -81,14 +81,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import com.google.cloud google-cloud-bigtable-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import @@ -99,7 +99,7 @@ com.google.cloud google-cloud-bigtable-emulator-core - 0.194.1 + 0.194.2-SNAPSHOT diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml index cb7014698427..606e2b9de7a5 100644 --- a/google-cloud-bigtable/pom.xml +++ b/google-cloud-bigtable/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-bigtable - 2.57.1 + 2.57.2-SNAPSHOT jar Google Cloud Bigtable https://github.com/googleapis/java-bigtable @@ -12,11 +12,11 @@ com.google.cloud google-cloud-bigtable-parent - 2.57.1 + 2.57.2-SNAPSHOT - 2.57.1 + 2.57.2-SNAPSHOT google-cloud-bigtable @@ -52,14 +52,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import com.google.cloud google-cloud-bigtable-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java index 8d409598c9af..a669f7c2900d 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java @@ -20,6 +20,6 @@ @InternalApi("For internal use only") public final class Version { // {x-version-update-start:google-cloud-bigtable:current} - public static String VERSION = "2.57.1"; + public static String VERSION = "2.57.2-SNAPSHOT"; // {x-version-update-end} } diff --git a/grpc-google-cloud-bigtable-admin-v2/pom.xml b/grpc-google-cloud-bigtable-admin-v2/pom.xml index 7730178c85d6..7aac741ec9b8 100644 --- a/grpc-google-cloud-bigtable-admin-v2/pom.xml +++ b/grpc-google-cloud-bigtable-admin-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-bigtable-admin-v2 - 2.57.1 + 2.57.2-SNAPSHOT grpc-google-cloud-bigtable-admin-v2 GRPC library for grpc-google-cloud-bigtable-admin-v2 com.google.cloud google-cloud-bigtable-parent - 2.57.1 + 2.57.2-SNAPSHOT @@ -18,14 +18,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import com.google.cloud google-cloud-bigtable-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import diff --git a/grpc-google-cloud-bigtable-v2/pom.xml b/grpc-google-cloud-bigtable-v2/pom.xml index a398e52d2904..e43a77957dde 100644 --- a/grpc-google-cloud-bigtable-v2/pom.xml +++ b/grpc-google-cloud-bigtable-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-bigtable-v2 - 2.57.1 + 2.57.2-SNAPSHOT grpc-google-cloud-bigtable-v2 GRPC library for grpc-google-cloud-bigtable-v2 com.google.cloud google-cloud-bigtable-parent - 2.57.1 + 2.57.2-SNAPSHOT @@ -18,14 +18,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import com.google.cloud google-cloud-bigtable-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import diff --git a/pom.xml b/pom.xml index 10fd5434a117..ce3e840658b2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ google-cloud-bigtable-parent pom - 2.57.1 + 2.57.2-SNAPSHOT Google Cloud Bigtable Parent https://github.com/googleapis/java-bigtable @@ -153,27 +153,27 @@ com.google.api.grpc proto-google-cloud-bigtable-v2 - 2.57.1 + 2.57.2-SNAPSHOT com.google.api.grpc proto-google-cloud-bigtable-admin-v2 - 2.57.1 + 2.57.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-bigtable-v2 - 2.57.1 + 2.57.2-SNAPSHOT com.google.api.grpc grpc-google-cloud-bigtable-admin-v2 - 2.57.1 + 2.57.2-SNAPSHOT com.google.cloud google-cloud-bigtable - 2.57.1 + 2.57.2-SNAPSHOT diff --git a/proto-google-cloud-bigtable-admin-v2/pom.xml b/proto-google-cloud-bigtable-admin-v2/pom.xml index e180faba421e..f3bb53f3ff7e 100644 --- a/proto-google-cloud-bigtable-admin-v2/pom.xml +++ b/proto-google-cloud-bigtable-admin-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-bigtable-admin-v2 - 2.57.1 + 2.57.2-SNAPSHOT proto-google-cloud-bigtable-admin-v2 PROTO library for proto-google-cloud-bigtable-admin-v2 com.google.cloud google-cloud-bigtable-parent - 2.57.1 + 2.57.2-SNAPSHOT @@ -18,14 +18,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import com.google.cloud google-cloud-bigtable-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import diff --git a/proto-google-cloud-bigtable-v2/pom.xml b/proto-google-cloud-bigtable-v2/pom.xml index 0bfd385e7712..f88e0f16b341 100644 --- a/proto-google-cloud-bigtable-v2/pom.xml +++ b/proto-google-cloud-bigtable-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-bigtable-v2 - 2.57.1 + 2.57.2-SNAPSHOT proto-google-cloud-bigtable-v2 PROTO library for proto-google-cloud-bigtable-v2 com.google.cloud google-cloud-bigtable-parent - 2.57.1 + 2.57.2-SNAPSHOT @@ -18,14 +18,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import com.google.cloud google-cloud-bigtable-bom - 2.57.1 + 2.57.2-SNAPSHOT pom import diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index d872a6e6304f..2baa5727c9e9 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,7 +28,7 @@ com.google.cloud google-cloud-bigtable - 2.57.1 + 2.57.2-SNAPSHOT diff --git a/test-proxy/pom.xml b/test-proxy/pom.xml index 4abde6c18e0c..e94f83f6b980 100644 --- a/test-proxy/pom.xml +++ b/test-proxy/pom.xml @@ -12,11 +12,11 @@ google-cloud-bigtable-parent com.google.cloud - 2.57.1 + 2.57.2-SNAPSHOT - 2.57.1 + 2.57.2-SNAPSHOT diff --git a/versions.txt b/versions.txt index 4a2dc4b24126..0c52b19a27cc 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-bigtable:2.57.1:2.57.1 -grpc-google-cloud-bigtable-admin-v2:2.57.1:2.57.1 -grpc-google-cloud-bigtable-v2:2.57.1:2.57.1 -proto-google-cloud-bigtable-admin-v2:2.57.1:2.57.1 -proto-google-cloud-bigtable-v2:2.57.1:2.57.1 -google-cloud-bigtable-emulator:0.194.1:0.194.1 -google-cloud-bigtable-emulator-core:0.194.1:0.194.1 +google-cloud-bigtable:2.57.1:2.57.2-SNAPSHOT +grpc-google-cloud-bigtable-admin-v2:2.57.1:2.57.2-SNAPSHOT +grpc-google-cloud-bigtable-v2:2.57.1:2.57.2-SNAPSHOT +proto-google-cloud-bigtable-admin-v2:2.57.1:2.57.2-SNAPSHOT +proto-google-cloud-bigtable-v2:2.57.1:2.57.2-SNAPSHOT +google-cloud-bigtable-emulator:0.194.1:0.194.2-SNAPSHOT +google-cloud-bigtable-emulator-core:0.194.1:0.194.2-SNAPSHOT From 4a5155649ea933ac869a4da56d05dd105ce67edf Mon Sep 17 00:00:00 2001 From: Igor Bernstein Date: Tue, 25 Mar 2025 16:58:25 -0400 Subject: [PATCH 2/8] chore: create a separate otel instance for internal metrics (#2522) * chore: create a separate otel instance for internal metrics Building on #2515, this creates a private instance of otel for internal metrics. This is necessary for a follow up pr that will introduce a new internal monitored resource Changes: - create a separate setting for disabling internal metrics (since internal metrics will not support customer provided exporters) - create internal metrics as part of BigtableClientContext creation - split off internal views Change-Id: Iaafc327f3f008bcc29510594210e0914342f84fe * fix typo Change-Id: Ia28cb95408ecf7e8ab785c5f54c0149388df202a * try to deflake the metrics test again Change-Id: I9f99e1a0f75f1337d09ba3833fe7833e03818519 * improve comment Change-Id: I3376b36bf41c9395b4fcd62c7905312dd2c3a6c9 --- .../data/v2/BigtableDataSettings.java | 15 ++++++ .../data/v2/stub/BigtableClientContext.java | 38 +++++++++++---- .../v2/stub/EnhancedBigtableStubSettings.java | 47 +++++++++++++++++++ .../BigtableCloudMonitoringExporter.java | 4 +- .../stub/metrics/BigtableExporterUtils.java | 2 +- .../stub/metrics/BuiltinMetricsConstants.java | 24 ++++++---- .../v2/stub/metrics/BuiltinMetricsView.java | 12 +---- .../bigtable/data/v2/stub/metrics/Util.java | 29 ++++++++++++ .../EnhancedBigtableStubSettingsTest.java | 1 + .../metrics/BuiltinMetricsTracerTest.java | 8 ++-- .../metrics/ErrorCountPerConnectionTest.java | 9 ++-- 11 files changed, 150 insertions(+), 39 deletions(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataSettings.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataSettings.java index ad1e70ba6aac..885cf36ab8d7 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataSettings.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataSettings.java @@ -128,6 +128,7 @@ public static Builder newBuilderForEmulator(String hostname, int port) { // disable channel refreshing when creating an emulator .setRefreshingChannel(false) .setMetricsProvider(NoopMetricsProvider.INSTANCE) // disable exporting metrics for emulator + .disableInternalMetrics() .setTransportChannelProvider( InstantiatingGrpcChannelProvider.newBuilder() .setMaxInboundMessageSize(256 * 1024 * 1024) @@ -297,6 +298,11 @@ public MetricsProvider getMetricsProvider() { return stubSettings.getMetricsProvider(); } + /** Checks if internal metrics are enabled */ + public boolean areInternalMetricsEnabled() { + return stubSettings.areInternalMetricsEnabled(); + } + /** Returns the underlying RPC settings. */ public EnhancedBigtableStubSettings getStubSettings() { return stubSettings; @@ -570,6 +576,15 @@ public MetricsProvider getMetricsProvider() { return stubSettings.getMetricsProvider(); } + public Builder disableInternalMetrics() { + stubSettings.disableInternalMetrics(); + return this; + } + + public boolean areInternalMetricsEnabled() { + return stubSettings.areInternalMetricsEnabled(); + } + /** * Returns the underlying settings for making RPC calls. The settings should be changed with * care. diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java index a2587b0dd90a..a3160295a1c3 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java @@ -33,6 +33,7 @@ import com.google.cloud.bigtable.data.v2.stub.metrics.NoopMetricsProvider; import io.grpc.ManagedChannelBuilder; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.sdk.OpenTelemetrySdk; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -50,6 +51,7 @@ public class BigtableClientContext { private static final Logger logger = Logger.getLogger(BigtableClientContext.class.getName()); @Nullable private final OpenTelemetry openTelemetry; + @Nullable private final OpenTelemetrySdk internalOpenTelemetry; private final ClientContext clientContext; public static BigtableClientContext create(EnhancedBigtableStubSettings settings) @@ -84,18 +86,31 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings ? ((InstantiatingGrpcChannelProvider) builder.getTransportChannelProvider()).toBuilder() : null; - ErrorCountPerConnectionMetricTracker errorCountPerConnectionMetricTracker = null; + @Nullable OpenTelemetrySdk internalOtel = null; + @Nullable ErrorCountPerConnectionMetricTracker errorCountPerConnectionMetricTracker = null; + + // Internal metrics are scoped to the connections, so we need a mutable transportProvider, + // otherwise there is + // no reason to build the internal OtelProvider + if (transportProvider != null) { + internalOtel = + settings + .getInternalMetricsProvider() + .createOtelProvider(credentials, settings.getMetricsEndpoint()); + if (internalOtel != null) { + // Set up per connection error count tracker if all dependencies are met: + // a configurable transport provider + otel + errorCountPerConnectionMetricTracker = + setupPerConnectionErrorTracer(builder, transportProvider, internalOtel); + } + } if (transportProvider != null) { // Set up cookie holder if routing cookie is enabled if (builder.getEnableRoutingCookie()) { setupCookieHolder(transportProvider); } - // Set up per connection error count tracker if OpenTelemetry is not null - if (openTelemetry != null) { - errorCountPerConnectionMetricTracker = - setupPerConnectionErrorTracer(builder, transportProvider, openTelemetry); - } + // Inject channel priming if enabled if (builder.isRefreshingChannel()) { transportProvider.setChannelPrimer( @@ -117,12 +132,16 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings clientContext.getExecutor()); } - return new BigtableClientContext(clientContext, openTelemetry); + return new BigtableClientContext(clientContext, openTelemetry, internalOtel); } - private BigtableClientContext(ClientContext clientContext, OpenTelemetry openTelemetry) { + private BigtableClientContext( + ClientContext clientContext, + OpenTelemetry openTelemetry, + @Nullable OpenTelemetrySdk internalOtel) { this.clientContext = clientContext; this.openTelemetry = openTelemetry; + this.internalOpenTelemetry = internalOtel; } public OpenTelemetry getOpenTelemetry() { @@ -137,6 +156,9 @@ public void close() throws Exception { for (BackgroundResource resource : clientContext.getBackgroundResources()) { resource.close(); } + if (internalOpenTelemetry != null) { + internalOpenTelemetry.close(); + } } private static OpenTelemetry getOpenTelemetryFromMetricsProvider( diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java index d756a523707f..249288131541 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java @@ -32,6 +32,7 @@ import com.google.api.gax.rpc.StubSettings; import com.google.api.gax.rpc.TransportChannelProvider; import com.google.api.gax.rpc.UnaryCallSettings; +import com.google.auth.Credentials; import com.google.bigtable.v2.FeatureFlags; import com.google.bigtable.v2.PingAndWarmRequest; import com.google.cloud.bigtable.Version; @@ -50,6 +51,7 @@ import com.google.cloud.bigtable.data.v2.models.sql.BoundStatement; import com.google.cloud.bigtable.data.v2.stub.metrics.DefaultMetricsProvider; import com.google.cloud.bigtable.data.v2.stub.metrics.MetricsProvider; +import com.google.cloud.bigtable.data.v2.stub.metrics.Util; import com.google.cloud.bigtable.data.v2.stub.mutaterows.MutateRowsBatchingDescriptor; import com.google.cloud.bigtable.data.v2.stub.readrows.ReadRowsBatchingDescriptor; import com.google.common.base.MoreObjects; @@ -57,6 +59,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import io.opentelemetry.sdk.OpenTelemetrySdk; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -283,6 +286,7 @@ public class EnhancedBigtableStubSettings extends StubSettings getJwtAudienceMapping() { return jwtAudienceMapping; @@ -1304,7 +1337,21 @@ public String toString() { .add("prepareQuerySettings", prepareQuerySettings) .add("metricsProvider", metricsProvider) .add("metricsEndpoint", metricsEndpoint) + .add("areInternalMetricsEnabled", internalMetricsProvider == DEFAULT_INTERNAL_OTEL_PROVIDER) .add("parent", super.toString()) .toString(); } + + @InternalApi + @FunctionalInterface + public interface InternalMetricsProvider { + @Nullable + OpenTelemetrySdk createOtelProvider(Credentials creds, @Nullable String endpoint) + throws IOException; + } + + private static final InternalMetricsProvider DEFAULT_INTERNAL_OTEL_PROVIDER = + Util::newInternalOpentelemetry; + private static final InternalMetricsProvider DISABLED_INTERNAL_OTEL_PROVIDER = + (ignored1, ignored2) -> null; } 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 97c465127891..e39fb4fde374 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 @@ -296,7 +296,7 @@ static class PublicTimeSeriesConverter implements TimeSeriesConverter { private final String taskId; PublicTimeSeriesConverter() { - this(BigtableExporterUtils.DEFAULT_TABLE_VALUE.get()); + this(BigtableExporterUtils.DEFAULT_TASK_VALUE.get()); } PublicTimeSeriesConverter(String taskId) { @@ -326,7 +326,7 @@ static class InternalTimeSeriesConverter implements TimeSeriesConverter { private final Supplier monitoredResource; InternalTimeSeriesConverter(Supplier monitoredResource) { - this(monitoredResource, BigtableExporterUtils.DEFAULT_TABLE_VALUE.get()); + this(monitoredResource, BigtableExporterUtils.DEFAULT_TASK_VALUE.get()); } InternalTimeSeriesConverter(Supplier monitoredResource, String taskId) { 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 904119891cf1..20ba76aa9faa 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 @@ -95,7 +95,7 @@ private BigtableExporterUtils() {} */ private static String defaultTaskValue = null; - static final Supplier DEFAULT_TABLE_VALUE = + static final Supplier DEFAULT_TASK_VALUE = Suppliers.memoize(BigtableExporterUtils::computeDefaultTaskValue); private static String computeDefaultTaskValue() { diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java index 62ac0f11535c..784d824337e8 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java @@ -140,6 +140,20 @@ static void defineView( viewMap.put(selector, view); } + public static Map getInternalViews() { + ImmutableMap.Builder views = ImmutableMap.builder(); + defineView( + views, + PER_CONNECTION_ERROR_COUNT_NAME, + AGGREGATION_PER_CONNECTION_ERROR_COUNT_HISTOGRAM, + InstrumentType.HISTOGRAM, + "1", + ImmutableSet.builder() + .add(BIGTABLE_PROJECT_ID_KEY, INSTANCE_ID_KEY, APP_PROFILE_KEY, CLIENT_NAME_KEY) + .build()); + return views.build(); + } + public static Map getAllViews() { ImmutableMap.Builder views = ImmutableMap.builder(); @@ -205,16 +219,6 @@ public static Map getAllViews() { InstrumentType.COUNTER, "1", ImmutableSet.builder().addAll(COMMON_ATTRIBUTES).add(STATUS_KEY).build()); - - defineView( - views, - PER_CONNECTION_ERROR_COUNT_NAME, - AGGREGATION_PER_CONNECTION_ERROR_COUNT_HISTOGRAM, - InstrumentType.HISTOGRAM, - "1", - ImmutableSet.builder() - .add(BIGTABLE_PROJECT_ID_KEY, INSTANCE_ID_KEY, APP_PROFILE_KEY, CLIENT_NAME_KEY) - .build()); defineView( views, REMAINING_DEADLINE_NAME, 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 0e179aa86621..3bb07e3e4227 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 @@ -17,7 +17,6 @@ import com.google.auth.Credentials; import com.google.auth.oauth2.GoogleCredentials; -import com.google.common.base.Suppliers; import io.opentelemetry.sdk.metrics.InstrumentSelector; import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; import io.opentelemetry.sdk.metrics.View; @@ -106,20 +105,11 @@ public static void registerBuiltinMetrics( credentials, endpoint, new BigtableCloudMonitoringExporter.PublicTimeSeriesConverter()); - MetricExporter internalExporter = - BigtableCloudMonitoringExporter.create( - "application metrics", - credentials, - endpoint, - new BigtableCloudMonitoringExporter.InternalTimeSeriesConverter( - Suppliers.memoize(BigtableExporterUtils::detectResourceSafe))); for (Map.Entry entry : BuiltinMetricsConstants.getAllViews().entrySet()) { builder.registerView(entry.getKey(), entry.getValue()); } - builder - .registerMetricReader(PeriodicMetricReader.create(publicExporter)) - .registerMetricReader(PeriodicMetricReader.create(internalExporter)); + builder.registerMetricReader(PeriodicMetricReader.create(publicExporter)); } } diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/Util.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/Util.java index 590917c81421..08d676474110 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/Util.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/Util.java @@ -22,6 +22,7 @@ import com.google.api.gax.rpc.ApiException; import com.google.api.gax.rpc.StatusCode; import com.google.api.gax.rpc.StatusCode.Code; +import com.google.auth.Credentials; import com.google.bigtable.v2.AuthorizedViewName; import com.google.bigtable.v2.CheckAndMutateRowRequest; import com.google.bigtable.v2.GenerateInitialChangeStreamPartitionsRequest; @@ -33,6 +34,7 @@ import com.google.bigtable.v2.ResponseParams; import com.google.bigtable.v2.SampleRowKeysRequest; import com.google.bigtable.v2.TableName; +import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; import com.google.protobuf.InvalidProtocolBufferException; import io.grpc.CallOptions; @@ -41,6 +43,13 @@ import io.grpc.StatusException; import io.grpc.StatusRuntimeException; import io.opencensus.tags.TagValue; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.metrics.InstrumentSelector; +import io.opentelemetry.sdk.metrics.SdkMeterProvider; +import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; +import io.opentelemetry.sdk.metrics.View; +import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import java.io.IOException; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Arrays; @@ -237,4 +246,24 @@ static GrpcCallContext injectBigtableStreamTracer( throw new RuntimeException("Unexpected context class: " + context.getClass().getName()); } } + + public static OpenTelemetrySdk newInternalOpentelemetry( + Credentials credentials, @Nullable String metricsEndpoint) throws IOException { + SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder(); + + for (Map.Entry e : + BuiltinMetricsConstants.getInternalViews().entrySet()) { + meterProviderBuilder.registerView(e.getKey(), e.getValue()); + } + + meterProviderBuilder.registerMetricReader( + PeriodicMetricReader.create( + BigtableCloudMonitoringExporter.create( + "application metrics", + credentials, + metricsEndpoint, + new BigtableCloudMonitoringExporter.InternalTimeSeriesConverter( + Suppliers.memoize(BigtableExporterUtils::detectResourceSafe))))); + return OpenTelemetrySdk.builder().setMeterProvider(meterProviderBuilder.build()).build(); + } } diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettingsTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettingsTest.java index 34c2fbd5a85f..4cb91ba03e05 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettingsTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettingsTest.java @@ -1020,6 +1020,7 @@ public void enableRetryInfoFalseValueTest() throws IOException { "prepareQuerySettings", "metricsProvider", "metricsEndpoint", + "areInternalMetricsEnabled", }; @Test diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerTest.java index 2682f753f791..72787ba2e53f 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerTest.java @@ -102,6 +102,7 @@ import java.nio.charset.Charset; import java.time.Duration; import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -968,11 +969,12 @@ public ProxiedSocketAddress proxyFor(SocketAddress socketAddress) throws IOExcep Duration getCurrentDelayUsed() { Instant local = lastProxyDelay; - // If the delay was never injected + // If the delay was never injected - add 1 ms for channel establishment if (local == null) { - return Duration.ZERO; + return Duration.ofMillis(1); } - Duration duration = Duration.between(local, Instant.now()); + Duration duration = + Duration.between(local, Instant.now()).plus(Duration.of(10, ChronoUnit.MICROS)); assertWithMessage("test burned through all channel blocking latency during setup") .that(duration) diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/ErrorCountPerConnectionTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/ErrorCountPerConnectionTest.java index b34d21da176a..6454c1aaa020 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/ErrorCountPerConnectionTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/ErrorCountPerConnectionTest.java @@ -89,9 +89,9 @@ public void setup() throws Exception { SdkMeterProviderBuilder meterProvider = SdkMeterProvider.builder().registerMetricReader(metricReader); - for (Map.Entry entry : - BuiltinMetricsConstants.getAllViews().entrySet()) { - meterProvider.registerView(entry.getKey(), entry.getValue()); + for (Map.Entry e : + BuiltinMetricsConstants.getInternalViews().entrySet()) { + meterProvider.registerView(e.getKey(), e.getValue()); } OpenTelemetrySdk otel = @@ -103,7 +103,8 @@ public void setup() throws Exception { .setBackgroundExecutorProvider(FixedExecutorProvider.create(executors)) .setProjectId("fake-project") .setInstanceId("fake-instance") - .setMetricsProvider(CustomOpenTelemetryMetricsProvider.create(otel)); + .setMetricsProvider(NoopMetricsProvider.INSTANCE) + .setInternalMetricsProvider((ignored1, ignored2) -> otel); runnableCaptor = ArgumentCaptor.forClass(Runnable.class); when(executors.scheduleAtFixedRate(runnableCaptor.capture(), anyLong(), anyLong(), any())) From 522fb8c28a125d3ac0403cda538b74b78f9b422e Mon Sep 17 00:00:00 2001 From: Igor Bernstein Date: Wed, 26 Mar 2025 11:41:57 -0400 Subject: [PATCH 3/8] chore: migrate internal metrics to use bigtable_client monitored resource (#2544) * chore: migrate internal metrics to use bigtable_client monitored resource This unifies the k8s_container & gce_instance monitored resources. In addition it adds some client specific attributes on the new monitored resource to make it easier to debug customer issues Change-Id: Ic0a3b2efeb486a82dab53028ee524fe473a619ad * fix test Change-Id: I3ed6bd6f3dd678ed474b8a9a5daf3d68626b7569 --- .../data/v2/stub/BigtableClientContext.java | 4 +- .../v2/stub/EnhancedBigtableStubSettings.java | 4 +- .../BigtableCloudMonitoringExporter.java | 8 +- .../stub/metrics/BigtableExporterUtils.java | 130 ++++++++++-------- .../bigtable/data/v2/stub/metrics/Util.java | 8 +- .../BigtableCloudMonitoringExporterTest.java | 48 ++++--- 6 files changed, 111 insertions(+), 91 deletions(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java index a3160295a1c3..b8a5a3074b9e 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java @@ -94,9 +94,7 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings // no reason to build the internal OtelProvider if (transportProvider != null) { internalOtel = - settings - .getInternalMetricsProvider() - .createOtelProvider(credentials, settings.getMetricsEndpoint()); + settings.getInternalMetricsProvider().createOtelProvider(settings, credentials); if (internalOtel != null) { // Set up per connection error count tracker if all dependencies are met: // a configurable transport provider + otel diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java index 249288131541..28d93863c958 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubSettings.java @@ -1346,8 +1346,8 @@ public String toString() { @FunctionalInterface public interface InternalMetricsProvider { @Nullable - OpenTelemetrySdk createOtelProvider(Credentials creds, @Nullable String endpoint) - throws IOException; + OpenTelemetrySdk createOtelProvider( + EnhancedBigtableStubSettings userSettings, Credentials creds) throws IOException; } private static final InternalMetricsProvider DEFAULT_INTERNAL_OTEL_PROVIDER = 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 e39fb4fde374..f9eccbf2dddd 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 @@ -322,16 +322,10 @@ static class InternalTimeSeriesConverter implements TimeSeriesConverter { .map(m -> METER_NAME + m) .collect(ImmutableList.toImmutableList()); - private final String taskId; private final Supplier monitoredResource; InternalTimeSeriesConverter(Supplier monitoredResource) { - this(monitoredResource, BigtableExporterUtils.DEFAULT_TASK_VALUE.get()); - } - - InternalTimeSeriesConverter(Supplier monitoredResource, String taskId) { this.monitoredResource = monitoredResource; - this.taskId = taskId; } @Override @@ -352,7 +346,7 @@ public Map> convert(Collection metricD return ImmutableMap.of( ProjectName.of(monitoredResource.getLabelsOrThrow(APPLICATION_RESOURCE_PROJECT_ID)), BigtableExporterUtils.convertToApplicationResourceTimeSeries( - relevantData, taskId, monitoredResource)); + relevantData, monitoredResource)); } } } 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 20ba76aa9faa..9a1a28ef6b68 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 @@ -36,13 +36,16 @@ import com.google.api.Distribution; import com.google.api.Metric; import com.google.api.MonitoredResource; +import com.google.cloud.bigtable.Version; +import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStubSettings; import com.google.cloud.opentelemetry.detection.AttributeKeys; import com.google.cloud.opentelemetry.detection.DetectedPlatform; import com.google.cloud.opentelemetry.detection.GCPPlatformDetector; -import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.monitoring.v3.Point; import com.google.monitoring.v3.ProjectName; @@ -65,18 +68,22 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import javax.annotation.Nullable; /** Utils to convert OpenTelemetry types to Google Cloud Monitoring types. */ class BigtableExporterUtils { + private static final String CLIENT_NAME = "java-bigtable/" + Version.VERSION; private static final Logger logger = Logger.getLogger(BigtableExporterUtils.class.getName()); @@ -87,6 +94,11 @@ class BigtableExporterUtils { ImmutableSet.of( BIGTABLE_PROJECT_ID_KEY, INSTANCE_ID_KEY, TABLE_ID_KEY, CLUSTER_ID_KEY, ZONE_ID_KEY); + private static final Map SUPPORTED_PLATFORM_MAP = + ImmutableMap.of( + GCPPlatformDetector.SupportedPlatform.GOOGLE_COMPUTE_ENGINE, "gcp_compute_engine", + GCPPlatformDetector.SupportedPlatform.GOOGLE_KUBERNETES_ENGINE, "gcp_kubernetes_engine"); + private BigtableExporterUtils() {} /** @@ -146,7 +158,7 @@ static Map> convertToBigtableTimeSeries( } static List convertToApplicationResourceTimeSeries( - Collection collection, String taskId, MonitoredResource applicationResource) { + Collection collection, MonitoredResource applicationResource) { Preconditions.checkNotNull( applicationResource, "convert application metrics is called when the supported resource is not detected"); @@ -160,16 +172,18 @@ static List convertToApplicationResourceTimeSeries( .map( pointData -> convertPointToApplicationResourceTimeSeries( - metricData, pointData, taskId, applicationResource)) + metricData, pointData, applicationResource)) .forEach(allTimeSeries::add); } return allTimeSeries; } @Nullable - static MonitoredResource detectResourceSafe() { + static MonitoredResource createInternalMonitoredResource(EnhancedBigtableStubSettings settings) { try { - return detectResource(); + MonitoredResource monitoredResource = detectResource(settings); + logger.log(Level.FINE, "Internal metrics monitored resource: %s", monitoredResource); + return monitoredResource; } catch (Exception e) { logger.log( Level.WARNING, @@ -180,64 +194,66 @@ static MonitoredResource detectResourceSafe() { } @Nullable - private static MonitoredResource detectResource() { + private static MonitoredResource detectResource(EnhancedBigtableStubSettings settings) { GCPPlatformDetector detector = GCPPlatformDetector.DEFAULT_INSTANCE; DetectedPlatform detectedPlatform = detector.detectPlatform(); - 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 " + detectedPlatform.getSupportedPlatform(), - e); + + @Nullable + String cloud_platform = SUPPORTED_PLATFORM_MAP.get(detectedPlatform.getSupportedPlatform()); + if (cloud_platform == null) { + return null; } - return monitoredResource; - } - private static MonitoredResource createGceMonitoredResource( - String projectId, Map attributes) { - return MonitoredResource.newBuilder() - .setType("gce_instance") - .putLabels("project_id", projectId) - .putLabels("instance_id", getAttribute(attributes, AttributeKeys.GCE_INSTANCE_ID)) - .putLabels("zone", getAttribute(attributes, AttributeKeys.GCE_AVAILABILITY_ZONE)) - .build(); - } + Map attrs = detectedPlatform.getAttributes(); + ImmutableList locationKeys = + ImmutableList.of( + AttributeKeys.GCE_CLOUD_REGION, + AttributeKeys.GCE_AVAILABILITY_ZONE, + AttributeKeys.GKE_LOCATION_TYPE_REGION, + AttributeKeys.GKE_CLUSTER_LOCATION); + + String region = + locationKeys.stream().map(attrs::get).filter(Objects::nonNull).findFirst().orElse("global"); + + // Deal with possibility of a zone. Zones are of the form us-east1-c, but we want a region + // which, which is us-east1. + region = Arrays.stream(region.split("-")).limit(2).collect(Collectors.joining("-")); + + String hostname = attrs.get(AttributeKeys.GCE_INSTANCE_HOSTNAME); + // if (hostname == null) { + // hostname = attrs.get(AttributeKeys.SERVERLESS_COMPUTE_NAME); + // } + // if (hostname == null) { + // hostname = attrs.get(AttributeKeys.GAE_MODULE_NAME); + // } + if (hostname == null) { + hostname = System.getenv("HOSTNAME"); + } + if (hostname == null) { + try { + hostname = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException ignored) { + } + } + if (hostname == null) { + hostname = ""; + } - private static MonitoredResource createGkeMonitoredResource( - String projectId, Map attributes) { return MonitoredResource.newBuilder() - .setType("k8s_container") - .putLabels("project_id", projectId) - .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"), "")) + .setType("bigtable_client") + .putLabels("project_id", settings.getProjectId()) + .putLabels("instance", settings.getInstanceId()) + .putLabels("app_profile", settings.getAppProfileId()) + .putLabels("client_project", detectedPlatform.getProjectId()) + .putLabels("region", region) + .putLabels("cloud_platform", cloud_platform) + .putLabels("host_id", attrs.get(AttributeKeys.GKE_HOST_ID)) + .putLabels("host_name", hostname) + .putLabels("client_name", CLIENT_NAME) + .putLabels("uuid", DEFAULT_TASK_VALUE.get()) .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 = @@ -275,10 +291,7 @@ private static TimeSeries convertPointToBigtableTimeSeries( } private static TimeSeries convertPointToApplicationResourceTimeSeries( - MetricData metricData, - PointData pointData, - String taskId, - MonitoredResource applicationResource) { + MetricData metricData, PointData pointData, MonitoredResource applicationResource) { TimeSeries.Builder builder = TimeSeries.newBuilder() .setMetricKind(convertMetricKind(metricData)) @@ -292,7 +305,6 @@ private static TimeSeries convertPointToApplicationResourceTimeSeries( metricBuilder.putLabels(key.getKey(), String.valueOf(attributes.get(key))); } - metricBuilder.putLabels(CLIENT_UID_KEY.getKey(), taskId); builder.setMetric(metricBuilder.build()); TimeInterval timeInterval = diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/Util.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/Util.java index 08d676474110..be3ae5e2e46f 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/Util.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/Util.java @@ -34,6 +34,7 @@ import com.google.bigtable.v2.ResponseParams; import com.google.bigtable.v2.SampleRowKeysRequest; import com.google.bigtable.v2.TableName; +import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStubSettings; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; import com.google.protobuf.InvalidProtocolBufferException; @@ -248,7 +249,7 @@ static GrpcCallContext injectBigtableStreamTracer( } public static OpenTelemetrySdk newInternalOpentelemetry( - Credentials credentials, @Nullable String metricsEndpoint) throws IOException { + EnhancedBigtableStubSettings settings, Credentials credentials) throws IOException { SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder(); for (Map.Entry e : @@ -261,9 +262,10 @@ public static OpenTelemetrySdk newInternalOpentelemetry( BigtableCloudMonitoringExporter.create( "application metrics", credentials, - metricsEndpoint, + settings.getMetricsEndpoint(), new BigtableCloudMonitoringExporter.InternalTimeSeriesConverter( - Suppliers.memoize(BigtableExporterUtils::detectResourceSafe))))); + Suppliers.memoize( + () -> BigtableExporterUtils.createInternalMonitoredResource(settings)))))); return OpenTelemetrySdk.builder().setMeterProvider(meterProviderBuilder.build()).build(); } } diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporterTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporterTest.java index 8e429f2f3ef7..0a8ad0afbd32 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporterTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableCloudMonitoringExporterTest.java @@ -315,11 +315,18 @@ public void testTimeSeriesForMetricWithGceOrGkeResource() { new BigtableCloudMonitoringExporter.InternalTimeSeriesConverter( Suppliers.ofInstance( MonitoredResource.newBuilder() - .setType("gce-instance") - .putLabels("some-gce-key", "some-gce-value") + .setType("bigtable_client") .putLabels("project_id", gceProjectId) - .build()), - taskId)); + .putLabels("instance", "resource-instance") + .putLabels("app_profile", "resource-app-profile") + .putLabels("client_project", "client-project") + .putLabels("region", "cleint-region") + .putLabels("cloud_platform", "gce_instance") + .putLabels("host_id", "1234567890") + .putLabels("host_name", "harold") + .putLabels("client_name", "java/1234") + .putLabels("uuid", "something") + .build()))); ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(CreateTimeSeriesRequest.class); @@ -371,21 +378,28 @@ public void testTimeSeriesForMetricWithGceOrGkeResource() { com.google.monitoring.v3.TimeSeries timeSeries = request.getTimeSeriesList().get(0); assertThat(timeSeries.getResource().getLabelsMap()) - .containsExactly("some-gce-key", "some-gce-value", "project_id", gceProjectId); + .isEqualTo( + ImmutableMap.builder() + .put("project_id", gceProjectId) + .put("instance", "resource-instance") + .put("app_profile", "resource-app-profile") + .put("client_project", "client-project") + .put("region", "cleint-region") + .put("cloud_platform", "gce_instance") + .put("host_id", "1234567890") + .put("host_name", "harold") + .put("client_name", "java/1234") + .put("uuid", "something") + .build()); - assertThat(timeSeries.getMetric().getLabelsMap()).hasSize(5); assertThat(timeSeries.getMetric().getLabelsMap()) - .containsAtLeast( - BIGTABLE_PROJECT_ID_KEY.getKey(), - projectId, - INSTANCE_ID_KEY.getKey(), - instanceId, - APP_PROFILE_KEY.getKey(), - appProfileId, - CLIENT_NAME_KEY.getKey(), - clientName, - CLIENT_UID_KEY.getKey(), - taskId); + .isEqualTo( + ImmutableMap.builder() + .put(BIGTABLE_PROJECT_ID_KEY.getKey(), projectId) + .put(INSTANCE_ID_KEY.getKey(), instanceId) + .put(APP_PROFILE_KEY.getKey(), appProfileId) + .put(CLIENT_NAME_KEY.getKey(), clientName) + .build()); } @Test From 0cc3997f7cf7aa6c31a1787f8c072a663b12717e Mon Sep 17 00:00:00 2001 From: Igor Bernstein Date: Thu, 27 Mar 2025 09:51:07 -0400 Subject: [PATCH 4/8] chore: export internal DirectAccess gRPC metrics to the new bigtable_client monitored resource (#2545) This will export a relevant subset of the metrics described in https://github.com/grpc/proposal/blob/master/A78-grpc-metrics-wrr-pf-xds.md as internal metrics to help rollout of DirectAccess Change-Id: Ifddadb84d091f0f904f8f0f6e8da52de552e9757 --- google-cloud-bigtable/pom.xml | 4 ++ .../data/v2/stub/BigtableClientContext.java | 32 +++++++++ .../BigtableCloudMonitoringExporter.java | 12 +--- .../stub/metrics/BigtableExporterUtils.java | 71 +++++++++++++++---- .../stub/metrics/BuiltinMetricsConstants.java | 36 +++++++++- 5 files changed, 130 insertions(+), 25 deletions(-) diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml index 606e2b9de7a5..6fbb4db9acbf 100644 --- a/google-cloud-bigtable/pom.xml +++ b/google-cloud-bigtable/pom.xml @@ -202,6 +202,10 @@ io.grpc grpc-protobuf + + io.grpc + grpc-opentelemetry + org.threeten threetenbp diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java index b8a5a3074b9e..3fbdf29f39bf 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableClientContext.java @@ -26,12 +26,14 @@ import com.google.auth.oauth2.ServiceAccountJwtAccessCredentials; import com.google.cloud.bigtable.data.v2.BigtableDataSettings; import com.google.cloud.bigtable.data.v2.internal.JwtCredentialsWithAudience; +import com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants; import com.google.cloud.bigtable.data.v2.stub.metrics.CustomOpenTelemetryMetricsProvider; import com.google.cloud.bigtable.data.v2.stub.metrics.DefaultMetricsProvider; import com.google.cloud.bigtable.data.v2.stub.metrics.ErrorCountPerConnectionMetricTracker; import com.google.cloud.bigtable.data.v2.stub.metrics.MetricsProvider; import com.google.cloud.bigtable.data.v2.stub.metrics.NoopMetricsProvider; import io.grpc.ManagedChannelBuilder; +import io.grpc.opentelemetry.GrpcOpenTelemetry; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.sdk.OpenTelemetrySdk; import java.io.IOException; @@ -100,6 +102,9 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings // a configurable transport provider + otel errorCountPerConnectionMetricTracker = setupPerConnectionErrorTracer(builder, transportProvider, internalOtel); + + // Configure grpc metrics + configureGrpcOtel(transportProvider, internalOtel); } } @@ -133,6 +138,33 @@ public static BigtableClientContext create(EnhancedBigtableStubSettings settings return new BigtableClientContext(clientContext, openTelemetry, internalOtel); } + private static void configureGrpcOtel( + InstantiatingGrpcChannelProvider.Builder transportProvider, OpenTelemetrySdk otel) { + + GrpcOpenTelemetry grpcOtel = + GrpcOpenTelemetry.newBuilder() + .sdk(otel) + .addOptionalLabel("grpc.lb.locality") + // Disable default grpc metrics + .disableAllMetrics() + // Enable specific grpc metrics + .enableMetrics(BuiltinMetricsConstants.GRPC_METRICS.keySet()) + .build(); + + @SuppressWarnings("rawtypes") + ApiFunction oldConfigurator = + transportProvider.getChannelConfigurator(); + + transportProvider.setChannelConfigurator( + b -> { + if (oldConfigurator != null) { + b = oldConfigurator.apply(b); + } + grpcOtel.configureChannelBuilder(b); + return b; + }); + } + private BigtableClientContext( ClientContext clientContext, OpenTelemetry openTelemetry, 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 f9eccbf2dddd..33b72d32aa18 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,8 +172,10 @@ private CompletableResultCode doExport(Collection metricData) { // Skips exporting if there's none if (bigtableTimeSeries.isEmpty()) { + System.out.println("skipping empty metrics: " + this.exporterName); return CompletableResultCode.ofSuccess(); } + System.out.println(bigtableTimeSeries); CompletableResultCode exportCode = new CompletableResultCode(); bigtableTimeSeries.forEach( @@ -335,18 +337,10 @@ public Map> convert(Collection metricD return ImmutableMap.of(); } - List relevantData = - metricData.stream() - .filter(md -> APPLICATION_METRICS.contains(md.getName())) - .collect(Collectors.toList()); - if (relevantData.isEmpty()) { - return ImmutableMap.of(); - } - return ImmutableMap.of( ProjectName.of(monitoredResource.getLabelsOrThrow(APPLICATION_RESOURCE_PROJECT_ID)), BigtableExporterUtils.convertToApplicationResourceTimeSeries( - relevantData, monitoredResource)); + metricData, monitoredResource)); } } } 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 9a1a28ef6b68..7998b5cfc61e 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 @@ -28,7 +28,9 @@ import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.BIGTABLE_PROJECT_ID_KEY; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CLIENT_UID_KEY; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CLUSTER_ID_KEY; +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.GRPC_METRICS; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.INSTANCE_ID_KEY; +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.INTERNAL_METRICS; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.METER_NAME; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.TABLE_ID_KEY; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.ZONE_ID_KEY; @@ -74,6 +76,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.logging.Level; @@ -164,16 +167,12 @@ static List convertToApplicationResourceTimeSeries( "convert application metrics is called when the supported resource is not detected"); List allTimeSeries = new ArrayList<>(); for (MetricData metricData : collection) { - if (!metricData.getInstrumentationScopeInfo().getName().equals(METER_NAME)) { - // Filter out metric data for instruments that are not part of the bigtable builtin metrics - continue; - } metricData.getData().getPoints().stream() .map( pointData -> - convertPointToApplicationResourceTimeSeries( - metricData, pointData, applicationResource)) - .forEach(allTimeSeries::add); + createInternalMetricsTimeSeries(metricData, pointData, applicationResource)) + .filter(Optional::isPresent) + .forEach(ts -> ts.ifPresent(allTimeSeries::add)); } return allTimeSeries; } @@ -290,7 +289,7 @@ private static TimeSeries convertPointToBigtableTimeSeries( return builder.build(); } - private static TimeSeries convertPointToApplicationResourceTimeSeries( + private static Optional createInternalMetricsTimeSeries( MetricData metricData, PointData pointData, MonitoredResource applicationResource) { TimeSeries.Builder builder = TimeSeries.newBuilder() @@ -298,11 +297,20 @@ private static TimeSeries convertPointToApplicationResourceTimeSeries( .setValueType(convertValueType(metricData.getType())) .setResource(applicationResource); - Metric.Builder metricBuilder = Metric.newBuilder().setType(metricData.getName()); - - Attributes attributes = pointData.getAttributes(); - for (AttributeKey key : attributes.asMap().keySet()) { - metricBuilder.putLabels(key.getKey(), String.valueOf(attributes.get(key))); + final Metric.Builder metricBuilder; + // TODO: clean this up + // Internal metrics are based on views that include the metric prefix + // gRPC metrics dont have views and are dot encoded + // To unify these: + // - the useless views should be removed + // - internal metrics should use relative metric names w/o the prefix + if (INTERNAL_METRICS.contains(metricData.getName())) { + metricBuilder = newApplicationMetricBuilder(metricData.getName(), pointData.getAttributes()); + } else if (GRPC_METRICS.containsKey(metricData.getName())) { + metricBuilder = newGrpcMetricBuilder(metricData.getName(), pointData.getAttributes()); + } else { + logger.fine("Skipping unexpected internal metric: " + metricData.getName()); + return Optional.empty(); } builder.setMetric(metricBuilder.build()); @@ -314,7 +322,42 @@ private static TimeSeries convertPointToApplicationResourceTimeSeries( .build(); builder.addPoints(createPoint(metricData.getType(), pointData, timeInterval)); - return builder.build(); + return Optional.of(builder.build()); + } + + private static Metric.Builder newApplicationMetricBuilder( + String metricName, Attributes attributes) { + // TODO: unify handling of metric prefixes + Metric.Builder metricBuilder = Metric.newBuilder().setType(metricName); + for (Map.Entry, Object> e : attributes.asMap().entrySet()) { + metricBuilder.putLabels(e.getKey().getKey(), String.valueOf(e.getValue())); + } + return metricBuilder; + } + + private static Metric.Builder newGrpcMetricBuilder(String grpcMetricName, Attributes attributes) { + Set allowedAttrs = GRPC_METRICS.get(grpcMetricName); + + Metric.Builder metricBuilder = + Metric.newBuilder() + .setType("bigtable.googleapis.com/internal/client/" + grpcMetricName.replace('.', '/')); + for (Map.Entry, Object> e : attributes.asMap().entrySet()) { + String attrKey = e.getKey().getKey(); + Object attrValue = e.getValue(); + + // gRPC metrics are experimental and can change attribute names, to avoid incompatibility with + // the predefined + // metric schemas in stackdriver, filter out unknown keys + if (!allowedAttrs.contains(attrKey)) { + continue; + } + // translate grpc key format to be compatible with cloud monitoring: + // grpc.xds_client.server_failure -> grpc_xds_client_server_failure + String normalizedKey = attrKey.replace('.', '_'); + metricBuilder.putLabels(normalizedKey, String.valueOf(attrValue)); + } + + return metricBuilder; } private static MetricKind convertMetricKind(MetricData metricData) { diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java index 784d824337e8..cf24de1330eb 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java @@ -50,6 +50,8 @@ public class BuiltinMetricsConstants { static final AttributeKey STATUS_KEY = AttributeKey.stringKey("status"); static final AttributeKey CLIENT_UID_KEY = AttributeKey.stringKey("client_uid"); + public static final String METER_NAME = "bigtable.googleapis.com/internal/client/"; + // Metric names public static final String OPERATION_LATENCIES_NAME = "operation_latencies"; public static final String ATTEMPT_LATENCIES_NAME = "attempt_latencies"; @@ -62,6 +64,38 @@ public class BuiltinMetricsConstants { static final String CLIENT_BLOCKING_LATENCIES_NAME = "throttling_latencies"; static final String PER_CONNECTION_ERROR_COUNT_NAME = "per_connection_error_count"; + public static final Map> GRPC_METRICS = + ImmutableMap.>builder() + .put( + "grpc.client.attempt.duration", + ImmutableSet.of("grpc.lb.locality", "grpc.method", "grpc.target", "grpc.status")) + .put( + "grpc.lb.rls.default_target_picks", + ImmutableSet.of("grpc.lb.rls.data_plane_target", "grpc.lb.pick_result")) + .put( + "grpc.lb.rls.target_picks", + ImmutableSet.of( + "grpc.target", + "grpc.lb.rls.server_target", + "grpc.lb.rls.data_plane_target", + "grpc.lb.pick_result")) + .put( + "grpc.lb.rls.failed_picks", + ImmutableSet.of("grpc.target", "grpc.lb.rls.server_target")) + // TODO: "grpc.xds_client.connected" + .put("grpc.xds_client.server_failure", ImmutableSet.of("grpc.target", "grpc.xds.server")) + // TODO: "grpc.xds_client.resource_updates_valid", + .put( + "grpc.xds_client.resource_updates_invalid", + ImmutableSet.of("grpc.target", "grpc.xds.server", "grpc.xds.resource_type")) + // TODO: "grpc.xds_client.resources" + .build(); + + public static final Set INTERNAL_METRICS = + ImmutableSet.of(PER_CONNECTION_ERROR_COUNT_NAME).stream() + .map(m -> METER_NAME + m) + .collect(ImmutableSet.toImmutableSet()); + // Buckets under 100,000 are identical to buckets for server side metrics handler_latencies. // Extending client side bucket to up to 3,200,000. private static final Aggregation AGGREGATION_WITH_MILLIS_HISTOGRAM = @@ -97,8 +131,6 @@ public class BuiltinMetricsConstants { 500_000.0, 1_000_000.0)); - public static final String METER_NAME = "bigtable.googleapis.com/internal/client/"; - static final Set COMMON_ATTRIBUTES = ImmutableSet.of( BIGTABLE_PROJECT_ID_KEY, From 6e6dd0a545f470373be5dcb78064651a16e2837e Mon Sep 17 00:00:00 2001 From: Igor Bernstein Date: Mon, 31 Mar 2025 17:30:23 -0400 Subject: [PATCH 5/8] chore: export internal DirectAccess gRPC metrics to the new bigtable_client monitored resource (#2547) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will export a relevant subset of the metrics described in https://togithub.com/grpc/proposal/blob/master/A78-grpc-metrics-wrr-pf-xds.md as internal metrics to help rollout of DirectAccess Change-Id: Ifddadb84d091f0f904f8f0f6e8da52de552e9757 Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [ ] Make sure to open an issue as a [bug/issue](https://togithub.com/googleapis/java-bigtable/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [ ] Ensure the tests and linter pass - [ ] Code coverage does not decrease (if any source code was changed) - [ ] Appropriate docs were updated (if necessary) - [ ] Rollback plan is reviewed and LGTMed - [ ] All new data plane features have a completed end to end testing plan Fixes # ☕️ If you write sample code, please follow the [samples format]( https://togithub.com/GoogleCloudPlatform/java-docs-samples/blob/main/SAMPLE_FORMAT.md). --- .../bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java index cf24de1330eb..baf7f53aaf06 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java @@ -64,6 +64,7 @@ public class BuiltinMetricsConstants { static final String CLIENT_BLOCKING_LATENCIES_NAME = "throttling_latencies"; static final String PER_CONNECTION_ERROR_COUNT_NAME = "per_connection_error_count"; + // Start allow list of metrics that will be exported as internal public static final Map> GRPC_METRICS = ImmutableMap.>builder() .put( @@ -95,6 +96,7 @@ public class BuiltinMetricsConstants { ImmutableSet.of(PER_CONNECTION_ERROR_COUNT_NAME).stream() .map(m -> METER_NAME + m) .collect(ImmutableSet.toImmutableSet()); + // End allow list of metrics that will be exported // Buckets under 100,000 are identical to buckets for server side metrics handler_latencies. // Extending client side bucket to up to 3,200,000. From cd02090d3c1c4abf2977509239b22407b47102aa Mon Sep 17 00:00:00 2001 From: Igor Bernstein Date: Mon, 31 Mar 2025 18:16:21 -0400 Subject: [PATCH 6/8] chore: export direct access labels on attempt latencies (#2548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [ ] Make sure to open an issue as a [bug/issue](https://togithub.com/googleapis/java-bigtable/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [ ] Ensure the tests and linter pass - [ ] Code coverage does not decrease (if any source code was changed) - [ ] Appropriate docs were updated (if necessary) - [ ] Rollback plan is reviewed and LGTMed - [ ] All new data plane features have a completed end to end testing plan Fixes # ☕️ If you write sample code, please follow the [samples format]( https://togithub.com/GoogleCloudPlatform/java-docs-samples/blob/main/SAMPLE_FORMAT.md). --- google-cloud-bigtable/pom.xml | 4 ++ .../BigtableCloudMonitoringExporter.java | 2 + .../metrics/BigtableGrpcStreamTracer.java | 32 +++++++++- .../data/v2/stub/metrics/BigtableTracer.java | 3 + .../stub/metrics/BuiltinMetricsConstants.java | 23 +++++++ .../v2/stub/metrics/BuiltinMetricsTracer.java | 64 +++++++++++++++++++ .../metrics/BuiltinMetricsTracerFactory.java | 9 +++ .../data/v2/stub/metrics/CompositeTracer.java | 7 ++ 8 files changed, 142 insertions(+), 2 deletions(-) diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml index 6fbb4db9acbf..ed91ed043398 100644 --- a/google-cloud-bigtable/pom.xml +++ b/google-cloud-bigtable/pom.xml @@ -134,6 +134,10 @@ com.google.protobuf protobuf-java-util + + com.google.code.gson + gson + io.opencensus opencensus-api 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 33b72d32aa18..56c86027dac2 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 @@ -16,6 +16,7 @@ package com.google.cloud.bigtable.data.v2.stub.metrics; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.APPLICATION_BLOCKING_LATENCIES_NAME; +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.ATTEMPT_LATENCIES2_NAME; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.ATTEMPT_LATENCIES_NAME; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CLIENT_BLOCKING_LATENCIES_NAME; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CONNECTIVITY_ERROR_COUNT_NAME; @@ -284,6 +285,7 @@ static class PublicTimeSeriesConverter implements TimeSeriesConverter { ImmutableSet.of( OPERATION_LATENCIES_NAME, ATTEMPT_LATENCIES_NAME, + ATTEMPT_LATENCIES2_NAME, SERVER_LATENCIES_NAME, FIRST_RESPONSE_LATENCIES_NAME, CLIENT_BLOCKING_LATENCIES_NAME, diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableGrpcStreamTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableGrpcStreamTracer.java index 80fcdd0419de..a364adbc46e2 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableGrpcStreamTracer.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableGrpcStreamTracer.java @@ -15,8 +15,10 @@ */ package com.google.cloud.bigtable.data.v2.stub.metrics; +import com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsTracer.TransportAttrs; import io.grpc.ClientStreamTracer; import io.grpc.Metadata; +import io.grpc.Status; /** * Records the time a request is enqueued in a grpc channel queue. This a bridge between gRPC stream @@ -24,10 +26,16 @@ * asking gRPC to start an RPC and gRPC actually serializing that RPC. */ class BigtableGrpcStreamTracer extends ClientStreamTracer { + private static final String GRPC_LB_LOCALITY_KEY = "grpc.lb.locality"; + private static final String GRPC_LB_BACKEND_SERVICE_KEY = "grpc.lb.backend_service"; + private final StreamInfo info; private final BigtableTracer tracer; + private volatile String backendService = null; + private volatile String locality = null; - public BigtableGrpcStreamTracer(BigtableTracer tracer) { + public BigtableGrpcStreamTracer(StreamInfo info, BigtableTracer tracer) { + this.info = info; this.tracer = tracer; } @@ -36,6 +44,26 @@ public void outboundMessageSent(int seqNo, long optionalWireSize, long optionalU tracer.grpcMessageSent(); } + @Override + public void addOptionalLabel(String key, String value) { + switch (key) { + case GRPC_LB_LOCALITY_KEY: + this.locality = value; + break; + case GRPC_LB_BACKEND_SERVICE_KEY: + this.backendService = value; + break; + } + + super.addOptionalLabel(key, value); + } + + @Override + public void streamClosed(Status status) { + tracer.setTransportAttrs(TransportAttrs.create(locality, backendService)); + super.streamClosed(status); + } + static class Factory extends ClientStreamTracer.Factory { private final BigtableTracer tracer; @@ -47,7 +75,7 @@ static class Factory extends ClientStreamTracer.Factory { @Override public ClientStreamTracer newClientStreamTracer( ClientStreamTracer.StreamInfo info, Metadata headers) { - return new BigtableGrpcStreamTracer(tracer); + return new BigtableGrpcStreamTracer(info, tracer); } } } diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java index 587475151216..1647bc4e6f96 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableTracer.java @@ -91,6 +91,9 @@ public void setLocations(String zone, String cluster) { // noop } + /** Set the underlying transport used to process the attempt */ + public void setTransportAttrs(BuiltinMetricsTracer.TransportAttrs attrs) {} + @Deprecated /** @deprecated {@link #grpcMessageSent()} is called instead. */ public void grpcChannelQueuedLatencies(long queuedTimeMs) { diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java index baf7f53aaf06..78ed689cc3ab 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsConstants.java @@ -50,11 +50,18 @@ public class BuiltinMetricsConstants { static final AttributeKey STATUS_KEY = AttributeKey.stringKey("status"); static final AttributeKey CLIENT_UID_KEY = AttributeKey.stringKey("client_uid"); + static final AttributeKey TRANSPORT_TYPE = AttributeKey.stringKey("transport_type"); + static final AttributeKey TRANSPORT_REGION = AttributeKey.stringKey("transport_region"); + static final AttributeKey TRANSPORT_ZONE = AttributeKey.stringKey("transport_zone"); + static final AttributeKey TRANSPORT_SUBZONE = AttributeKey.stringKey("transport_subzone"); + public static final String METER_NAME = "bigtable.googleapis.com/internal/client/"; // Metric names public static final String OPERATION_LATENCIES_NAME = "operation_latencies"; public static final String ATTEMPT_LATENCIES_NAME = "attempt_latencies"; + // Temporary workaround for not being able to add new labels to ATTEMPT_LATENCIES_NAME + public static final String ATTEMPT_LATENCIES2_NAME = "attempt_latencies2"; static final String RETRY_COUNT_NAME = "retry_count"; static final String CONNECTIVITY_ERROR_COUNT_NAME = "connectivity_error_count"; static final String SERVER_LATENCIES_NAME = "server_latencies"; @@ -211,6 +218,22 @@ public static Map getAllViews() { .addAll(COMMON_ATTRIBUTES) .add(STREAMING_KEY, STATUS_KEY) .build()); + defineView( + views, + ATTEMPT_LATENCIES2_NAME, + AGGREGATION_WITH_MILLIS_HISTOGRAM, + InstrumentType.HISTOGRAM, + "ms", + ImmutableSet.builder() + .addAll(COMMON_ATTRIBUTES) + .add( + STREAMING_KEY, + STATUS_KEY, + TRANSPORT_TYPE, + TRANSPORT_REGION, + TRANSPORT_ZONE, + TRANSPORT_SUBZONE) + .build()); defineView( views, SERVER_LATENCIES_NAME, diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracer.java index 92aa26c50c33..f9528759e649 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracer.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracer.java @@ -23,24 +23,34 @@ import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.STATUS_KEY; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.STREAMING_KEY; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.TABLE_ID_KEY; +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.TRANSPORT_REGION; +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.TRANSPORT_SUBZONE; +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.TRANSPORT_TYPE; +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.TRANSPORT_ZONE; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.ZONE_ID_KEY; import com.google.api.core.ObsoleteApi; import com.google.api.gax.retrying.ServerStreamingAttemptException; import com.google.api.gax.tracing.SpanName; +import com.google.auto.value.AutoValue; import com.google.cloud.bigtable.Version; import com.google.common.base.Stopwatch; +import com.google.common.base.Strings; import com.google.common.math.IntMath; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import io.grpc.Deadline; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.metrics.DoubleHistogram; import io.opentelemetry.api.metrics.LongCounter; import java.time.Duration; +import java.util.Map; import java.util.concurrent.CancellationException; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -49,8 +59,23 @@ * bigtable.googleapis.com/client namespace */ class BuiltinMetricsTracer extends BigtableTracer { + @AutoValue + abstract static class TransportAttrs { + @Nullable + abstract String getLocality(); + + @Nullable + abstract String getBackendService(); + + static TransportAttrs create(@Nullable String locality, @Nullable String backendService) { + return new AutoValue_BuiltinMetricsTracer_TransportAttrs(locality, backendService); + } + } private static final Logger logger = Logger.getLogger(BuiltinMetricsTracer.class.getName()); + private static final Gson GSON = new Gson(); + private static final TypeToken> LOCALITY_TYPE = + new TypeToken>() {}; private static final String NAME = "java-bigtable/" + Version.VERSION; private final OperationType operationType; @@ -95,12 +120,15 @@ class BuiltinMetricsTracer extends BigtableTracer { private Deadline operationDeadline = null; private volatile long remainingDeadlineAtAttemptStart = 0; + private TransportAttrs transportAttrs = null; + // OpenCensus (and server) histogram buckets use [start, end), however OpenTelemetry uses (start, // end]. To work around this, we measure all the latencies in nanoseconds and convert them // to milliseconds and use DoubleHistogram. This should minimize the chance of a data // point fall on the bucket boundary that causes off by one errors. private final DoubleHistogram operationLatenciesHistogram; private final DoubleHistogram attemptLatenciesHistogram; + private final DoubleHistogram attemptLatencies2Histogram; private final DoubleHistogram serverLatenciesHistogram; private final DoubleHistogram firstResponseLatenciesHistogram; private final DoubleHistogram clientBlockingLatenciesHistogram; @@ -115,6 +143,7 @@ class BuiltinMetricsTracer extends BigtableTracer { Attributes attributes, DoubleHistogram operationLatenciesHistogram, DoubleHistogram attemptLatenciesHistogram, + DoubleHistogram attemptLatencies2Histogram, DoubleHistogram serverLatenciesHistogram, DoubleHistogram firstResponseLatenciesHistogram, DoubleHistogram clientBlockingLatenciesHistogram, @@ -128,6 +157,7 @@ class BuiltinMetricsTracer extends BigtableTracer { this.operationLatenciesHistogram = operationLatenciesHistogram; this.attemptLatenciesHistogram = attemptLatenciesHistogram; + this.attemptLatencies2Histogram = attemptLatencies2Histogram; this.serverLatenciesHistogram = serverLatenciesHistogram; this.firstResponseLatenciesHistogram = firstResponseLatenciesHistogram; this.clientBlockingLatenciesHistogram = clientBlockingLatenciesHistogram; @@ -301,6 +331,11 @@ public void setLocations(String zone, String cluster) { this.cluster = cluster; } + @Override + public void setTransportAttrs(TransportAttrs attrs) { + this.transportAttrs = attrs; + } + @Override public void batchRequestThrottled(long throttledTimeNanos) { totalClientBlockingTime.addAndGet(java.time.Duration.ofNanos(throttledTimeNanos).toMillis()); @@ -417,6 +452,35 @@ private void recordAttemptCompletion(@Nullable Throwable status) { attemptLatenciesHistogram.record( convertToMs(attemptTimer.elapsed(TimeUnit.NANOSECONDS)), attributes); + String transportType = "cloudpath"; + String transportRegion = ""; + String transportZone = ""; + String transportSubzone = ""; + + try { + if (transportAttrs != null && !Strings.isNullOrEmpty(transportAttrs.getLocality())) { + // only directpath has locality + transportType = "directpath"; + Map localityMap = + GSON.fromJson(transportAttrs.getLocality(), LOCALITY_TYPE); + transportRegion = localityMap.getOrDefault("region", ""); + transportZone = localityMap.getOrDefault("zone", ""); + transportSubzone = localityMap.getOrDefault("sub_zone", ""); + } + } catch (RuntimeException e) { + logger.log( + Level.WARNING, "Failed to parse transport locality: " + transportAttrs.getLocality(), e); + } + attemptLatencies2Histogram.record( + convertToMs(attemptTimer.elapsed(TimeUnit.NANOSECONDS)), + attributes + .toBuilder() + .put(TRANSPORT_TYPE, transportType) + .put(TRANSPORT_REGION, transportRegion) + .put(TRANSPORT_ZONE, transportZone) + .put(TRANSPORT_SUBZONE, transportSubzone) + .build()); + // When operationDeadline is set, it's possible that the deadline is passed by the time we send // a new attempt. In this case we'll record 0. if (operationDeadline != null) { diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerFactory.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerFactory.java index 18d3a3ace98e..4fa423b24e3d 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerFactory.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BuiltinMetricsTracerFactory.java @@ -16,6 +16,7 @@ package com.google.cloud.bigtable.data.v2.stub.metrics; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.APPLICATION_BLOCKING_LATENCIES_NAME; +import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.ATTEMPT_LATENCIES2_NAME; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.ATTEMPT_LATENCIES_NAME; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CLIENT_BLOCKING_LATENCIES_NAME; import static com.google.cloud.bigtable.data.v2.stub.metrics.BuiltinMetricsConstants.CONNECTIVITY_ERROR_COUNT_NAME; @@ -52,6 +53,7 @@ public class BuiltinMetricsTracerFactory extends BaseApiTracerFactory { private final DoubleHistogram operationLatenciesHistogram; private final DoubleHistogram attemptLatenciesHistogram; + private final DoubleHistogram attemptLatencies2Histogram; private final DoubleHistogram serverLatenciesHistogram; private final DoubleHistogram firstResponseLatenciesHistogram; private final DoubleHistogram clientBlockingLatenciesHistogram; @@ -82,6 +84,12 @@ public static BuiltinMetricsTracerFactory create( .setDescription("Client observed latency per RPC attempt.") .setUnit(MILLISECOND) .build(); + attemptLatencies2Histogram = + meter + .histogramBuilder(ATTEMPT_LATENCIES2_NAME) + .setDescription("Client observed latency per RPC attempt with transport labels.") + .setUnit(MILLISECOND) + .build(); serverLatenciesHistogram = meter .histogramBuilder(SERVER_LATENCIES_NAME) @@ -140,6 +148,7 @@ public ApiTracer newTracer(ApiTracer parent, SpanName spanName, OperationType op attributes, operationLatenciesHistogram, attemptLatenciesHistogram, + attemptLatencies2Histogram, serverLatenciesHistogram, firstResponseLatenciesHistogram, clientBlockingLatenciesHistogram, diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/CompositeTracer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/CompositeTracer.java index cb846f19b702..5922530e8b5d 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/CompositeTracer.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/CompositeTracer.java @@ -218,6 +218,13 @@ public void setLocations(String zone, String cluster) { } } + @Override + public void setTransportAttrs(BuiltinMetricsTracer.TransportAttrs attrs) { + for (BigtableTracer tracer : bigtableTracers) { + tracer.setTransportAttrs(attrs); + } + } + @Override public void onRequest(int requestCount) { for (BigtableTracer tracer : bigtableTracers) { From 58d0bbdcb983e3b5ee403edf45c4e98a6eb8dc16 Mon Sep 17 00:00:00 2001 From: Igor Bernstein Date: Mon, 31 Mar 2025 19:18:26 -0400 Subject: [PATCH 7/8] fix: library should released as 2.57.2 (#2549) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I17738efb55259b9107fb7a6df5c44522e1deaca5 Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [ ] Make sure to open an issue as a [bug/issue](https://togithub.com/googleapis/java-bigtable/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [ ] Ensure the tests and linter pass - [ ] Code coverage does not decrease (if any source code was changed) - [ ] Appropriate docs were updated (if necessary) - [ ] Rollback plan is reviewed and LGTMed - [ ] All new data plane features have a completed end to end testing plan Fixes # ☕️ If you write sample code, please follow the [samples format]( https://togithub.com/GoogleCloudPlatform/java-docs-samples/blob/main/SAMPLE_FORMAT.md). From f4666f66503bb814517ce505134ae5a44369c8a7 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 00:02:23 +0000 Subject: [PATCH 8/8] chore(main): release 2.57.2 (#2550) :robot: I have created a release *beep* *boop* --- ## [2.57.2](https://togithub.com/googleapis/java-bigtable/compare/v2.57.1...v2.57.2) (2025-03-31) ### Bug Fixes * Library should released as 2.57.2 ([#2549](https://togithub.com/googleapis/java-bigtable/issues/2549)) ([58d0bbd](https://togithub.com/googleapis/java-bigtable/commit/58d0bbdcb983e3b5ee403edf45c4e98a6eb8dc16)) --- This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ README.md | 6 +++--- google-cloud-bigtable-bom/pom.xml | 16 ++++++++-------- google-cloud-bigtable-deps-bom/pom.xml | 2 +- google-cloud-bigtable-emulator-core/pom.xml | 4 ++-- google-cloud-bigtable-emulator/pom.xml | 10 +++++----- google-cloud-bigtable/pom.xml | 10 +++++----- .../java/com/google/cloud/bigtable/Version.java | 2 +- grpc-google-cloud-bigtable-admin-v2/pom.xml | 8 ++++---- grpc-google-cloud-bigtable-v2/pom.xml | 8 ++++---- pom.xml | 12 ++++++------ proto-google-cloud-bigtable-admin-v2/pom.xml | 8 ++++---- proto-google-cloud-bigtable-v2/pom.xml | 8 ++++---- samples/snapshot/pom.xml | 2 +- test-proxy/pom.xml | 4 ++-- versions.txt | 14 +++++++------- 16 files changed, 64 insertions(+), 57 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbb24b357182..745d661ebd7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [2.57.2](https://github.com/googleapis/java-bigtable/compare/v2.57.1...v2.57.2) (2025-03-31) + + +### Bug Fixes + +* Library should released as 2.57.2 ([#2549](https://github.com/googleapis/java-bigtable/issues/2549)) ([58d0bbd](https://github.com/googleapis/java-bigtable/commit/58d0bbdcb983e3b5ee403edf45c4e98a6eb8dc16)) + ## [2.57.1](https://github.com/googleapis/java-bigtable/compare/v2.57.0...v2.57.1) (2025-03-24) diff --git a/README.md b/README.md index 84a689238e80..731d1d541970 100644 --- a/README.md +++ b/README.md @@ -56,13 +56,13 @@ implementation 'com.google.cloud:google-cloud-bigtable' If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-bigtable:2.57.1' +implementation 'com.google.cloud:google-cloud-bigtable:2.57.2' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-bigtable" % "2.57.1" +libraryDependencies += "com.google.cloud" % "google-cloud-bigtable" % "2.57.2" ``` ## Authentication @@ -543,7 +543,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-bigtable/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-bigtable.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-bigtable/2.57.1 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-bigtable/2.57.2 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles diff --git a/google-cloud-bigtable-bom/pom.xml b/google-cloud-bigtable-bom/pom.xml index 944ac42dc4fa..d33b117f584e 100644 --- a/google-cloud-bigtable-bom/pom.xml +++ b/google-cloud-bigtable-bom/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.google.cloud google-cloud-bigtable-bom - 2.57.2-SNAPSHOT + 2.57.2 pom com.google.cloud @@ -63,37 +63,37 @@ com.google.cloud google-cloud-bigtable - 2.57.2-SNAPSHOT + 2.57.2 com.google.cloud google-cloud-bigtable-emulator - 0.194.2-SNAPSHOT + 0.194.2 com.google.cloud google-cloud-bigtable-emulator-core - 0.194.2-SNAPSHOT + 0.194.2 com.google.api.grpc grpc-google-cloud-bigtable-admin-v2 - 2.57.2-SNAPSHOT + 2.57.2 com.google.api.grpc grpc-google-cloud-bigtable-v2 - 2.57.2-SNAPSHOT + 2.57.2 com.google.api.grpc proto-google-cloud-bigtable-admin-v2 - 2.57.2-SNAPSHOT + 2.57.2 com.google.api.grpc proto-google-cloud-bigtable-v2 - 2.57.2-SNAPSHOT + 2.57.2 diff --git a/google-cloud-bigtable-deps-bom/pom.xml b/google-cloud-bigtable-deps-bom/pom.xml index d398cec7b4c2..f6d6361ef46d 100644 --- a/google-cloud-bigtable-deps-bom/pom.xml +++ b/google-cloud-bigtable-deps-bom/pom.xml @@ -13,7 +13,7 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.2-SNAPSHOT + 2.57.2 pom diff --git a/google-cloud-bigtable-emulator-core/pom.xml b/google-cloud-bigtable-emulator-core/pom.xml index e225da411284..ebfdd3a1ed90 100644 --- a/google-cloud-bigtable-emulator-core/pom.xml +++ b/google-cloud-bigtable-emulator-core/pom.xml @@ -7,11 +7,11 @@ google-cloud-bigtable-parent com.google.cloud - 2.57.2-SNAPSHOT + 2.57.2 google-cloud-bigtable-emulator-core - 0.194.2-SNAPSHOT + 0.194.2 A Java wrapper for the Cloud Bigtable emulator. diff --git a/google-cloud-bigtable-emulator/pom.xml b/google-cloud-bigtable-emulator/pom.xml index e32d0a9b0974..92c01699b273 100644 --- a/google-cloud-bigtable-emulator/pom.xml +++ b/google-cloud-bigtable-emulator/pom.xml @@ -5,7 +5,7 @@ 4.0.0 google-cloud-bigtable-emulator - 0.194.2-SNAPSHOT + 0.194.2 Google Cloud Java - Bigtable Emulator https://github.com/googleapis/java-bigtable @@ -14,7 +14,7 @@ com.google.cloud google-cloud-bigtable-parent - 2.57.2-SNAPSHOT + 2.57.2 scm:git:git@github.com:googleapis/java-bigtable.git @@ -81,14 +81,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import com.google.cloud google-cloud-bigtable-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import @@ -99,7 +99,7 @@ com.google.cloud google-cloud-bigtable-emulator-core - 0.194.2-SNAPSHOT + 0.194.2 diff --git a/google-cloud-bigtable/pom.xml b/google-cloud-bigtable/pom.xml index ed91ed043398..44b31f2c5f5c 100644 --- a/google-cloud-bigtable/pom.xml +++ b/google-cloud-bigtable/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-bigtable - 2.57.2-SNAPSHOT + 2.57.2 jar Google Cloud Bigtable https://github.com/googleapis/java-bigtable @@ -12,11 +12,11 @@ com.google.cloud google-cloud-bigtable-parent - 2.57.2-SNAPSHOT + 2.57.2 - 2.57.2-SNAPSHOT + 2.57.2 google-cloud-bigtable @@ -52,14 +52,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import com.google.cloud google-cloud-bigtable-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java index a669f7c2900d..d618ea6805c6 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/Version.java @@ -20,6 +20,6 @@ @InternalApi("For internal use only") public final class Version { // {x-version-update-start:google-cloud-bigtable:current} - public static String VERSION = "2.57.2-SNAPSHOT"; + public static String VERSION = "2.57.2"; // {x-version-update-end} } diff --git a/grpc-google-cloud-bigtable-admin-v2/pom.xml b/grpc-google-cloud-bigtable-admin-v2/pom.xml index 7aac741ec9b8..37e217766b77 100644 --- a/grpc-google-cloud-bigtable-admin-v2/pom.xml +++ b/grpc-google-cloud-bigtable-admin-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-bigtable-admin-v2 - 2.57.2-SNAPSHOT + 2.57.2 grpc-google-cloud-bigtable-admin-v2 GRPC library for grpc-google-cloud-bigtable-admin-v2 com.google.cloud google-cloud-bigtable-parent - 2.57.2-SNAPSHOT + 2.57.2 @@ -18,14 +18,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import com.google.cloud google-cloud-bigtable-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import diff --git a/grpc-google-cloud-bigtable-v2/pom.xml b/grpc-google-cloud-bigtable-v2/pom.xml index e43a77957dde..8853703dbc17 100644 --- a/grpc-google-cloud-bigtable-v2/pom.xml +++ b/grpc-google-cloud-bigtable-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-bigtable-v2 - 2.57.2-SNAPSHOT + 2.57.2 grpc-google-cloud-bigtable-v2 GRPC library for grpc-google-cloud-bigtable-v2 com.google.cloud google-cloud-bigtable-parent - 2.57.2-SNAPSHOT + 2.57.2 @@ -18,14 +18,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import com.google.cloud google-cloud-bigtable-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import diff --git a/pom.xml b/pom.xml index ce3e840658b2..228b8350ed93 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ google-cloud-bigtable-parent pom - 2.57.2-SNAPSHOT + 2.57.2 Google Cloud Bigtable Parent https://github.com/googleapis/java-bigtable @@ -153,27 +153,27 @@ com.google.api.grpc proto-google-cloud-bigtable-v2 - 2.57.2-SNAPSHOT + 2.57.2 com.google.api.grpc proto-google-cloud-bigtable-admin-v2 - 2.57.2-SNAPSHOT + 2.57.2 com.google.api.grpc grpc-google-cloud-bigtable-v2 - 2.57.2-SNAPSHOT + 2.57.2 com.google.api.grpc grpc-google-cloud-bigtable-admin-v2 - 2.57.2-SNAPSHOT + 2.57.2 com.google.cloud google-cloud-bigtable - 2.57.2-SNAPSHOT + 2.57.2 diff --git a/proto-google-cloud-bigtable-admin-v2/pom.xml b/proto-google-cloud-bigtable-admin-v2/pom.xml index f3bb53f3ff7e..044dd90d1f6e 100644 --- a/proto-google-cloud-bigtable-admin-v2/pom.xml +++ b/proto-google-cloud-bigtable-admin-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-bigtable-admin-v2 - 2.57.2-SNAPSHOT + 2.57.2 proto-google-cloud-bigtable-admin-v2 PROTO library for proto-google-cloud-bigtable-admin-v2 com.google.cloud google-cloud-bigtable-parent - 2.57.2-SNAPSHOT + 2.57.2 @@ -18,14 +18,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import com.google.cloud google-cloud-bigtable-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import diff --git a/proto-google-cloud-bigtable-v2/pom.xml b/proto-google-cloud-bigtable-v2/pom.xml index f88e0f16b341..5e743f933a73 100644 --- a/proto-google-cloud-bigtable-v2/pom.xml +++ b/proto-google-cloud-bigtable-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-bigtable-v2 - 2.57.2-SNAPSHOT + 2.57.2 proto-google-cloud-bigtable-v2 PROTO library for proto-google-cloud-bigtable-v2 com.google.cloud google-cloud-bigtable-parent - 2.57.2-SNAPSHOT + 2.57.2 @@ -18,14 +18,14 @@ com.google.cloud google-cloud-bigtable-deps-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import com.google.cloud google-cloud-bigtable-bom - 2.57.2-SNAPSHOT + 2.57.2 pom import diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 2baa5727c9e9..683b4dfdf824 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,7 +28,7 @@ com.google.cloud google-cloud-bigtable - 2.57.2-SNAPSHOT + 2.57.2 diff --git a/test-proxy/pom.xml b/test-proxy/pom.xml index e94f83f6b980..1f78998e92fa 100644 --- a/test-proxy/pom.xml +++ b/test-proxy/pom.xml @@ -12,11 +12,11 @@ google-cloud-bigtable-parent com.google.cloud - 2.57.2-SNAPSHOT + 2.57.2 - 2.57.2-SNAPSHOT + 2.57.2 diff --git a/versions.txt b/versions.txt index 0c52b19a27cc..e5fe02bd62b5 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-bigtable:2.57.1:2.57.2-SNAPSHOT -grpc-google-cloud-bigtable-admin-v2:2.57.1:2.57.2-SNAPSHOT -grpc-google-cloud-bigtable-v2:2.57.1:2.57.2-SNAPSHOT -proto-google-cloud-bigtable-admin-v2:2.57.1:2.57.2-SNAPSHOT -proto-google-cloud-bigtable-v2:2.57.1:2.57.2-SNAPSHOT -google-cloud-bigtable-emulator:0.194.1:0.194.2-SNAPSHOT -google-cloud-bigtable-emulator-core:0.194.1:0.194.2-SNAPSHOT +google-cloud-bigtable:2.57.2:2.57.2 +grpc-google-cloud-bigtable-admin-v2:2.57.2:2.57.2 +grpc-google-cloud-bigtable-v2:2.57.2:2.57.2 +proto-google-cloud-bigtable-admin-v2:2.57.2:2.57.2 +proto-google-cloud-bigtable-v2:2.57.2:2.57.2 +google-cloud-bigtable-emulator:0.194.2:0.194.2 +google-cloud-bigtable-emulator-core:0.194.2:0.194.2