Skip to content

Commit 105f644

Browse files
diegomarquezpgemini-code-assist[bot]cloud-java-bot
authored
feat(o11y): introduce gcp.client.repo and gcp.client.artifact attributes (googleapis#4120)
This PR introduces the ability to include repository and artifact name metadata in generated GAPIC libraries. ## Changes ### GAX (Google API Extensions) - **`LibraryMetadata`**: Introduced a new internal class to hold `repository` and `artifactName`. - **`StubSettings` & `ClientContext`**: Added `LibraryMetadata` to these classes to carry the metadata through the client lifecycle. - **Observability/Tracing**: Updated `ApiTracerContext` and `ObservabilityAttributes` to support these new attributes, enabling them to be included in exported traces. ### GAPIC Generator - Support for `repo` and `artifact` flags, passed down to generate a method in `[Service]StubSettings` that builds an instance of `LibraryMetadata`. ### Hermetic Build - Support for `repo` and `artifact` to be passed down to `generate_library.sh`. The flags reuse the existing logic that determines the values. ## Verification Results <img width="1412" height="877" alt="image" src="https://github.com/user-attachments/assets/1b746361-db2b-4661-bbe6-38f7f63155aa" /> ## Note on java-bigtable downstream check Since [SkipTrailersTest](https://github.com/googleapis/java-bigtable/blob/49fe7692c55747714ada4296ff0f856b1109eba5/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/SkipTrailersTest.java#L97) mocks the tracer factory, the `EndpointContext` call to `apiTracerFactory.withContext()` returns a null factory, causing a null pointer exception when building the client context. We expect the test to be adjusted with this change with the next release. --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: cloud-java-bot <cloud-java-bot@google.com>
1 parent d9b39ed commit 105f644

File tree

60 files changed

+693
-30
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+693
-30
lines changed

.cloudbuild/library_generation/library_generation.Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ RUN cat /java-formatter-version
3030
RUN V=$(cat /java-formatter-version) && curl -o "/google-java-format.jar" "https://maven-central.storage-download.googleapis.com/maven2/com/google/googlejavaformat/google-java-format/${V}/google-java-format-${V}-all-deps.jar"
3131

3232
# Compile and install packages
33-
RUN mvn install -B -ntp -DskipTests -Dclirr.skip -Dcheckstyle.skip
33+
RUN mvn install -B -ntp -T 1.5C -DskipTests -Dcheckstyle.skip -Dclirr.skip -Denforcer.skip -Dfmt.skip
3434
RUN cp "/root/.m2/repository/com/google/api/gapic-generator-java/${DOCKER_GAPIC_GENERATOR_VERSION}/gapic-generator-java-${DOCKER_GAPIC_GENERATOR_VERSION}.jar" \
3535
"./gapic-generator-java.jar"
3636

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceStubSettingsClassComposer.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.google.api.gax.rpc.BatchingCallSettings;
3838
import com.google.api.gax.rpc.BatchingDescriptor;
3939
import com.google.api.gax.rpc.ClientContext;
40+
import com.google.api.gax.rpc.LibraryMetadata;
4041
import com.google.api.gax.rpc.OperationCallSettings;
4142
import com.google.api.gax.rpc.PageContext;
4243
import com.google.api.gax.rpc.PagedCallSettings;
@@ -209,6 +210,7 @@ public GapicClass generate(GapicContext context, Service service) {
209210
service, serviceConfig, methodSettingsMemberVarExprs, messageTypes, typeStore))
210211
.setMethods(
211212
createClassMethods(
213+
context,
212214
service,
213215
methodSettingsMemberVarExprs,
214216
deprecatedSettingVarNames,
@@ -499,7 +501,6 @@ private static Map<String, VariableExpr> createMethodSettingsClassMemberVarExprs
499501
boolean isNestedClass,
500502
Set<String> deprecatedSettingVarNames,
501503
Set<String> internalSettingVarNames) {
502-
// Maintain insertion order.
503504
Map<String, VariableExpr> varExprs = new LinkedHashMap<>();
504505

505506
// Creates class variables <method>Settings, e.g. echoSettings.
@@ -538,6 +539,7 @@ private static List<Statement> createClassStatements(
538539
Map<String, VariableExpr> methodSettingsMemberVarExprs,
539540
Map<String, Message> messageTypes,
540541
TypeStore typeStore) {
542+
// Maintain insertion order.
541543
Function<Expr, Statement> exprToStatementFn = e -> ExprStatement.withExpr(e);
542544
List<Statement> statements = new ArrayList<>();
543545

@@ -1033,6 +1035,7 @@ private static Expr createPagedListResponseFactoryAssignExpr(
10331035
}
10341036

10351037
private List<MethodDefinition> createClassMethods(
1038+
GapicContext context,
10361039
Service service,
10371040
Map<String, VariableExpr> methodSettingsMemberVarExprs,
10381041
Set<String> deprecatedSettingVarNames,
@@ -1053,6 +1056,7 @@ private List<MethodDefinition> createClassMethods(
10531056
SettingsCommentComposer.NEW_BUILDER_METHOD_COMMENT));
10541057
javaMethods.addAll(createBuilderHelperMethods(service, typeStore));
10551058
javaMethods.add(createClassConstructor(service, methodSettingsMemberVarExprs, typeStore));
1059+
javaMethods.add(createGetLibraryMetadataMethod(context));
10561060
return javaMethods;
10571061
}
10581062

@@ -2096,6 +2100,48 @@ private static MethodDefinition createNestedClassBuildMethod(
20962100
.build();
20972101
}
20982102

2103+
private MethodDefinition createGetLibraryMetadataMethod(GapicContext context) {
2104+
TypeNode returnType = FIXED_TYPESTORE.get("LibraryMetadata");
2105+
MethodInvocationExpr libraryMetadataBuilderExpr =
2106+
MethodInvocationExpr.builder()
2107+
.setStaticReferenceType(FIXED_TYPESTORE.get("LibraryMetadata"))
2108+
.setMethodName("newBuilder")
2109+
.build();
2110+
2111+
if (!Strings.isNullOrEmpty(context.artifact())) {
2112+
libraryMetadataBuilderExpr =
2113+
MethodInvocationExpr.builder()
2114+
.setExprReferenceExpr(libraryMetadataBuilderExpr)
2115+
.setMethodName("setArtifactName")
2116+
.setArguments(ValueExpr.withValue(StringObjectValue.withValue(context.artifact())))
2117+
.build();
2118+
}
2119+
2120+
if (!Strings.isNullOrEmpty(context.repo())) {
2121+
libraryMetadataBuilderExpr =
2122+
MethodInvocationExpr.builder()
2123+
.setExprReferenceExpr(libraryMetadataBuilderExpr)
2124+
.setMethodName("setRepository")
2125+
.setArguments(ValueExpr.withValue(StringObjectValue.withValue(context.repo())))
2126+
.build();
2127+
}
2128+
2129+
Expr returnExpr =
2130+
MethodInvocationExpr.builder()
2131+
.setExprReferenceExpr(libraryMetadataBuilderExpr)
2132+
.setMethodName("build")
2133+
.setReturnType(returnType)
2134+
.build();
2135+
2136+
return MethodDefinition.builder()
2137+
.setIsOverride(true)
2138+
.setScope(ScopeNode.PROTECTED)
2139+
.setReturnType(returnType)
2140+
.setName("getLibraryMetadata")
2141+
.setReturnExpr(returnExpr)
2142+
.build();
2143+
}
2144+
20992145
private static TypeStore createStaticTypes() {
21002146
List<Class<?>> concreteClazzes =
21012147
Arrays.asList(
@@ -2121,6 +2167,7 @@ private static TypeStore createStaticTypes() {
21212167
ImmutableMap.class,
21222168
ImmutableSet.class,
21232169
InstantiatingExecutorProvider.class,
2170+
LibraryMetadata.class,
21242171
LimitExceededBehavior.class,
21252172
List.class,
21262173
Lists.class,

gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/GapicContext.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ public GapicMetadata gapicMetadata() {
7070
@Nullable
7171
public abstract com.google.api.Service serviceYamlProto();
7272

73+
@Nullable
74+
public abstract String repo();
75+
76+
@Nullable
77+
public abstract String artifact();
78+
7379
public boolean containsServices() {
7480
return !services().isEmpty();
7581
}
@@ -130,6 +136,10 @@ public Builder setHelperResourceNames(Set<ResourceName> helperResourceNames) {
130136

131137
public abstract Builder setTransport(Transport transport);
132138

139+
public abstract Builder setRepo(String repo);
140+
141+
public abstract Builder setArtifact(String artifact);
142+
133143
abstract ImmutableMap<String, ResourceName> resourceNames();
134144

135145
abstract ImmutableMap<String, ResourceName> helperResourceNames();

gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/Parser.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ public static GapicContext parse(CodeGeneratorRequest request) {
150150
Optional<GapicLanguageSettings> languageSettingsOpt =
151151
GapicLanguageSettingsParser.parse(gapicYamlConfigPathOpt);
152152
Optional<String> transportOpt = PluginArgumentParser.parseTransport(request);
153+
Optional<String> repoOpt = PluginArgumentParser.parseRepo(request);
154+
Optional<String> artifactOpt = PluginArgumentParser.parseArtifact(request);
153155

154156
boolean willGenerateMetadata = PluginArgumentParser.hasMetadataFlag(request);
155157
boolean willGenerateNumericEnum = PluginArgumentParser.hasNumericEnumFlag(request);
@@ -253,6 +255,8 @@ public static GapicContext parse(CodeGeneratorRequest request) {
253255
.setServiceYamlProto(serviceYamlProtoOpt.orElse(null))
254256
.setTransport(transport)
255257
.setRestNumericEnumsEnabled(willGenerateNumericEnum)
258+
.setRepo(repoOpt.orElse(null))
259+
.setArtifact(artifactOpt.orElse(null))
256260
.build();
257261
}
258262

gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/PluginArgumentParser.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ public class PluginArgumentParser {
3232
@VisibleForTesting static final String KEY_NUMERIC_ENUM = "rest-numeric-enums";
3333
@VisibleForTesting static final String KEY_SERVICE_YAML_CONFIG = "api-service-config";
3434
@VisibleForTesting static final String KEY_TRANSPORT = "transport";
35+
@VisibleForTesting static final String KEY_REPO = "repo";
36+
@VisibleForTesting static final String KEY_ARTIFACT = "artifact";
3537

3638
private static final String JSON_FILE_ENDING = "grpc_service_config.json";
3739
private static final String GAPIC_YAML_FILE_ENDING = "gapic.yaml";
@@ -53,6 +55,14 @@ static Optional<String> parseTransport(CodeGeneratorRequest request) {
5355
return parseConfigArgument(request.getParameter(), KEY_TRANSPORT);
5456
}
5557

58+
static Optional<String> parseRepo(CodeGeneratorRequest request) {
59+
return parseConfigArgument(request.getParameter(), KEY_REPO);
60+
}
61+
62+
static Optional<String> parseArtifact(CodeGeneratorRequest request) {
63+
return parseConfigArgument(request.getParameter(), KEY_ARTIFACT);
64+
}
65+
5666
static boolean hasMetadataFlag(CodeGeneratorRequest request) {
5767
return hasFlag(request.getParameter(), KEY_METADATA);
5868
}

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/ApiVersionTestingStubSettings.golden

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
1111
import com.google.api.gax.retrying.RetrySettings;
1212
import com.google.api.gax.rpc.ApiClientHeaderProvider;
1313
import com.google.api.gax.rpc.ClientContext;
14+
import com.google.api.gax.rpc.LibraryMetadata;
1415
import com.google.api.gax.rpc.StatusCode;
1516
import com.google.api.gax.rpc.StubSettings;
1617
import com.google.api.gax.rpc.TransportChannelProvider;
@@ -166,6 +167,11 @@ public class EchoWithVersionStubSettings extends StubSettings<EchoWithVersionStu
166167
echoWithVersionMethodSettings = settingsBuilder.echoWithVersionMethodSettings().build();
167168
}
168169

170+
@Override
171+
protected LibraryMetadata getLibraryMetadata() {
172+
return LibraryMetadata.newBuilder().build();
173+
}
174+
169175
/** Builder for EchoWithVersionStubSettings. */
170176
public static class Builder extends StubSettings.Builder<EchoWithVersionStubSettings, Builder> {
171177
private final ImmutableList<UnaryCallSettings.Builder<?, ?>> unaryMethodSettingsBuilders;

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/DeprecatedServiceStubSettings.golden

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
1111
import com.google.api.gax.retrying.RetrySettings;
1212
import com.google.api.gax.rpc.ApiClientHeaderProvider;
1313
import com.google.api.gax.rpc.ClientContext;
14+
import com.google.api.gax.rpc.LibraryMetadata;
1415
import com.google.api.gax.rpc.StatusCode;
1516
import com.google.api.gax.rpc.StubSettings;
1617
import com.google.api.gax.rpc.TransportChannelProvider;
@@ -183,6 +184,11 @@ public class DeprecatedServiceStubSettings extends StubSettings<DeprecatedServic
183184
slowFibonacciSettings = settingsBuilder.slowFibonacciSettings().build();
184185
}
185186

187+
@Override
188+
protected LibraryMetadata getLibraryMetadata() {
189+
return LibraryMetadata.newBuilder().build();
190+
}
191+
186192
/** Builder for DeprecatedServiceStubSettings. */
187193
public static class Builder extends StubSettings.Builder<DeprecatedServiceStubSettings, Builder> {
188194
private final ImmutableList<UnaryCallSettings.Builder<?, ?>> unaryMethodSettingsBuilders;

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoServiceSelectiveGapicStubSettings.golden

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
1313
import com.google.api.gax.retrying.RetrySettings;
1414
import com.google.api.gax.rpc.ApiClientHeaderProvider;
1515
import com.google.api.gax.rpc.ClientContext;
16+
import com.google.api.gax.rpc.LibraryMetadata;
1617
import com.google.api.gax.rpc.StatusCode;
1718
import com.google.api.gax.rpc.StreamingCallSettings;
1819
import com.google.api.gax.rpc.StubSettings;
@@ -220,6 +221,11 @@ public class EchoServiceShouldGeneratePartialUsualStubSettings
220221
settingsBuilder.echoShouldGenerateAsInternalSettings().build();
221222
}
222223

224+
@Override
225+
protected LibraryMetadata getLibraryMetadata() {
226+
return LibraryMetadata.newBuilder().build();
227+
}
228+
223229
/** Builder for EchoServiceShouldGeneratePartialUsualStubSettings. */
224230
public static class Builder
225231
extends StubSettings.Builder<EchoServiceShouldGeneratePartialUsualStubSettings, Builder> {

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/EchoStubSettings.golden

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import com.google.api.gax.retrying.RetrySettings;
2020
import com.google.api.gax.rpc.ApiCallContext;
2121
import com.google.api.gax.rpc.ApiClientHeaderProvider;
2222
import com.google.api.gax.rpc.ClientContext;
23+
import com.google.api.gax.rpc.LibraryMetadata;
2324
import com.google.api.gax.rpc.OperationCallSettings;
2425
import com.google.api.gax.rpc.PageContext;
2526
import com.google.api.gax.rpc.PagedCallSettings;
@@ -406,6 +407,14 @@ public class EchoStubSettings extends StubSettings<EchoStubSettings> {
406407
pagedExpandLegacySettings = settingsBuilder.pagedExpandLegacySettings().build();
407408
}
408409

410+
@Override
411+
protected LibraryMetadata getLibraryMetadata() {
412+
return LibraryMetadata.newBuilder()
413+
.setArtifactName("com.google.cloud:gapic-showcase")
414+
.setRepository("googleapis/sdk-platform-java")
415+
.build();
416+
}
417+
409418
/** Builder for EchoStubSettings. */
410419
public static class Builder extends StubSettings.Builder<EchoStubSettings, Builder> {
411420
private final ImmutableList<UnaryCallSettings.Builder<?, ?>> unaryMethodSettingsBuilders;

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/JobServiceStubSettings.golden

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import com.google.api.gax.retrying.RetrySettings;
1515
import com.google.api.gax.rpc.ApiCallContext;
1616
import com.google.api.gax.rpc.ApiClientHeaderProvider;
1717
import com.google.api.gax.rpc.ClientContext;
18+
import com.google.api.gax.rpc.LibraryMetadata;
1819
import com.google.api.gax.rpc.PageContext;
1920
import com.google.api.gax.rpc.PagedCallSettings;
2021
import com.google.api.gax.rpc.PagedListDescriptor;
@@ -256,6 +257,11 @@ public class JobServiceStubSettings extends StubSettings<JobServiceStubSettings>
256257
listJobsSettings = settingsBuilder.listJobsSettings().build();
257258
}
258259

260+
@Override
261+
protected LibraryMetadata getLibraryMetadata() {
262+
return LibraryMetadata.newBuilder().build();
263+
}
264+
259265
/** Builder for JobServiceStubSettings. */
260266
public static class Builder extends StubSettings.Builder<JobServiceStubSettings, Builder> {
261267
private final ImmutableList<UnaryCallSettings.Builder<?, ?>> unaryMethodSettingsBuilders;

0 commit comments

Comments
 (0)