This is an automated email from the ASF dual-hosted git repository. dsmiley pushed a commit to branch branch_10x in repository https://gitbox.apache.org/repos/asf/solr.git
commit 5c3ae79fbde74ad67e22a11b520d3fd479cdbc50 Author: David Smiley <[email protected]> AuthorDate: Tue Sep 8 18:04:09 2026 -0400 HttpSolrClient add withTheseParamNamesInTheUrl defaults (#4871) HttpSolrClient impls now sends certain interesting request parameters in the URL query string when a POST of parameters is submitted. In other words, withTheseParamNamesInTheUrl now has a default set. This improves observability, particularly for distributed search & admin commands. (cherry picked from commit 125f7c011f3473dcfa3417cba1b0a492493edfef) --- .../PR#4871-httpSolrClientDefaultUrlParams.yml | 9 ++++++++ .../solr/tracing/TestDistributedTracing/test.json | 12 ++++++---- .../tracing/TestDistributedTracing/testV2Api.json | 21 +++++++++++------ .../solr/opentelemetry/TestDistributedTracing.java | 2 +- .../solr/client/solrj/impl/HttpSolrClient.java | 27 ++++++++++++++++++---- 5 files changed, 54 insertions(+), 17 deletions(-) diff --git a/changelog/unreleased/PR#4871-httpSolrClientDefaultUrlParams.yml b/changelog/unreleased/PR#4871-httpSolrClientDefaultUrlParams.yml new file mode 100644 index 00000000000..7dfcae61bdf --- /dev/null +++ b/changelog/unreleased/PR#4871-httpSolrClientDefaultUrlParams.yml @@ -0,0 +1,9 @@ +title: > + HttpSolrClient impls now sends certain interesting request parameters in the URL query string when a POST of parameters is submitted. In other words, withTheseParamNamesInTheUrl now has a default set. + This improves observability, particularly for distributed search & admin commands. +type: changed +authors: + - name: David Smiley +links: + - name: PR#4871 + url: https://github.com/apache/solr/pull/4871 diff --git a/solr/modules/opentelemetry/src/test-files/solr/tracing/TestDistributedTracing/test.json b/solr/modules/opentelemetry/src/test-files/solr/tracing/TestDistributedTracing/test.json index 8cd2d28437a..87782172c2d 100644 --- a/solr/modules/opentelemetry/src/test-files/solr/tracing/TestDistributedTracing/test.json +++ b/solr/modules/opentelemetry/src/test-files/solr/tracing/TestDistributedTracing/test.json @@ -84,7 +84,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/collection1_shard1_replica_nN/select"}, + "http.url":"http://NORMALIZED/solr/collection1_shard1_replica_nN/select", + "http.params":"distrib=false&isShard=true&shards.purpose=16388"}, { "name":"post:/{core}/select", "kind":"SERVER", @@ -92,7 +93,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/collection1_shard1_replica_nN/select"}, + "http.url":"http://NORMALIZED/solr/collection1_shard1_replica_nN/select", + "http.params":"distrib=false&isShard=true&shards.purpose=64"}, { "name":"post:/{core}/select", "kind":"SERVER", @@ -100,7 +102,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/collection1_shard2_replica_nN/select"}, + "http.url":"http://NORMALIZED/solr/collection1_shard2_replica_nN/select", + "http.params":"distrib=false&isShard=true&shards.purpose=16388"}, { "name":"post:/{core}/select", "kind":"SERVER", @@ -108,4 +111,5 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/collection1_shard2_replica_nN/select"}]}]}]} \ No newline at end of file + "http.url":"http://NORMALIZED/solr/collection1_shard2_replica_nN/select", + "http.params":"distrib=false&isShard=true&shards.purpose=64"}]}]}]} \ No newline at end of file diff --git a/solr/modules/opentelemetry/src/test-files/solr/tracing/TestDistributedTracing/testV2Api.json b/solr/modules/opentelemetry/src/test-files/solr/tracing/TestDistributedTracing/testV2Api.json index 20ef31ae8ab..047c3acc1f0 100644 --- a/solr/modules/opentelemetry/src/test-files/solr/tracing/TestDistributedTracing/testV2Api.json +++ b/solr/modules/opentelemetry/src/test-files/solr/tracing/TestDistributedTracing/testV2Api.json @@ -14,7 +14,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/admin/cores"}, + "http.url":"http://NORMALIZED/solr/admin/cores", + "http.params":"action=RELOAD"}, { "name":"reload:/admin/cores", "kind":"SERVER", @@ -22,7 +23,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/admin/cores"}, + "http.url":"http://NORMALIZED/solr/admin/cores", + "http.params":"action=RELOAD"}, { "name":"reload:/admin/cores", "kind":"SERVER", @@ -30,7 +32,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/admin/cores"}, + "http.url":"http://NORMALIZED/solr/admin/cores", + "http.params":"action=RELOAD"}, { "name":"reload:/admin/cores", "kind":"SERVER", @@ -38,7 +41,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/admin/cores"}]}, + "http.url":"http://NORMALIZED/solr/admin/cores", + "http.params":"action=RELOAD"}]}, { "name":"post:/collections/{collection}/reload", "kind":"SERVER", @@ -124,7 +128,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/collection1_shard1_replica_nN/select"}, + "http.url":"http://NORMALIZED/solr/collection1_shard1_replica_nN/select", + "http.params":"distrib=false&isShard=true&shards.purpose=16388"}, { "name":"post:/{core}/select", "kind":"SERVER", @@ -132,7 +137,8 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/collection1_shard2_replica_nN/select"}, + "http.url":"http://NORMALIZED/solr/collection1_shard2_replica_nN/select", + "http.params":"distrib=false&isShard=true&shards.purpose=16388"}, { "name":"post:/{core}/select", "kind":"SERVER", @@ -140,4 +146,5 @@ "db.type":"solr", "http.request.method":"POST", "http.response.status_code":200, - "http.url":"http://NORMALIZED/solr/collection1_shard2_replica_nN/select"}]}]}]} \ No newline at end of file + "http.url":"http://NORMALIZED/solr/collection1_shard2_replica_nN/select", + "http.params":"distrib=false&isShard=true&shards.purpose=64"}]}]}]} \ No newline at end of file diff --git a/solr/modules/opentelemetry/src/test/org/apache/solr/opentelemetry/TestDistributedTracing.java b/solr/modules/opentelemetry/src/test/org/apache/solr/opentelemetry/TestDistributedTracing.java index f667729eb60..22e4f9d87d6 100644 --- a/solr/modules/opentelemetry/src/test/org/apache/solr/opentelemetry/TestDistributedTracing.java +++ b/solr/modules/opentelemetry/src/test/org/apache/solr/opentelemetry/TestDistributedTracing.java @@ -201,7 +201,7 @@ public class TestDistributedTracing extends SolrCloudTestCase { // db.instance=testInternalCollectionApiCommands // - this will be the parent span, all following spans will have the same traceId // - // 3..6 (4 times) name=post:/admin/cores + // 3..6 (4 times) name=create:/admin/cores // db.instance=testInternalCollectionApiCommands_shard1_replica_n2 // db.instance=testInternalCollectionApiCommands_shard2_replica_n4 // db.instance=testInternalCollectionApiCommands_shard2_replica_n1 diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java index fccc4357fcd..0ae5dd00dc8 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpSolrClient.java @@ -46,8 +46,12 @@ import org.apache.solr.client.solrj.response.JavaBinResponseParser; import org.apache.solr.client.solrj.response.ResponseParser; import org.apache.solr.client.solrj.util.ClientUtils; import org.apache.solr.common.SolrException; +import org.apache.solr.common.params.CollectionAdminParams; +import org.apache.solr.common.params.CommonAdminParams; import org.apache.solr.common.params.CommonParams; +import org.apache.solr.common.params.CoreAdminParams; import org.apache.solr.common.params.ModifiableSolrParams; +import org.apache.solr.common.params.ShardParams; import org.apache.solr.common.util.ContentStream; import org.apache.solr.common.util.NamedList; import org.slf4j.Logger; @@ -66,6 +70,23 @@ public abstract class HttpSolrClient extends SolrClient { private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); protected static final Charset FALLBACK_CHARSET = StandardCharsets.UTF_8; + /** + * See {@link #getUrlParamNames()}. Default set are interesting for routing or fundamental request + * purpose + */ + public static final Set<String> DEFAULT_URL_PARAM_NAMES = + Set.of( + CoreAdminParams.ACTION, + CommonAdminParams.ASYNC, + CollectionAdminParams.COLLECTION, + "name", // core/collection name + "command", // e.g. for replication + ShardParams.IS_SHARD, + CommonParams.DISTRIB, + ShardParams._ROUTE_, + ShardParams.SHARDS_PREFERENCE, + ShardParams.SHARDS_PURPOSE); + protected final String baseUrl; protected final long requestTimeoutMillis; @@ -88,11 +109,7 @@ public abstract class HttpSolrClient extends SolrClient { this.parser = builder.responseParser; } this.defaultCollection = builder.defaultCollection; - if (builder.urlParamNames != null) { - this.urlParamNames = builder.urlParamNames; - } else { - this.urlParamNames = Set.of(); - } + this.urlParamNames = Objects.requireNonNullElse(builder.urlParamNames, DEFAULT_URL_PARAM_NAMES); } private static String extractBaseUrl(String serverBaseUrl) {
