Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
7082247
feat: introduce minimal implementation of OTel tracing
diegomarquezp Feb 4, 2026
bfe6a6d
chore: avoid new public methods
diegomarquezp Feb 5, 2026
ea6cb18
feat: add api tracer context
diegomarquezp Feb 5, 2026
97bec08
Merge remote-tracking branch 'origin/main' into observability/initial…
diegomarquezp Feb 5, 2026
097f701
chore: concise comment
diegomarquezp Feb 5, 2026
f547e5a
fix: use internal span kind for operations
diegomarquezp Feb 5, 2026
b7b9e31
chore: remove unnecessary inScope implementation
diegomarquezp Feb 5, 2026
556c84c
Revert "chore: remove unnecessary inScope implementation"
diegomarquezp Feb 5, 2026
0359b7d
test: add test for inScope()
diegomarquezp Feb 5, 2026
402cb89
Merge remote-tracking branch 'origin/main' into observability/initial…
diegomarquezp Feb 5, 2026
420278b
chore: use suggested server address resolution impl
diegomarquezp Feb 5, 2026
6de9fb6
fix: use concurrent hash map
diegomarquezp Feb 5, 2026
a61dacf
chore: remove default impl for startSpan with parent
diegomarquezp Feb 5, 2026
b000d52
chore: add opentelemery-context to tests
diegomarquezp Feb 5, 2026
9ce0c34
test: increase coverage for TracingTracerTest
diegomarquezp Feb 5, 2026
9c6c737
deps: include opentelemetry context in gax
diegomarquezp Feb 5, 2026
e77de58
chore: simplify and remove error handling
diegomarquezp Feb 9, 2026
8f07f61
chore: review refactor
diegomarquezp Feb 10, 2026
2cfcd68
chore: make TracingTracerFactory(recorder, opAtts, atAtts) package pr…
diegomarquezp Feb 10, 2026
2415c6b
chore: remove unnecessary inScope
diegomarquezp Feb 10, 2026
0f5e9b5
chore: rename startSpan to createSpan
diegomarquezp Feb 10, 2026
0c3bd22
chore: use server address instead of endpoint context
diegomarquezp Feb 10, 2026
bdeb291
chore: rename classes
diegomarquezp Feb 10, 2026
5c07a3c
chore: add javadoc for tracer
diegomarquezp Feb 10, 2026
ff1d45d
chore: rename to TraceSpan, improve javadocs
diegomarquezp Feb 10, 2026
043ce62
chore: format
diegomarquezp Feb 10, 2026
dbc5f41
Update gax-java/gax/src/main/java/com/google/api/gax/tracing/AppCentr…
diegomarquezp Feb 10, 2026
b4bce0d
chore: handle ipv6 in endpoint context
diegomarquezp Feb 10, 2026
6e95cf4
Merge branch 'observability/initial-tracing-impl' of https://github.c…
diegomarquezp Feb 10, 2026
e873904
chore: add language tests
diegomarquezp Feb 10, 2026
68943b0
chore: AppCentricTracer to implement interface
diegomarquezp Feb 11, 2026
ba3c080
feat(obs): generate gapic.properties file with repo property
diegomarquezp Feb 12, 2026
caead0d
feat: implement repo handling in gax
diegomarquezp Feb 12, 2026
58f72d2
test: add tests for repo property
diegomarquezp Feb 12, 2026
5a5d9d6
chore: speed up image building
diegomarquezp Feb 12, 2026
015aa88
build: introduce repo property to generation config
diegomarquezp Feb 12, 2026
0907e93
chore: update showcase module
diegomarquezp Feb 12, 2026
cd4d4d0
chore: revert operation implementation
diegomarquezp Feb 12, 2026
5b76e40
chore: extract common span attributes to separate class
diegomarquezp Feb 12, 2026
c783d68
chore: remove unused var
diegomarquezp Feb 12, 2026
1eeb197
Merge branch 'observability/initial-tracing-impl' into observability/…
diegomarquezp Feb 12, 2026
d2bd03c
chore(obs): use `Span` instead of `AppCentric` prefix for tracing
diegomarquezp Feb 19, 2026
13f9bb3
Merge branch 'observability/rename-to-span' into observability/tracin…
diegomarquezp Feb 19, 2026
beee741
chore: use ApiTracerContext for this
diegomarquezp Feb 19, 2026
c2acaaf
feat: add ApiTracerContext client specific subclass generation
diegomarquezp Feb 19, 2026
c60da4c
chore: update goldens
diegomarquezp Feb 19, 2026
e3be9f4
chore: fix ApiTraceContext subclass generation
diegomarquezp Feb 20, 2026
da35f97
chore: regenerate showcase
diegomarquezp Feb 20, 2026
2983e30
chore: fix default var in generate_library.sh
diegomarquezp Feb 20, 2026
f0e17ac
chore: infer server address directly from StubSettings
diegomarquezp Feb 20, 2026
55e4be1
chore: adapt to stubsettings inferring server address
diegomarquezp Feb 20, 2026
4aa17c4
chore: revert changes and pass server address from ClientContext
diegomarquezp Feb 20, 2026
079d1f5
chore: update goldens
diegomarquezp Feb 20, 2026
8601b76
chore: generate libraries at Fri Feb 20 18:31:23 UTC 2026
cloud-java-bot Feb 20, 2026
a0fcd28
chore: regenerate showcase
diegomarquezp Feb 20, 2026
4b6e9ae
Merge branch 'observability/tracing-attr/repo' of https://github.com/…
diegomarquezp Feb 20, 2026
c413fbf
chore: fix type hint
diegomarquezp Feb 20, 2026
63e6ee6
chore: optimize for reliability scanner
diegomarquezp Feb 20, 2026
bac45b3
chore: delete old class
diegomarquezp Feb 20, 2026
f3f14c9
chore: simplify apitracercontext
diegomarquezp Feb 20, 2026
2357560
chore: simplify apitracercontext
diegomarquezp Feb 20, 2026
d3546de
chore: initial impl of GapicProperties
diegomarquezp Feb 23, 2026
575069d
chore: use abstract class approach
diegomarquezp Feb 23, 2026
8665e44
chore: adapt generator
diegomarquezp Feb 23, 2026
ef26cd5
chore: update goldens
diegomarquezp Feb 23, 2026
3f88605
chore: add golden test for gapic properties
diegomarquezp Feb 23, 2026
954d195
chore: introduce artifact name
diegomarquezp Feb 23, 2026
cb76dfc
chore: rename AppCentricAttributes to ObservabilityAttributes
diegomarquezp Feb 23, 2026
282d1f5
chore: format
diegomarquezp Feb 23, 2026
47fc594
Merge branch 'observability/rename-to-span' into observability/tracin…
diegomarquezp Feb 23, 2026
121da5e
chore: include artifact in hermetic build
diegomarquezp Feb 23, 2026
f5eeec9
chore: use artifact and group id
diegomarquezp Feb 23, 2026
0d048c2
chore: reformat
diegomarquezp Feb 23, 2026
7d68462
chore: update showcase
diegomarquezp Feb 23, 2026
7856db6
chore: remove unused class
diegomarquezp Feb 23, 2026
8eb7495
chore: remove unused class
diegomarquezp Feb 23, 2026
2762873
chore: rename fn arg
diegomarquezp Feb 23, 2026
e1d62b7
chore: flatten class name logic
diegomarquezp Feb 23, 2026
a68cbba
chore: generate libraries at Mon Feb 23 21:54:25 UTC 2026
cloud-java-bot Feb 23, 2026
66f0566
chore: fix copyright year
diegomarquezp Feb 23, 2026
fd4829f
chore: simplify ApiTracerContext
diegomarquezp Feb 23, 2026
39c2014
test: test artifact in plugin argument parser
diegomarquezp Feb 23, 2026
4df72b3
chore: remove unused class
diegomarquezp Feb 23, 2026
55a9076
chore: remove old goldens
diegomarquezp Feb 23, 2026
36991a2
Merge branch 'observability/tracing-attr/repo' of https://github.com/…
diegomarquezp Feb 23, 2026
fc34de5
chore: update goldens
diegomarquezp Feb 24, 2026
9a35625
Merge branch 'main' into observability/tracing-attr/repo
diegomarquezp Feb 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ RUN cat /java-formatter-version
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"

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.google.api.generator.engine.ast.ClassDefinition;
import com.google.api.generator.engine.ast.CommentStatement;
import com.google.api.generator.gapic.composer.comment.CommentComposer;
import com.google.api.generator.gapic.composer.common.GapicPropertiesClassComposer;
import com.google.api.generator.gapic.composer.grpc.GrpcServiceCallableFactoryClassComposer;
import com.google.api.generator.gapic.composer.grpc.GrpcServiceStubClassComposer;
import com.google.api.generator.gapic.composer.grpc.MockServiceClassComposer;
Expand Down Expand Up @@ -69,6 +70,10 @@ public static List<GapicClass> generateServiceClasses(GapicContext context) {
clazzes.addAll(generateClientSettingsClasses(context));
clazzes.addAll(generateMockClasses(context, context.services()));
clazzes.addAll(generateTestClasses(context));
if (context.containsServices()) {
clazzes.add(
GapicPropertiesClassComposer.instance().generate(context, context.services().get(0)));
}
return clazzes;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import com.google.api.gax.longrunning.OperationSnapshot;
import com.google.api.gax.longrunning.OperationTimedPollAlgorithm;
import com.google.api.gax.retrying.RetrySettings;
import com.google.api.gax.rpc.AbstractGapicProperties;
import com.google.api.gax.rpc.ApiCallContext;
import com.google.api.gax.rpc.ApiClientHeaderProvider;
import com.google.api.gax.rpc.BatchedRequestIssuer;
Expand Down Expand Up @@ -1053,6 +1054,7 @@ private List<MethodDefinition> createClassMethods(
SettingsCommentComposer.NEW_BUILDER_METHOD_COMMENT));
javaMethods.addAll(createBuilderHelperMethods(service, typeStore));
javaMethods.add(createClassConstructor(service, methodSettingsMemberVarExprs, typeStore));
javaMethods.add(createGetGapicPropertiesMethod(service, typeStore));
return javaMethods;
}

