From e3b5fcb1e344b249b557a79e81f3542c988a14d9 Mon Sep 17 00:00:00 2001 From: Alexandr Gorshenin Date: Wed, 27 May 2026 16:10:08 +0100 Subject: [PATCH 1/2] Added method to customize x-build-info --- .../ydb/core/grpc/GrpcTransportBuilder.java | 23 +++++++++++++++---- .../java/tech/ydb/core/grpc/YdbHeaders.java | 2 +- .../impl/pool/DefaultChannelFactoryTest.java | 15 ++++++++++++ .../ydb/core/impl/pool/EndpointPoolTest.java | 1 - .../core/impl/pool/PriorityPickerTest.java | 1 - .../core/{timer => impl/pool}/TestTicker.java | 2 +- 6 files changed, 36 insertions(+), 8 deletions(-) rename core/src/test/java/tech/ydb/core/{timer => impl/pool}/TestTicker.java (92%) diff --git a/core/src/main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java b/core/src/main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java index 534cf08be..3564b7e5d 100644 --- a/core/src/main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java +++ b/core/src/main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java @@ -78,6 +78,9 @@ public enum InitMode { private final List>> channelInitializers = new ArrayList<>(); private Supplier schedulerFactory = YdbSchedulerFactory::createScheduler; private String localDc; + private String buildInfo = Version.getVersion().map(version -> "ydb-java-sdk/" + version) + .orElse(Version.UNKNOWN_VERSION); + private BalancingSettings balancingSettings; private Executor callExecutor = MoreExecutors.directExecutor(); private AuthRpcProvider authProvider = NopAuthProvider.INSTANCE; @@ -124,10 +127,8 @@ public String getDatabase() { return database; } - public String getVersionString() { - return Version.getVersion() - .map(version -> "ydb-java-sdk/" + version) - .orElse(Version.UNKNOWN_VERSION); + public String getBuildInfo() { + return buildInfo; } public String getApplicationName() { @@ -423,6 +424,20 @@ public GrpcTransportBuilder withTracer(Tracer tracer) { return this; } + /** + * Appends an extra build info string to the SDK build info reported to the server via the + * {@code x-ydb-sdk-build-info} header. The provided value is concatenated to the existing build info using + * a semicolon separator and is typically used to identify higher-level libraries or integrations built on top + * of the SDK (for example, {@code "ydb-jdbc-driver/2.4.0"}). + * + * @param extraBuildInfo additional build info to append to the SDK build info + * @return this builder instance + */ + public GrpcTransportBuilder withExtraBuildInfo(String extraBuildInfo) { + this.buildInfo = this.buildInfo + ";" + extraBuildInfo; + return this; + } + /** * use {@link GrpcTransportBuilder#withGrpcRetry(boolean) } instead * @return this diff --git a/core/src/main/java/tech/ydb/core/grpc/YdbHeaders.java b/core/src/main/java/tech/ydb/core/grpc/YdbHeaders.java index df6881a38..4479b93c2 100644 --- a/core/src/main/java/tech/ydb/core/grpc/YdbHeaders.java +++ b/core/src/main/java/tech/ydb/core/grpc/YdbHeaders.java @@ -41,7 +41,7 @@ private YdbHeaders() { } public static ClientInterceptor createMetadataInterceptor(GrpcTransportBuilder builder) { Metadata extraHeaders = new Metadata(); extraHeaders.put(YdbHeaders.DATABASE, builder.getDatabase()); - extraHeaders.put(YdbHeaders.BUILD_INFO, builder.getVersionString()); + extraHeaders.put(YdbHeaders.BUILD_INFO, builder.getBuildInfo()); String appName = builder.getApplicationName(); if (appName != null) { extraHeaders.put(YdbHeaders.APPLICATION_NAME, appName); diff --git a/core/src/test/java/tech/ydb/core/impl/pool/DefaultChannelFactoryTest.java b/core/src/test/java/tech/ydb/core/impl/pool/DefaultChannelFactoryTest.java index 96eea19c0..dd92b391c 100644 --- a/core/src/test/java/tech/ydb/core/impl/pool/DefaultChannelFactoryTest.java +++ b/core/src/test/java/tech/ydb/core/impl/pool/DefaultChannelFactoryTest.java @@ -154,6 +154,21 @@ public void customHeadersTest() { Assert.assertEquals("client-hostname", metadata.get(YdbHeaders.CLIENT_PROCESS_ID)); } + @Test + public void customBuildInfoTest() { + GrpcTransportBuilder builder = GrpcTransport.forHost(MOCKED_HOST, MOCKED_PORT, "/Root") + .withExtraBuildInfo("driver/1.0.0") + .withExtraBuildInfo("test-app/1.0.0"); + ManagedChannelFactory factory = ChannelFactoryLoader.load().buildFactory(builder); + + Assert.assertSame(channelMock, factory.newManagedChannel(MOCKED_HOST, MOCKED_PORT, null)); + channelStaticMock.verify(FOR_ADDRESS, Mockito.times(1)); + + String version = "ydb-java-sdk/" + Version.getVersion().get(); + Metadata metadata = metadataCapture.getValue(); + Assert.assertEquals(version + ";driver/1.0.0;test-app/1.0.0", metadata.get(YdbHeaders.BUILD_INFO)); + } + @Test public void customChannelInitializer() { GrpcTransportBuilder builder = GrpcTransport.forHost(MOCKED_HOST, MOCKED_PORT, "/Root") diff --git a/core/src/test/java/tech/ydb/core/impl/pool/EndpointPoolTest.java b/core/src/test/java/tech/ydb/core/impl/pool/EndpointPoolTest.java index 4bb90c5ea..c0f343243 100644 --- a/core/src/test/java/tech/ydb/core/impl/pool/EndpointPoolTest.java +++ b/core/src/test/java/tech/ydb/core/impl/pool/EndpointPoolTest.java @@ -24,7 +24,6 @@ import tech.ydb.core.UnexpectedResultException; import tech.ydb.core.grpc.BalancingSettings; import tech.ydb.core.grpc.GrpcRequestSettings; -import tech.ydb.core.timer.TestTicker; /** * @author Aleksandr Gorshenin diff --git a/core/src/test/java/tech/ydb/core/impl/pool/PriorityPickerTest.java b/core/src/test/java/tech/ydb/core/impl/pool/PriorityPickerTest.java index e6d00b660..b1da65ad4 100644 --- a/core/src/test/java/tech/ydb/core/impl/pool/PriorityPickerTest.java +++ b/core/src/test/java/tech/ydb/core/impl/pool/PriorityPickerTest.java @@ -13,7 +13,6 @@ import org.junit.Test; import tech.ydb.core.grpc.BalancingSettings; -import tech.ydb.core.timer.TestTicker; /** * @author Kirill diff --git a/core/src/test/java/tech/ydb/core/timer/TestTicker.java b/core/src/test/java/tech/ydb/core/impl/pool/TestTicker.java similarity index 92% rename from core/src/test/java/tech/ydb/core/timer/TestTicker.java rename to core/src/test/java/tech/ydb/core/impl/pool/TestTicker.java index 619850b22..5da23beba 100644 --- a/core/src/test/java/tech/ydb/core/timer/TestTicker.java +++ b/core/src/test/java/tech/ydb/core/impl/pool/TestTicker.java @@ -1,4 +1,4 @@ -package tech.ydb.core.timer; +package tech.ydb.core.impl.pool; import java.util.Arrays; import java.util.Iterator; From 4d761c54a6e5f6f3ad01606f05abdd920cc31b2e Mon Sep 17 00:00:00 2001 From: Alexandr Gorshenin Date: Wed, 27 May 2026 16:16:58 +0100 Subject: [PATCH 2/2] Small fixes --- .../main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java b/core/src/main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java index 3564b7e5d..66365d9bd 100644 --- a/core/src/main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java +++ b/core/src/main/java/tech/ydb/core/grpc/GrpcTransportBuilder.java @@ -127,6 +127,11 @@ public String getDatabase() { return database; } + @Deprecated + public String getVersionString() { + return getBuildInfo(); + } + public String getBuildInfo() { return buildInfo; } @@ -434,6 +439,7 @@ public GrpcTransportBuilder withTracer(Tracer tracer) { * @return this builder instance */ public GrpcTransportBuilder withExtraBuildInfo(String extraBuildInfo) { + Objects.requireNonNull(extraBuildInfo, "extraBuildInfo is null"); this.buildInfo = this.buildInfo + ";" + extraBuildInfo; return this; }