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
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