Expand Down Expand Up @@ -2096,9 +2098,20 @@ private static MethodDefinition createNestedClassBuildMethod(
.build();
}

private MethodDefinition createGetGapicPropertiesMethod(Service service, TypeStore typeStore) {
return MethodDefinition.builder()
.setIsOverride(true)
.setScope(ScopeNode.PROTECTED)
.setReturnType(FIXED_TYPESTORE.get("AbstractGapicProperties"))
.setName("getGapicProperties")
.setReturnExpr(NewObjectExpr.withType(typeStore.get("GapicProperties")))
.build();
}

private static TypeStore createStaticTypes() {
List<Class<?>> concreteClazzes =
Arrays.asList(
AbstractGapicProperties.class,
ApiCallContext.class,
ApiClientHeaderProvider.class,
ApiFunction.class,
Expand Down Expand Up @@ -2175,6 +2188,12 @@ private TypeStore createDynamicTypes(Service service, String pakkage) {
true,
ClassNames.getServiceClientClassName(service));

// Gapic properties
typeStore.put(
service.pakkage(),
"GapicProperties",
FIXED_TYPESTORE.get("AbstractGapicProperties").reference());

return typeStore;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/*
* Copyright 2026 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
*
* http://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.api.generator.gapic.composer.common;

import com.google.api.core.InternalApi;
import com.google.api.gax.core.GaxProperties;
import com.google.api.gax.rpc.AbstractGapicProperties;
import com.google.api.generator.engine.ast.AnnotationNode;
import com.google.api.generator.engine.ast.ClassDefinition;
import com.google.api.generator.engine.ast.Expr;
import com.google.api.generator.engine.ast.MethodDefinition;
import com.google.api.generator.engine.ast.ScopeNode;
import com.google.api.generator.engine.ast.StringObjectValue;
import com.google.api.generator.engine.ast.TypeNode;
import com.google.api.generator.engine.ast.ValueExpr;
import com.google.api.generator.gapic.composer.store.TypeStore;
import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.annotation.Generated;

public class GapicPropertiesClassComposer implements ClassComposer {
private static final GapicPropertiesClassComposer INSTANCE = new GapicPropertiesClassComposer();

private static final TypeStore FIXED_TYPESTORE = createStaticTypes();

private GapicPropertiesClassComposer() {}

public static GapicPropertiesClassComposer instance() {
return INSTANCE;
}

@Override
public GapicClass generate(GapicContext context, Service service) {
String pakkage = service.pakkage();
String className = "GapicProperties";

ClassDefinition classDef =
ClassDefinition.builder()
.setPackageString(pakkage)
.setAnnotations(createClassAnnotations())
.setScope(ScopeNode.PUBLIC)
.setName(className)
.setExtendsType(FIXED_TYPESTORE.get("AbstractGapicProperties"))
.setMethods(createClassMethods(context))
.build();

return GapicClass.create(GapicClass.Kind.MAIN, classDef);
}

private static List<AnnotationNode> createClassAnnotations() {
return Arrays.asList(
AnnotationNode.withType(FIXED_TYPESTORE.get("InternalApi")),
AnnotationNode.builder()
.setType(FIXED_TYPESTORE.get("Generated"))
.setDescription("by gapic-generator-java")
.build());
}

private List<MethodDefinition> createClassMethods(GapicContext context) {
List<MethodDefinition> methods = new ArrayList<>();
methods.add(createGetRepositoryMethod(context));
methods.add(createGetArtifactNameMethod(context));
return methods;
}

private MethodDefinition createGetRepositoryMethod(GapicContext context) {
Expr returnExpr = ValueExpr.createNullExpr();
if (context.repo().isPresent()) {
returnExpr = ValueExpr.withValue(StringObjectValue.withValue(context.repo().orElse(null)));
}
return MethodDefinition.builder()
.setIsOverride(true)
.setScope(ScopeNode.PUBLIC)
.setReturnType(TypeNode.STRING)
.setName("getRepository")
.setReturnExpr(returnExpr)
.build();
}

private MethodDefinition createGetArtifactNameMethod(GapicContext context) {
Expr returnExpr = ValueExpr.createNullExpr();
if (context.artifact().isPresent()) {
returnExpr =
ValueExpr.withValue(StringObjectValue.withValue(context.artifact().orElse(null)));
}
return MethodDefinition.builder()
.setIsOverride(true)
.setScope(ScopeNode.PUBLIC)
.setReturnType(TypeNode.STRING)
.setName("getArtifactName")
.setReturnExpr(returnExpr)
.build();
}

private static TypeStore createStaticTypes() {
return new TypeStore(
Arrays.asList(
InternalApi.class,
Generated.class,
AbstractGapicProperties.class,
GaxProperties.class));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package com.google.api.generator.gapic.composer.store;

import com.google.api.generator.engine.ast.ConcreteReference;
import com.google.api.generator.engine.ast.Reference;
import com.google.api.generator.engine.ast.TypeNode;
import com.google.api.generator.engine.ast.VaporReference;
import com.google.api.generator.gapic.model.Message;
Expand Down Expand Up @@ -52,6 +53,16 @@ public void put(String pakkage, String typeName) {
VaporReference.builder().setName(typeName).setPakkage(pakkage).build()));
}

public void put(String pakkage, String typeName, Reference supertypeReference) {
VaporReference reference =
VaporReference.builder()
.setName(typeName)
.setPakkage(pakkage)
.setSupertypeReference(supertypeReference)
.build();
store.put(typeName, TypeNode.withReference(reference));
}

public void putAll(String pakkage, List<String> typeNames) {
for (String typeName : typeNames) {
put(pakkage, typeName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,17 @@ static GapicMetadata defaultGapicMetadata() {

public abstract Transport transport();

public abstract Optional<String> repo();

public abstract Optional<String> artifact();

public static Builder builder() {
return new AutoValue_GapicContext.Builder()
.setMixinServices(Collections.emptyList())
.setGapicMetadataEnabled(false)
.setRestNumericEnumsEnabled(false);
.setRestNumericEnumsEnabled(false)
.setRepo(Optional.empty())
.setArtifact(Optional.empty());
}

@AutoValue.Builder
Expand Down Expand Up @@ -130,6 +136,10 @@ public Builder setHelperResourceNames(Set<ResourceName> helperResourceNames) {

public abstract Builder setTransport(Transport transport);

public abstract Builder setRepo(Optional<String> repo);

public abstract Builder setArtifact(Optional<String> artifact);

abstract ImmutableMap<String, ResourceName> resourceNames();

abstract ImmutableMap<String, ResourceName> helperResourceNames();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ public static GapicContext parse(CodeGeneratorRequest request) {
Optional<GapicLanguageSettings> languageSettingsOpt =
GapicLanguageSettingsParser.parse(gapicYamlConfigPathOpt);
Optional<String> transportOpt = PluginArgumentParser.parseTransport(request);
Optional<String> repoOpt = PluginArgumentParser.parseRepo(request);
Optional<String> artifactOpt = PluginArgumentParser.parseArtifact(request);

boolean willGenerateMetadata = PluginArgumentParser.hasMetadataFlag(request);
boolean willGenerateNumericEnum = PluginArgumentParser.hasNumericEnumFlag(request);
Expand Down Expand Up @@ -253,6 +255,8 @@ public static GapicContext parse(CodeGeneratorRequest request) {
.setServiceYamlProto(serviceYamlProtoOpt.orElse(null))
.setTransport(transport)
.setRestNumericEnumsEnabled(willGenerateNumericEnum)
.setRepo(repoOpt)
.setArtifact(artifactOpt)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public class PluginArgumentParser {
@VisibleForTesting static final String KEY_NUMERIC_ENUM = "rest-numeric-enums";
@VisibleForTesting static final String KEY_SERVICE_YAML_CONFIG = "api-service-config";
@VisibleForTesting static final String KEY_TRANSPORT = "transport";
@VisibleForTesting static final String KEY_REPO = "repo";
@VisibleForTesting static final String KEY_ARTIFACT = "artifact";

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

static Optional<String> parseRepo(CodeGeneratorRequest request) {
return parseConfigArgument(request.getParameter(), KEY_REPO);
}

static Optional<String> parseArtifact(CodeGeneratorRequest request) {
return parseConfigArgument(request.getParameter(), KEY_ARTIFACT);
}

static boolean hasMetadataFlag(CodeGeneratorRequest request) {
return hasFlag(request.getParameter(), KEY_METADATA);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* Copyright 2026 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
*
* http://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.api.generator.gapic.composer.common;

import com.google.api.generator.gapic.model.GapicClass;
import com.google.api.generator.gapic.model.GapicContext;
import com.google.api.generator.gapic.model.Service;
import com.google.api.generator.test.framework.Assert;
import com.google.api.generator.test.protoloader.GrpcTestProtoLoader;
import org.junit.jupiter.api.Test;

class GapicPropertiesClassComposerTest {
@Test
void generateGapicPropertiesClass() {
GapicContext context = GrpcTestProtoLoader.instance().parseShowcaseEcho();
Service service = context.services().get(0);
GapicClass clazz = GapicPropertiesClassComposer.instance().generate(context, service);

Assert.assertGoldenClass(this.getClass(), clazz, "GapicProperties.golden");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.google.showcase.v1beta1;

import com.google.api.core.InternalApi;
import com.google.api.gax.rpc.AbstractGapicProperties;
import javax.annotation.Generated;

@InternalApi
@Generated("by gapic-generator-java")
public class GapicProperties extends AbstractGapicProperties {

@Override
public String getRepository() {
return "googleapis/sdk-platform-java";
}

@Override
public String getArtifactName() {
return "com.google.cloud:gapic-showcase";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.google.api.gax.grpc.GaxGrpcProperties;
import com.google.api.gax.grpc.GrpcTransportChannel;
import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider;
import com.google.api.gax.retrying.RetrySettings;
import com.google.api.gax.rpc.AbstractGapicProperties;
import com.google.api.gax.rpc.ApiClientHeaderProvider;
import com.google.api.gax.rpc.ClientContext;
import com.google.api.gax.rpc.StatusCode;
Expand All @@ -17,6 +18,7 @@ import com.google.api.gax.rpc.TransportChannelProvider;
import com.google.api.gax.rpc.UnaryCallSettings;
import com.google.api.version.test.EchoRequest;
import com.google.api.version.test.EchoResponse;
import com.google.api.version.test.GapicProperties;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
Expand Down Expand Up @@ -166,6 +168,11 @@ public class EchoWithVersionStubSettings extends StubSettings<EchoWithVersionStu
echoWithVersionMethodSettings = settingsBuilder.echoWithVersionMethodSettings().build();
}

@Override
protected AbstractGapicProperties getGapicProperties() {
return new GapicProperties();
}

/** Builder for EchoWithVersionStubSettings. */
public static class Builder extends StubSettings.Builder<EchoWithVersionStubSettings, Builder> {
private final ImmutableList<UnaryCallSettings.Builder<?, ?>> unaryMethodSettingsBuilders;
Expand Down
Loading
Loading