This is an automated email from the ASF dual-hosted git repository. zixuan pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/pulsar.git
The following commit(s) were added to refs/heads/master by this push: new e19856a1a1b [improve][client] Allow adding custom description to User-Agent header (#24729) e19856a1a1b is described below commit e19856a1a1bf065d86c6c61c6ce96577e3310eb5 Author: Zixuan Liu <node...@gmail.com> AuthorDate: Fri Sep 12 09:59:02 2025 +0800 [improve][client] Allow adding custom description to User-Agent header (#24729) --- .../apache/pulsar/client/admin/PulsarAdminBuilder.java | 17 +++++++++++++++++ .../client/admin/internal/PulsarAdminBuilderImpl.java | 6 ++++++ .../client/admin/internal/http/AsyncHttpConnector.java | 5 ++++- .../client/admin/internal/PulsarAdminImplTest.java | 9 +++++++++ .../java/org/apache/pulsar/client/impl/HttpClient.java | 5 ++++- 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminBuilder.java b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminBuilder.java index 5c41d98b89d..216376c7eb6 100644 --- a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminBuilder.java +++ b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminBuilder.java @@ -376,4 +376,21 @@ public interface PulsarAdminBuilder { * @return the PulsarAdminBuilder instance */ PulsarAdminBuilder connectionMaxIdleSeconds(int connectionMaxIdleSeconds); + + /** + * Set the description. + * + * <p> By default, PulsarAdmin sends an HTTP <i>User-Agent</i> header such as + * <code>Pulsar-Java-v<x.y.z></code> when making requests to the broker. + * + * <p> This method provides a way to add more description to a specific PulsarAdmin instance. If it's configured, + * the description will be appended to the original admin version string, with '-' as the separator. + * + * <p>For example, if the admin version is 4.0.0, and the description is "forked", the final client version string + * will be "Pulsar-Java-v4.0.0-forked". + * + * @param description the description of the current PulsarAdmin instance + * @throws IllegalArgumentException if the length of description exceeds 64 + */ + PulsarAdminBuilder description(String description); } \ No newline at end of file diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminBuilderImpl.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminBuilderImpl.java index 7f0b3ab9a42..8a4659c5b87 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminBuilderImpl.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminBuilderImpl.java @@ -283,4 +283,10 @@ public class PulsarAdminBuilderImpl implements PulsarAdminBuilder { this.conf.setConnectionMaxIdleSeconds(connectionMaxIdleSeconds); return this; } + + @Override + public PulsarAdminBuilder description(String description) { + this.conf.setDescription(description); + return this; + } } diff --git a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java index fb11d9e46d3..b9ef758e3c6 100644 --- a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java +++ b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java @@ -165,7 +165,10 @@ public class AsyncHttpConnector implements Connector, AsyncHttpRequestExecutor { confBuilder.setRequestTimeout(conf.getRequestTimeoutMs()); confBuilder.setConnectTimeout(connectTimeoutMs); confBuilder.setReadTimeout(readTimeoutMs); - confBuilder.setUserAgent(String.format("Pulsar-Java-v%s", PulsarVersion.getVersion())); + confBuilder.setUserAgent(String.format("Pulsar-Java-v%s%s", + PulsarVersion.getVersion(), + (conf.getDescription() == null ? "" : ("-" + conf.getDescription())) + )); confBuilder.setRequestTimeout(requestTimeoutMs); confBuilder.setIoThreadsCount(conf.getNumIoThreads()); confBuilder.setKeepAliveStrategy(new DefaultKeepAliveStrategy() { diff --git a/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/PulsarAdminImplTest.java b/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/PulsarAdminImplTest.java index 27c6fd96079..8b406b8bc6d 100644 --- a/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/PulsarAdminImplTest.java +++ b/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/PulsarAdminImplTest.java @@ -20,8 +20,11 @@ package org.apache.pulsar.client.admin.internal; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; +import lombok.Cleanup; import lombok.SneakyThrows; +import org.apache.pulsar.client.admin.PulsarAdmin; import org.apache.pulsar.client.api.Authentication; +import org.apache.pulsar.client.api.PulsarClientException; import org.apache.pulsar.client.impl.auth.AuthenticationDisabled; import org.apache.pulsar.client.impl.conf.ClientConfigurationData; import org.testng.annotations.Test; @@ -45,6 +48,12 @@ public class PulsarAdminImplTest { assertThat(createAdminAndGetAuth(conf)).isSameAs(auth); } + @Test + public void testClientDescription() throws PulsarClientException { + @Cleanup PulsarAdmin ignored = + PulsarAdmin.builder().serviceHttpUrl("http://localhost:8080").description("forked").build(); + } + @SneakyThrows private Authentication createAdminAndGetAuth(ClientConfigurationData conf) { try (PulsarAdminImpl admin = new PulsarAdminImpl("http://localhost:8080", conf, null)) { diff --git a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/HttpClient.java b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/HttpClient.java index f9312be39aa..633ca606388 100644 --- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/HttpClient.java +++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/HttpClient.java @@ -84,7 +84,10 @@ public class HttpClient implements Closeable { confBuilder.setMaxRedirects(conf.getMaxLookupRedirects()); confBuilder.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_IN_SECONDS * 1000); confBuilder.setReadTimeout(DEFAULT_READ_TIMEOUT_IN_SECONDS * 1000); - confBuilder.setUserAgent(String.format("Pulsar-Java-v%s", PulsarVersion.getVersion())); + confBuilder.setUserAgent(String.format("Pulsar-Java-v%s%s", + PulsarVersion.getVersion(), + (conf.getDescription() == null ? "" : ("-" + conf.getDescription())) + )); confBuilder.setKeepAliveStrategy(new DefaultKeepAliveStrategy() { @Override public boolean keepAlive(InetSocketAddress remoteAddress, Request ahcRequest,