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..66365d9bd 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,13 @@ public String getDatabase() { return database; } + @Deprecated public String getVersionString() { - return Version.getVersion() - .map(version -> "ydb-java-sdk/" + version) - .orElse(Version.UNKNOWN_VERSION); + return getBuildInfo(); + } + + public String getBuildInfo() { + return buildInfo; } public String getApplicationName() { @@ -423,6 +429,21 @@ 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) { + Objects.requireNonNull(extraBuildInfo, "extraBuildInfo is null"); + 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;