From 62859d8619a4387fca1dda5477f58d5dbf8e311d Mon Sep 17 00:00:00 2001 From: Igor Bernstein Date: Thu, 26 Feb 2026 17:50:59 -0500 Subject: [PATCH 1/2] chore: add non-generated typesafe names Change-Id: Ic5ff17b2b4d7370531582f1e0805400a434aba30 --- .../data/v2/BigtableDataClientFactory.java | 2 +- .../data/v2/internal/RequestContext.java | 4 +- .../data/v2/internal/api/InstanceName.java | 70 +++++++++++++++ .../data/v2/internal/api/TableName.java | 85 +++++++++++++++++++ .../data/v2/internal/csm/MetricsImpl.java | 8 +- .../internal/csm/attributes/ClientInfo.java | 2 +- .../BigtableCloudMonitoringExporter.java | 2 +- .../ClientPerConnectionErrorCount.java | 5 +- .../v2/internal/csm/schema/ClientSchema.java | 6 +- .../internal/csm/schema/GrpcClientSchema.java | 6 +- .../v2/internal/csm/schema/TableSchema.java | 4 +- .../data/v2/stub/BigtableChannelPrimer.java | 4 +- .../data/v2/stub/BigtableClientContext.java | 2 +- .../v2/internal/api/InstanceNameTest.java | 51 +++++++++++ .../data/v2/internal/api/TableNameTest.java | 62 ++++++++++++++ .../csm/MetricRegistryExportTest.java | 14 +-- .../csm/attributes/ClientInfoTest.java | 2 +- .../BigtableCloudMonitoringExporterTest.java | 2 +- .../BigtableCloudMonitoringExporterTest2.java | 2 +- .../csm/tracers/BuiltinMetricsTracerTest.java | 2 +- .../tracers/ChannelPoolMetricsTracerTest.java | 2 +- 21 files changed, 303 insertions(+), 34 deletions(-) create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/InstanceName.java create mode 100644 google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/TableName.java create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/api/InstanceNameTest.java create mode 100644 google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/api/TableNameTest.java diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java index d529f02eb24b..f19726e2a315 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/BigtableDataClientFactory.java @@ -16,7 +16,7 @@ package com.google.cloud.bigtable.data.v2; import com.google.api.core.BetaApi; -import com.google.bigtable.v2.InstanceName; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import com.google.cloud.bigtable.data.v2.stub.BigtableClientContext; import com.google.cloud.bigtable.data.v2.stub.ClientOperationSettings; import com.google.cloud.bigtable.data.v2.stub.EnhancedBigtableStub; diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/RequestContext.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/RequestContext.java index 2c3213d0032c..7058ae137c58 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/RequestContext.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/RequestContext.java @@ -36,8 +36,8 @@ public abstract class RequestContext implements Serializable { public static RequestContext create(ClientInfo clientInfo) { return create( - clientInfo.getInstanceName().getProject(), - clientInfo.getInstanceName().getInstance(), + clientInfo.getInstanceName().getProjectId(), + clientInfo.getInstanceName().getInstanceId(), clientInfo.getAppProfileId()); } diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/InstanceName.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/InstanceName.java new file mode 100644 index 000000000000..01dfed2d72bf --- /dev/null +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/InstanceName.java @@ -0,0 +1,70 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.bigtable.data.v2.internal.api; + +import com.google.auto.value.AutoValue; +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import java.util.List; + +@AutoValue +public abstract class InstanceName { + public abstract String getProjectId(); + + public abstract String getInstanceId(); + + @Override + public final String toString() { + return String.format("projects/%s/instances/%s", getProjectId(), getInstanceId()); + } + + public static InstanceName of(String projectId, String instanceId) { + return InstanceName.builder().setProjectId(projectId).setInstanceId(instanceId).build(); + } + + public static Builder builder() { + return new AutoValue_InstanceName.Builder(); + } + + public static InstanceName parse(String name) { + List parts = Splitter.on('/').splitToList(name); + Preconditions.checkArgument(parts.size() == 4, "Invalid instance name: %s", name); + Preconditions.checkArgument( + "projects".equals(parts.get(0)), + "Invalid instance name: %s, must start with projects/", + name); + Preconditions.checkArgument( + !parts.get(1).isEmpty(), "Invalid instance name %s, must have a project id", name); + Preconditions.checkArgument( + "instances".equals(parts.get(2)), + "Invalid instance name: %s, must start with projects/$PROJECT_ID/instances/", + name); + Preconditions.checkArgument( + !parts.get(3).isEmpty(), "Invalid instance name %s, must have an instance id", name); + + return builder().setProjectId(parts.get(1)).setInstanceId(parts.get(3)).build(); + } + + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder setProjectId(String projectId); + + public abstract Builder setInstanceId(String instanceId); + + public abstract InstanceName build(); + } +} diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/TableName.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/TableName.java new file mode 100644 index 000000000000..d17cf1e30fce --- /dev/null +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/TableName.java @@ -0,0 +1,85 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.bigtable.data.v2.internal.api; + +import com.google.auto.value.AutoValue; +import com.google.common.base.Preconditions; +import com.google.common.base.Splitter; +import java.util.List; + +@AutoValue +public abstract class TableName { + public abstract String getProjectId(); + + public abstract String getInstanceId(); + + public abstract String getTableId(); + + public InstanceName getInstanceName() { + return InstanceName.builder() + .setProjectId(getProjectId()) + .setInstanceId(getInstanceId()) + .build(); + } + + @Override + public final String toString() { + return String.format("%s/tables/%s", getInstanceName(), getTableId()); + } + + public static Builder builder() { + return new AutoValue_TableName.Builder(); + } + + public static TableName parse(String name) { + List parts = Splitter.on('/').splitToList(name); + Preconditions.checkArgument(parts.size() == 6, "Invalid table name: %s", name); + Preconditions.checkArgument( + "projects".equals(parts.get(0)), "Invalid table name: %s, must start with projects/", name); + Preconditions.checkArgument( + !parts.get(1).isEmpty(), "Invalid table name %s, must have a project id", name); + Preconditions.checkArgument( + "instances".equals(parts.get(2)), + "Invalid table name: %s, must start with projects/$PROJECT_ID/instances/", + name); + Preconditions.checkArgument( + !parts.get(3).isEmpty(), "Invalid table name %s, must have an instance id", name); + Preconditions.checkArgument( + "tables".equals(parts.get(4)), + "Invalid table name: %s, must start with projects/$PROJECT_ID/instances/$INSTANCE_ID/tables", + name); + Preconditions.checkArgument( + !parts.get(5).isEmpty(), "Invalid table name %s, must have table id", name); + + return builder() + .setProjectId(parts.get(1)) + .setInstanceId(parts.get(3)) + .setTableId(parts.get(5)) + .build(); + } + + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder setProjectId(String projectId); + + public abstract Builder setInstanceId(String instanceId); + + public abstract Builder setTableId(String tableId); + + public abstract TableName build(); + } +} diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricsImpl.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricsImpl.java index db389030d8f0..51adb36ea427 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricsImpl.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricsImpl.java @@ -202,10 +202,10 @@ private static ApiTracerFactory createOCTracingFactory(ClientInfo clientInfo) { // Annotate traces with the same tags as metrics .put( RpcMeasureConstants.BIGTABLE_PROJECT_ID.getName(), - clientInfo.getInstanceName().getProject()) + clientInfo.getInstanceName().getProjectId()) .put( RpcMeasureConstants.BIGTABLE_INSTANCE_ID.getName(), - clientInfo.getInstanceName().getInstance()) + clientInfo.getInstanceName().getInstanceId()) .put( RpcMeasureConstants.BIGTABLE_APP_PROFILE_ID.getName(), clientInfo.getAppProfileId()) // Also annotate traces with library versions @@ -222,10 +222,10 @@ private static ApiTracerFactory createOCMetricsFactory( ImmutableMap.builder() .put( RpcMeasureConstants.BIGTABLE_PROJECT_ID, - TagValue.create(clientInfo.getInstanceName().getProject())) + TagValue.create(clientInfo.getInstanceName().getProjectId())) .put( RpcMeasureConstants.BIGTABLE_INSTANCE_ID, - TagValue.create(clientInfo.getInstanceName().getInstance())) + TagValue.create(clientInfo.getInstanceName().getInstanceId())) .put( RpcMeasureConstants.BIGTABLE_APP_PROFILE_ID, TagValue.create(clientInfo.getAppProfileId())) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/ClientInfo.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/ClientInfo.java index 64c4b211b297..7122cb40c784 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/ClientInfo.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/ClientInfo.java @@ -17,8 +17,8 @@ package com.google.cloud.bigtable.data.v2.internal.csm.attributes; import com.google.auto.value.AutoValue; -import com.google.bigtable.v2.InstanceName; import com.google.cloud.bigtable.Version; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; /** * A value class to capture parameters that the client was instantiated with. These parameters will diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporter.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporter.java index 99a740f38780..2aa98c33eab7 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporter.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporter.java @@ -188,7 +188,7 @@ public void onFailure(Throwable throwable) { " Need monitoring metric writer permission on project=%s. Follow" + " https://cloud.google.com/bigtable/docs/client-side-metrics-setup" + " to set up permissions.", - clientInfo.getInstanceName().getProject()); + clientInfo.getInstanceName().getProjectId()); } RuntimeException asyncWrapper = new RuntimeException("export failed", throwable); asyncWrapper.setStackTrace(stackTrace); diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/metrics/ClientPerConnectionErrorCount.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/metrics/ClientPerConnectionErrorCount.java index a6b2e89aaf0c..dc07f6e0e9fc 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/metrics/ClientPerConnectionErrorCount.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/metrics/ClientPerConnectionErrorCount.java @@ -99,8 +99,9 @@ public void record(ClientInfo clientInfo, long value) { Attributes attributes = getSchema() .createResourceAttrs(clientInfo) - .put(MetricLabels.BIGTABLE_PROJECT_ID_KEY, clientInfo.getInstanceName().getProject()) - .put(MetricLabels.INSTANCE_ID_KEY, clientInfo.getInstanceName().getInstance()) + .put( + MetricLabels.BIGTABLE_PROJECT_ID_KEY, clientInfo.getInstanceName().getProjectId()) + .put(MetricLabels.INSTANCE_ID_KEY, clientInfo.getInstanceName().getInstanceId()) .put(MetricLabels.CLIENT_NAME, clientInfo.getClientName()) .put(MetricLabels.APP_PROFILE_KEY, clientInfo.getAppProfileId()) .build(); diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/ClientSchema.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/ClientSchema.java index 11cf90c445c6..5ef030539db8 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/ClientSchema.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/ClientSchema.java @@ -64,13 +64,13 @@ public ClientSchema() { @Override public ProjectName extractProjectName(Attributes attrs, EnvInfo envInfo, ClientInfo clientInfo) { - return ProjectName.of(clientInfo.getInstanceName().getProject()); + return ProjectName.of(clientInfo.getInstanceName().getProjectId()); } public AttributesBuilder createResourceAttrs(ClientInfo clientInfo) { return Attributes.builder() - .put(BIGTABLE_PROJECT_ID_KEY, clientInfo.getInstanceName().getProject()) - .put(INSTANCE_ID_KEY, clientInfo.getInstanceName().getInstance()) + .put(BIGTABLE_PROJECT_ID_KEY, clientInfo.getInstanceName().getProjectId()) + .put(INSTANCE_ID_KEY, clientInfo.getInstanceName().getInstanceId()) .put(APP_PROFILE_KEY, clientInfo.getAppProfileId()) .put(CLIENT_NAME, clientInfo.getClientName()); } diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/GrpcClientSchema.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/GrpcClientSchema.java index 62a8df1d3ca1..0a5b3adeb2cb 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/GrpcClientSchema.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/GrpcClientSchema.java @@ -30,9 +30,9 @@ public final class GrpcClientSchema extends Schema { // Unlike the normal ClientSchema, the bigtable resource ids must be injected during export time private static final DeferredAttr BIGTABLE_PROJECT_ID = - DeferredAttr.fromClientInfo("project_id", ci -> ci.getInstanceName().getProject()); + DeferredAttr.fromClientInfo("project_id", ci -> ci.getInstanceName().getProjectId()); private static final DeferredAttr INSTANCE_ID = - DeferredAttr.fromClientInfo("instance", ci -> ci.getInstanceName().getInstance()); + DeferredAttr.fromClientInfo("instance", ci -> ci.getInstanceName().getInstanceId()); private static final DeferredAttr APP_PROFILE_ID = DeferredAttr.fromClientInfo("app_profile", ClientInfo::getAppProfileId); private static final DeferredAttr CLIENT_NAME = @@ -73,6 +73,6 @@ private GrpcClientSchema() { @Override public ProjectName extractProjectName( Attributes ignored, EnvInfo ignored2, ClientInfo clientInfo) { - return ProjectName.of(clientInfo.getInstanceName().getProject()); + return ProjectName.of(clientInfo.getInstanceName().getProjectId()); } } diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/TableSchema.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/TableSchema.java index 618551bb87a1..e333837d7ab1 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/TableSchema.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/csm/schema/TableSchema.java @@ -56,8 +56,8 @@ public ProjectName extractProjectName(Attributes attrs, EnvInfo envInfo, ClientI public AttributesBuilder createResourceAttrs( ClientInfo clientInfo, String tableId, @Nullable ResponseParams clusterInfo) { return Attributes.builder() - .put(BIGTABLE_PROJECT_ID_KEY, clientInfo.getInstanceName().getProject()) - .put(INSTANCE_ID_KEY, clientInfo.getInstanceName().getInstance()) + .put(BIGTABLE_PROJECT_ID_KEY, clientInfo.getInstanceName().getProjectId()) + .put(INSTANCE_ID_KEY, clientInfo.getInstanceName().getInstanceId()) .put(TABLE_ID_KEY, tableId) .put(CLUSTER_ID_KEY, Util.formatClusterIdMetricLabel(clusterInfo)) .put(ZONE_ID_KEY, Util.formatZoneIdMetricLabel(clusterInfo)); diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableChannelPrimer.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableChannelPrimer.java index 97c6e364c8ce..3b2a169910f8 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableChannelPrimer.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/BigtableChannelPrimer.java @@ -20,9 +20,9 @@ import com.google.api.core.SettableApiFuture; import com.google.auth.Credentials; import com.google.bigtable.v2.BigtableGrpc; -import com.google.bigtable.v2.InstanceName; import com.google.bigtable.v2.PingAndWarmRequest; import com.google.bigtable.v2.PingAndWarmResponse; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import com.google.cloud.bigtable.gaxx.grpc.ChannelPrimer; import io.grpc.CallCredentials; import io.grpc.CallOptions; @@ -80,7 +80,7 @@ static BigtableChannelPrimer create( request = PingAndWarmRequest.newBuilder() - .setName(InstanceName.format(projectId, instanceId)) + .setName(InstanceName.of(projectId, instanceId).toString()) .setAppProfileId(appProfileId) .build(); 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 c4bef24798f5..2828d67f43a0 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,8 +26,8 @@ import com.google.api.gax.rpc.ClientContext; import com.google.auth.Credentials; import com.google.auth.oauth2.ServiceAccountJwtAccessCredentials; -import com.google.bigtable.v2.InstanceName; import com.google.cloud.bigtable.data.v2.internal.JwtCredentialsWithAudience; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import com.google.cloud.bigtable.data.v2.internal.csm.MetricRegistry; import com.google.cloud.bigtable.data.v2.internal.csm.Metrics; import com.google.cloud.bigtable.data.v2.internal.csm.MetricsImpl; diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/api/InstanceNameTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/api/InstanceNameTest.java new file mode 100644 index 000000000000..09778bd46ee6 --- /dev/null +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/api/InstanceNameTest.java @@ -0,0 +1,51 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.bigtable.data.v2.internal.api; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class InstanceNameTest { + + @Test + void testParseOk() { + assertThat(InstanceName.parse("projects/my-project/instances/my-instance")) + .isEqualTo( + InstanceName.builder().setProjectId("my-project").setInstanceId("my-instance").build()); + } + + @Test + void testParseFail() { + assertThrows(IllegalArgumentException.class, () -> InstanceName.parse("")); + assertThrows(IllegalArgumentException.class, () -> InstanceName.parse("projects/my-project")); + assertThrows( + IllegalArgumentException.class, () -> TableName.parse("projects/my-project/instances")); + assertThrows( + IllegalArgumentException.class, + () -> InstanceName.parse("projects/my-project/instances/my-instance/extra")); + assertThrows( + IllegalArgumentException.class, + () -> InstanceName.parse("projects//instances/my-instance")); + assertThrows( + IllegalArgumentException.class, () -> InstanceName.parse("projects/my-project/instances/")); + assertThrows( + IllegalArgumentException.class, + () -> InstanceName.parse("projects/my-project/instances//")); + } +} diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/api/TableNameTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/api/TableNameTest.java new file mode 100644 index 000000000000..fd8e8310a70f --- /dev/null +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/api/TableNameTest.java @@ -0,0 +1,62 @@ +/* + * Copyright 2025 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.cloud.bigtable.data.v2.internal.api; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +class TableNameTest { + + @Test + void testParseOk() { + assertThat(TableName.parse("projects/my-project/instances/my-instance/tables/my-table")) + .isEqualTo( + TableName.builder() + .setProjectId("my-project") + .setInstanceId("my-instance") + .setTableId("my-table") + .build()); + } + + @Test + void testParseFail() { + assertThrows(IllegalArgumentException.class, () -> TableName.parse("")); + assertThrows(IllegalArgumentException.class, () -> TableName.parse("projects/my-project")); + assertThrows( + IllegalArgumentException.class, () -> TableName.parse("projects/my-project/instances")); + assertThrows( + IllegalArgumentException.class, + () -> TableName.parse("projects/my-project/instances/my-instance")); + assertThrows( + IllegalArgumentException.class, + () -> TableName.parse("projects/my-project/instances/my-instance/tables")); + assertThrows( + IllegalArgumentException.class, + () -> TableName.parse("projects/my-project/instances/my-instance/tables/my-table/extra")); + assertThrows( + IllegalArgumentException.class, + () -> TableName.parse("projects//instances/my-instance/tables")); + assertThrows( + IllegalArgumentException.class, + () -> TableName.parse("projects/my-project/instances//tables/my-table")); + assertThrows( + IllegalArgumentException.class, + () -> TableName.parse("projects/my-project/instances/my-instance/tables/")); + } +} diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricRegistryExportTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricRegistryExportTest.java index e31e2e304700..974ac41868f0 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricRegistryExportTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/MetricRegistryExportTest.java @@ -25,11 +25,11 @@ import com.google.api.gax.core.NoCredentialsProvider; import com.google.api.gax.grpc.GrpcTransportChannel; import com.google.api.gax.rpc.FixedTransportChannelProvider; -import com.google.bigtable.v2.InstanceName; import com.google.bigtable.v2.PeerInfo; import com.google.bigtable.v2.PeerInfo.TransportType; import com.google.bigtable.v2.ResponseParams; import com.google.cloud.bigtable.data.v2.FakeServiceBuilder; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import com.google.cloud.bigtable.data.v2.internal.csm.MetricRegistry.RecorderRegistry; import com.google.cloud.bigtable.data.v2.internal.csm.attributes.ClientInfo; import com.google.cloud.bigtable.data.v2.internal.csm.attributes.EnvInfo; @@ -143,8 +143,8 @@ void setUp() throws Exception { expectedTableMonitoredResource = MonitoredResource.newBuilder() .setType("bigtable_client_raw") - .putLabels("project_id", clientInfo.getInstanceName().getProject()) - .putLabels("instance", clientInfo.getInstanceName().getInstance()) + .putLabels("project_id", clientInfo.getInstanceName().getProjectId()) + .putLabels("instance", clientInfo.getInstanceName().getInstanceId()) .putLabels("cluster", clusterInfo.getClusterId()) .putLabels("table", tableId) .putLabels("zone", clusterInfo.getZoneId()) @@ -153,8 +153,8 @@ void setUp() throws Exception { expectedClientMonitoredResource = MonitoredResource.newBuilder() .setType("bigtable_client") - .putLabels("project_id", clientInfo.getInstanceName().getProject()) - .putLabels("instance", clientInfo.getInstanceName().getInstance()) + .putLabels("project_id", clientInfo.getInstanceName().getProjectId()) + .putLabels("instance", clientInfo.getInstanceName().getInstanceId()) .putLabels("app_profile", appProfileId) .putLabels("client_project", envInfo.getProject()) .putLabels("region", envInfo.getRegion()) @@ -575,9 +575,9 @@ void testPerConnectionErrors() { assertThat(timeSeries.getMetric().getLabelsMap()) .containsExactly( - "project_id", clientInfo.getInstanceName().getProject(), + "project_id", clientInfo.getInstanceName().getProjectId(), "client_uid", envInfo.getUid(), - "instance", clientInfo.getInstanceName().getInstance(), + "instance", clientInfo.getInstanceName().getInstanceId(), "client_name", clientInfo.getClientName(), "app_profile", clientInfo.getAppProfileId()); diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/ClientInfoTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/ClientInfoTest.java index 283c26f5141a..e97cb1dd5205 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/ClientInfoTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/ClientInfoTest.java @@ -18,7 +18,7 @@ import static com.google.common.truth.Truth.assertThat; -import com.google.bigtable.v2.InstanceName; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import org.junit.jupiter.api.Test; class ClientInfoTest { diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporterTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporterTest.java index b352eb166097..e6c8c109fc71 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporterTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporterTest.java @@ -26,7 +26,7 @@ import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutures; import com.google.api.gax.rpc.UnaryCallable; -import com.google.bigtable.v2.InstanceName; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import com.google.cloud.bigtable.data.v2.internal.csm.MetricRegistry; import com.google.cloud.bigtable.data.v2.internal.csm.attributes.ClientInfo; import com.google.cloud.bigtable.data.v2.internal.csm.attributes.EnvInfo; diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporterTest2.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporterTest2.java index 7fdde6d5ca7a..adb52ef25842 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporterTest2.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/exporter/BigtableCloudMonitoringExporterTest2.java @@ -23,8 +23,8 @@ import com.google.api.core.ApiFutures; import com.google.api.gax.rpc.ApiCallContext; import com.google.api.gax.rpc.UnaryCallable; -import com.google.bigtable.v2.InstanceName; import com.google.bigtable.v2.TableName; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import com.google.cloud.bigtable.data.v2.internal.csm.MetricRegistry; import com.google.cloud.bigtable.data.v2.internal.csm.attributes.ClientInfo; import com.google.cloud.bigtable.data.v2.internal.csm.attributes.EnvInfo; diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracerTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracerTest.java index 9ef3ce3c9d23..17d55870ffe2 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracerTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/BuiltinMetricsTracerTest.java @@ -35,7 +35,6 @@ import com.google.api.gax.rpc.ResponseObserver; import com.google.api.gax.rpc.StreamController; import com.google.bigtable.v2.BigtableGrpc; -import com.google.bigtable.v2.InstanceName; import com.google.bigtable.v2.MutateRowRequest; import com.google.bigtable.v2.MutateRowResponse; import com.google.bigtable.v2.MutateRowsRequest; @@ -46,6 +45,7 @@ import com.google.cloud.bigtable.Version; import com.google.cloud.bigtable.data.v2.BigtableDataSettings; import com.google.cloud.bigtable.data.v2.FakeServiceBuilder; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import com.google.cloud.bigtable.data.v2.internal.csm.MetricRegistry; import com.google.cloud.bigtable.data.v2.internal.csm.attributes.ClientInfo; import com.google.cloud.bigtable.data.v2.internal.csm.metrics.ClientBatchWriteFlowControlFactor; diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/ChannelPoolMetricsTracerTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/ChannelPoolMetricsTracerTest.java index a15c0f53c482..fec4f7956ac3 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/ChannelPoolMetricsTracerTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/tracers/ChannelPoolMetricsTracerTest.java @@ -20,7 +20,7 @@ import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; -import com.google.bigtable.v2.InstanceName; +import com.google.cloud.bigtable.data.v2.internal.api.InstanceName; import com.google.cloud.bigtable.data.v2.internal.csm.MetricRegistry; import com.google.cloud.bigtable.data.v2.internal.csm.attributes.ClientInfo; import com.google.cloud.bigtable.data.v2.internal.csm.metrics.ClientChannelPoolOutstandingRpcs; From 60cbb6ec37c6d388681da177c4530bae7a951f19 Mon Sep 17 00:00:00 2001 From: cloud-java-bot Date: Fri, 27 Feb 2026 01:04:49 +0000 Subject: [PATCH 2/2] chore: generate libraries at Fri Feb 27 01:02:17 UTC 2026 --- .../google/cloud/bigtable/data/v2/internal/api/TableName.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/TableName.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/TableName.java index d17cf1e30fce..159c7b0b50ab 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/TableName.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/internal/api/TableName.java @@ -60,7 +60,8 @@ public static TableName parse(String name) { !parts.get(3).isEmpty(), "Invalid table name %s, must have an instance id", name); Preconditions.checkArgument( "tables".equals(parts.get(4)), - "Invalid table name: %s, must start with projects/$PROJECT_ID/instances/$INSTANCE_ID/tables", + "Invalid table name: %s, must start with" + + " projects/$PROJECT_ID/instances/$INSTANCE_ID/tables", name); Preconditions.checkArgument( !parts.get(5).isEmpty(), "Invalid table name %s, must have table id", name);