diff --git a/changelog/v9.10.0/SOLR-16458.yml b/changelog/v9.10.0/SOLR-16458.yml new file mode 100644 index 000000000000..df03618c0838 --- /dev/null +++ b/changelog/v9.10.0/SOLR-16458.yml @@ -0,0 +1,7 @@ +title: Add JAX-RS API for retrieving node thread information. +type: added +authors: + - name: Yash Goswami +links: + - name: SOLR-16458 + url: https://issues.apache.org/jira/browse/SOLR-16458 diff --git a/solr/api/src/java/org/apache/solr/client/api/endpoint/NodeThreadsApi.java b/solr/api/src/java/org/apache/solr/client/api/endpoint/NodeThreadsApi.java new file mode 100644 index 000000000000..bdef580775bb --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/NodeThreadsApi.java @@ -0,0 +1,12 @@ +package org.apache.solr.client.api.endpoint; + +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import org.apache.solr.client.api.model.NodeThreadsResponse; + +@Path("/node/threads") +public interface NodeThreadsApi { + + @GET + NodeThreadsResponse getThreadDump(); +} diff --git a/solr/api/src/java/org/apache/solr/client/api/model/NodeThreadsResponse.java b/solr/api/src/java/org/apache/solr/client/api/model/NodeThreadsResponse.java new file mode 100644 index 000000000000..d1f48a38a43f --- /dev/null +++ b/solr/api/src/java/org/apache/solr/client/api/model/NodeThreadsResponse.java @@ -0,0 +1,97 @@ +package org.apache.solr.client.api.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +public class NodeThreadsResponse extends SolrJerseyResponse { + + @JsonProperty("system") + public SystemInfo system; + + public static class SystemInfo { + + @JsonProperty("threadCount") + public ThreadCount threadCount; + + @JsonProperty("deadlocks") + public List deadlocks; + + @JsonProperty("threadDump") + public List threadDump; + } + + public static class ThreadCount { + + @JsonProperty("current") + public long current; + + @JsonProperty("peak") + public long peak; + + @JsonProperty("daemon") + public long daemon; + } + + public static class ThreadEntry { + + @JsonProperty("thread") + public ThreadInfo thread; + } + + public static class ThreadInfo { + + @JsonProperty("id") + public long id; + + @JsonProperty("name") + public String name; + + @JsonProperty("state") + public String state; + + @JsonProperty("lock") + public String lock; + + @JsonProperty("lock-waiting") + public LockWaiting lockWaiting; + + @JsonProperty("synchronizers-locked") + public List synchronizersLocked; + + @JsonProperty("monitors-locked") + public List monitorsLocked; + + @JsonProperty("suspended") + public Boolean suspended; + + @JsonProperty("native") + public Boolean nativeThread; + + @JsonProperty("cpuTime") + public String cpuTime; + + @JsonProperty("userTime") + public String userTime; + + @JsonProperty("stackTrace") + public List stackTrace; + } + + public static class LockWaiting { + + @JsonProperty("name") + public String name; + + @JsonProperty("owner") + public LockOwner owner; + } + + public static class LockOwner { + + @JsonProperty("name") + public String name; + + @JsonProperty("id") + public long id; + } +} diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java index 5d2832cd74eb..a8f931e0c182 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/ThreadDumpHandler.java @@ -28,16 +28,15 @@ import java.util.Collection; import java.util.List; import java.util.Locale; -import org.apache.solr.api.AnnotatedApi; -import org.apache.solr.api.Api; import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.handler.RequestHandlerBase; -import org.apache.solr.handler.admin.api.NodeThreadsAPI; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; import org.apache.solr.security.AuthorizationContext; - +import org.apache.solr.api.AnnotatedApi; +import org.apache.solr.handler.admin.api.NodeThreadsAPI; +import org.apache.solr.api.Api; /** * @since solr 1.2 */ @@ -179,12 +178,6 @@ public Category getCategory() { public Collection getApis() { return AnnotatedApi.getApis(new NodeThreadsAPI(this)); } - - @Override - public Boolean registerV2() { - return Boolean.TRUE; - } - @Override public Name getPermissionName(AuthorizationContext request) { return Name.METRICS_READ_PERM; diff --git a/solr/core/src/java/org/apache/solr/handler/admin/api/NodeThreadsAPI.java b/solr/core/src/java/org/apache/solr/handler/admin/api/NodeThreadsAPI.java index bea1827304cd..7047ca567955 100644 --- a/solr/core/src/java/org/apache/solr/handler/admin/api/NodeThreadsAPI.java +++ b/solr/core/src/java/org/apache/solr/handler/admin/api/NodeThreadsAPI.java @@ -14,7 +14,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package org.apache.solr.handler.admin.api; import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET; @@ -25,12 +24,8 @@ import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.response.SolrQueryResponse; -/** - * V2 API for triggering a thread dump on the receiving node. - * - *

This API (GET /v2/node/threads) is analogous to the v1 /admin/info/threads. - */ public class NodeThreadsAPI { + private final ThreadDumpHandler handler; public NodeThreadsAPI(ThreadDumpHandler handler) { @@ -41,7 +36,8 @@ public NodeThreadsAPI(ThreadDumpHandler handler) { path = {"/node/threads"}, method = GET, permission = METRICS_READ_PERM) - public void triggerThreadDump(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { + public void triggerThreadDump( + SolrQueryRequest req, SolrQueryResponse rsp) throws Exception { handler.handleRequestBody(req, rsp); } }