Browse Source

Simplify usage of nodes info API

Important: This breaks backwards compatibility with 0.90

* Removed endpoints: /_cluster/nodes, /_cluster/nodes/nodeId1,nodeId2
* Disallow usage of parameters, but make required metrics part of URI
* Changed NodesInfoRequest to return everything by default
* Fixed NPE in NodesInfoResponse

Closes #4055
Alexander Reelsen 11 years ago
parent
commit
ad50afbec8

+ 9 - 13
docs/reference/cluster/nodes-info.asciidoc

@@ -6,10 +6,6 @@ the cluster nodes information.
 
 [source,js]
 --------------------------------------------------
-curl -XGET 'http://localhost:9200/_cluster/nodes'
-curl -XGET 'http://localhost:9200/_cluster/nodes/nodeId1,nodeId2'
-
-# Shorter Format
 curl -XGET 'http://localhost:9200/_nodes'
 curl -XGET 'http://localhost:9200/_nodes/nodeId1,nodeId2'
 --------------------------------------------------
@@ -19,22 +15,22 @@ The second command selectively retrieves nodes information of only
 `nodeId1` and `nodeId2`. All the nodes selective options are explained
 <<cluster-nodes,here>>.
 
-By default, it just returns the attributes and core settings for a node.
-It also allows to get information on `settings`, `os`, `process`, `jvm`,
+By default, it just returns all attributes and core settings for a node.
+It also allows to get only information on `settings`, `os`, `process`, `jvm`,
 `thread_pool`, `network`, `transport`, `http` and `plugin`:
 
 [source,js]
 --------------------------------------------------
-curl -XGET 'http://localhost:9200/_nodes?os=true&process=true'
-curl -XGET 'http://localhost:9200/_nodes/10.0.0.1/?os=true&process=true'
-
-# Or, specific type endpoint:
-
 curl -XGET 'http://localhost:9200/_nodes/process'
-curl -XGET 'http://localhost:9200/_nodes/10.0.0.1/process'
+curl -XGET 'http://localhost:9200/_nodes/_all/process'
+curl -XGET 'http://localhost:9200/_nodes/nodeId1,nodeId2/jvm,process'
+# same as above
+curl -XGET 'http://localhost:9200/_nodes/nodeId1,nodeId2/info/jvm,process'
+
+curl -XGET 'http://localhost:9200/_nodes/nodeId1,nodeId2/_all
 --------------------------------------------------
 
-The `all` flag can be set to return all the information.
+The `all` flag can be set to return all the information - or you can simply omit it.
 
 `plugin` - if set, the result will contain details about the loaded
 plugins per node:

+ 2 - 52
rest-api-spec/api/cluster.node_info.json

@@ -3,63 +3,13 @@
     "documentation": "http://elasticsearch.org/guide/reference/api/admin-cluster-nodes-info/",
     "methods": ["GET"],
     "url": {
-      "path": "/_cluster/nodes",
-      "paths": ["/_cluster/nodes", "/_cluster/nodes/{node_id}", "/_nodes", "/_nodes/{node_id}", "/_nodes/settings", "/_nodes/{node_id}/settings", "/_nodes/os", "/_nodes/{node_id}/os", "/_nodes/process", "/_nodes/{node_id}/process", "/_nodes/jvm", "/_nodes/{node_id}/jvm", "/_nodes/thread_pool", "/_nodes/{node_id}/thread_pool", "/_nodes/network", "/_nodes/{node_id}/network", "/_nodes/transport", "/_nodes/{node_id}/transport", "/_nodes/http", "/_nodes/{node_id}/http", "/_nodes/plugin", "/_nodes/{node_id}/plugin"],
+      "path": "/_nodes",
+      "paths": ["/_nodes", "/_nodes/{node_id}", "/_nodes/settings", "/_nodes/{node_id}/settings", "/_nodes/os", "/_nodes/{node_id}/os", "/_nodes/process", "/_nodes/{node_id}/process", "/_nodes/jvm", "/_nodes/{node_id}/jvm", "/_nodes/thread_pool", "/_nodes/{node_id}/thread_pool", "/_nodes/network", "/_nodes/{node_id}/network", "/_nodes/transport", "/_nodes/{node_id}/transport", "/_nodes/http", "/_nodes/{node_id}/http", "/_nodes/plugin", "/_nodes/{node_id}/plugin"],
       "parts": {
         "node_id": {
           "type" : "list",
           "description" : "A comma-separated list of node IDs or names to limit the returned information; use `_local` to return information from the node you're connecting to, leave empty to get information from all nodes"
         }
-      },
-      "params": {
-        "all": {
-          "type" : "boolean",
-          "description" : "Return all available information"
-        },
-        "clear": {
-          "type" : "boolean",
-          "description" : "Reset the default settings"
-        },
-        "http": {
-          "type" : "boolean",
-          "description" : "Return information about HTTP"
-        },
-        "jvm": {
-          "type" : "boolean",
-          "description" : "Return information about the JVM"
-        },
-        "network": {
-          "type" : "boolean",
-          "description" : "Return information about network"
-        },
-        "os": {
-          "type" : "boolean",
-          "description" : "Return information about the operating system"
-        },
-        "plugin": {
-          "type" : "boolean",
-          "description" : "Return information about plugins"
-        },
-        "process": {
-          "type" : "boolean",
-          "description" : "Return information about the Elasticsearch process"
-        },
-        "settings": {
-          "type" : "boolean",
-          "description" : "Return information about node settings"
-        },
-        "thread_pool": {
-          "type" : "boolean",
-          "description" : "Return information about the thread pool"
-        },
-        "timeout": {
-          "type" : "time",
-          "description" : "Explicit operation timeout"
-        },
-        "transport": {
-          "type" : "boolean",
-          "description" : "Return information about transport"
-        }
       }
     },
     "body": null

+ 1 - 47
rest-api-spec/api/cluster.node_stats.json

@@ -3,10 +3,8 @@
     "documentation": "http://elasticsearch.org/guide/reference/api/admin-cluster-nodes-stats/",
     "methods": ["GET"],
     "url": {
-      "path": "/_cluster/nodes/stats",
+      "path": "/_nodes/stats",
       "paths": [
-        "/_cluster/nodes/stats",
-        "/_cluster/nodes/{node_id}/stats",
         "/_nodes/stats",
         "/_nodes/{node_id}/stats",
         "/_nodes/stats/{metric_family}",
@@ -35,53 +33,9 @@
         }
       },
       "params": {
-        "all": {
-          "type" : "boolean",
-          "description" : "Return all available information"
-        },
-        "clear": {
-          "type" : "boolean",
-          "description" : "Reset the default level of detail"
-        },
         "fields": {
           "type" : "list",
           "description" : "A comma-separated list of fields for `fielddata` metric (supports wildcards)"
-        },
-        "fs": {
-          "type" : "boolean",
-          "description" : "Return information about the filesystem"
-        },
-        "http": {
-          "type" : "boolean",
-          "description" : "Return information about HTTP"
-        },
-        "indices": {
-          "type" : "boolean",
-          "description" : "Return information about indices"
-        },
-        "jvm": {
-          "type" : "boolean",
-          "description" : "Return information about the JVM"
-        },
-        "network": {
-          "type" : "boolean",
-          "description" : "Return information about network"
-        },
-        "os": {
-          "type" : "boolean",
-          "description" : "Return information about the operating system"
-        },
-        "process": {
-          "type" : "boolean",
-          "description" : "Return information about the Elasticsearch process"
-        },
-        "thread_pool": {
-          "type" : "boolean",
-          "description" : "Return information about the thread pool"
-        },
-        "transport": {
-          "type" : "boolean",
-          "description" : "Return information about transport"
         }
       }
     },

+ 9 - 9
src/main/java/org/elasticsearch/action/admin/cluster/node/info/NodesInfoRequest.java

@@ -30,15 +30,15 @@ import java.io.IOException;
  */
 public class NodesInfoRequest extends NodesOperationRequest<NodesInfoRequest> {
 
-    private boolean settings = false;
-    private boolean os = false;
-    private boolean process = false;
-    private boolean jvm = false;
-    private boolean threadPool = false;
-    private boolean network = false;
-    private boolean transport = false;
-    private boolean http = false;
-    private boolean plugin = false;
+    private boolean settings = true;
+    private boolean os = true;
+    private boolean process = true;
+    private boolean jvm = true;
+    private boolean threadPool = true;
+    private boolean network = true;
+    private boolean transport = true;
+    private boolean http = true;
+    private boolean plugin = true;
 
     public NodesInfoRequest() {
     }

+ 1 - 1
src/main/java/org/elasticsearch/action/admin/cluster/node/info/NodesInfoResponse.java

@@ -104,7 +104,7 @@ public class NodesInfoResponse extends NodesOperationResponse<NodeInfo> implemen
 
             if (nodeInfo.getSettings() != null) {
                 builder.startObject("settings");
-                Settings settings = settingsFilter.filterSettings(nodeInfo.getSettings());
+                Settings settings = settingsFilter != null ? settingsFilter.filterSettings(nodeInfo.getSettings()) : nodeInfo.getSettings();
                 for (Map.Entry<String, String> entry : settings.getAsMap().entrySet()) {
                     builder.field(entry.getKey(), entry.getValue(), XContentBuilder.FieldCaseConversion.NONE);
                 }

+ 35 - 135
src/main/java/org/elasticsearch/rest/action/admin/cluster/node/info/RestNodesInfoAction.java

@@ -32,6 +32,9 @@ import org.elasticsearch.rest.*;
 import org.elasticsearch.rest.action.support.RestXContentBuilder;
 
 import java.io.IOException;
+import java.util.Set;
+
+import static org.elasticsearch.rest.RestRequest.Method.GET;
 
 
 /**
@@ -45,70 +48,48 @@ public class RestNodesInfoAction extends BaseRestHandler {
     public RestNodesInfoAction(Settings settings, Client client, RestController controller,
                                SettingsFilter settingsFilter) {
         super(settings, client);
-        controller.registerHandler(RestRequest.Method.GET, "/_cluster/nodes", this);
-        controller.registerHandler(RestRequest.Method.GET, "/_cluster/nodes/{nodeId}", this);
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes", this);
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}", this);
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/settings", new RestSettingsHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/settings", new RestSettingsHandler());
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/os", new RestOsHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/os", new RestOsHandler());
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/process", new RestProcessHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/process", new RestProcessHandler());
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/jvm", new RestJvmHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/jvm", new RestJvmHandler());
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/thread_pool", new RestThreadPoolHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/thread_pool", new RestThreadPoolHandler());
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/network", new RestNetworkHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/network", new RestNetworkHandler());
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/transport", new RestTransportHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/transport", new RestTransportHandler());
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/http", new RestHttpHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/http", new RestHttpHandler());
-
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/plugin", new RestPluginHandler());
-        controller.registerHandler(RestRequest.Method.GET, "/_nodes/{nodeId}/plugin", new RestPluginHandler());
+        controller.registerHandler(GET, "/_nodes", this);
+        // this endpoint is used for metrics, not for nodeIds, like /_nodes/fs
+        controller.registerHandler(GET, "/_nodes/{nodeId}", this);
+        controller.registerHandler(GET, "/_nodes/{nodeId}/{metrics}", this);
+        // added this endpoint to be aligned with stats
+        controller.registerHandler(GET, "/_nodes/{nodeId}/info/{metrics}", this);
 
         this.settingsFilter = settingsFilter;
     }
 
     @Override
     public void handleRequest(final RestRequest request, final RestChannel channel) {
-        String[] nodesIds = Strings.splitStringByCommaToArray(request.param("nodeId"));
-        final NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(nodesIds);
-
-        boolean clear = request.paramAsBoolean("clear", false);
-        if (clear) {
-            nodesInfoRequest.clear();
+        String[] nodeIds;
+        Set<String> metrics;
+        // special case like /_nodes/fs (in this case fs are metrics and not the nodeId)
+        if (request.hasParam("nodeId") && !request.hasParam("metrics")) {
+            nodeIds = new String[] { "_all" };
+            metrics = Strings.splitStringByCommaToSet(request.param("nodeId", "_all"));
+        } else {
+            nodeIds = Strings.splitStringByCommaToArray(request.param("nodeId", "_all"));
+            metrics = Strings.splitStringByCommaToSet(request.param("metrics", "_all"));
         }
-        boolean all = request.paramAsBoolean("all", false);
-        if (all) {
+
+        final NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(nodeIds);
+        nodesInfoRequest.listenerThreaded(false);
+
+        // shortcut, dont do checks if only all is specified
+        if (metrics.size() == 1 && metrics.contains("_all")) {
             nodesInfoRequest.all();
+        } else {
+            nodesInfoRequest.clear();
+            nodesInfoRequest.settings(metrics.contains("settings"));
+            nodesInfoRequest.os(metrics.contains("os"));
+            nodesInfoRequest.process(metrics.contains("process"));
+            nodesInfoRequest.jvm(metrics.contains("jvm"));
+            nodesInfoRequest.threadPool(metrics.contains("thread_pool"));
+            nodesInfoRequest.network(metrics.contains("network"));
+            nodesInfoRequest.transport(metrics.contains("transport"));
+            nodesInfoRequest.http(metrics.contains("http"));
+            nodesInfoRequest.plugin(metrics.contains("plugin"));
         }
-        nodesInfoRequest.settings(request.paramAsBoolean("settings", nodesInfoRequest.settings()));
-        nodesInfoRequest.os(request.paramAsBoolean("os", nodesInfoRequest.os()));
-        nodesInfoRequest.process(request.paramAsBoolean("process", nodesInfoRequest.process()));
-        nodesInfoRequest.jvm(request.paramAsBoolean("jvm", nodesInfoRequest.jvm()));
-        nodesInfoRequest.threadPool(request.paramAsBoolean("thread_pool", nodesInfoRequest.threadPool()));
-        nodesInfoRequest.network(request.paramAsBoolean("network", nodesInfoRequest.network()));
-        nodesInfoRequest.transport(request.paramAsBoolean("transport", nodesInfoRequest.transport()));
-        nodesInfoRequest.http(request.paramAsBoolean("http", nodesInfoRequest.http()));
-        nodesInfoRequest.plugin(request.paramAsBoolean("plugin", nodesInfoRequest.plugin()));
-        nodesInfoRequest.timeout( request.paramAsTime("timeout", nodesInfoRequest.timeout()));
-
-        executeNodeRequest(request, channel, nodesInfoRequest);
-    }
 
-    void executeNodeRequest(final RestRequest request, final RestChannel channel, NodesInfoRequest nodesInfoRequest) {
-        nodesInfoRequest.listenerThreaded(false);
         client.admin().cluster().nodesInfo(nodesInfoRequest, new ActionListener<NodesInfoResponse>() {
             @Override
             public void onResponse(NodesInfoResponse response) {
@@ -134,85 +115,4 @@ public class RestNodesInfoAction extends BaseRestHandler {
             }
         });
     }
-
-    class RestSettingsHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().settings(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
-
-    class RestOsHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().os(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
-
-    class RestProcessHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().process(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
-
-    class RestJvmHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().jvm(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
-
-    class RestThreadPoolHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().threadPool(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
-
-    class RestNetworkHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().network(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
-
-    class RestTransportHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().transport(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
-
-    class RestHttpHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().http(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
-
-    class RestPluginHandler implements RestHandler {
-        @Override
-        public void handleRequest(final RestRequest request, final RestChannel channel) {
-            NodesInfoRequest nodesInfoRequest = new NodesInfoRequest(Strings.splitStringByCommaToArray(request.param("nodeId")));
-            nodesInfoRequest.clear().plugin(true);
-            executeNodeRequest(request, channel, nodesInfoRequest);
-        }
-    }
 }

+ 1 - 1
src/test/java/org/elasticsearch/nodesinfo/SimpleNodesInfoTests.java

@@ -129,7 +129,7 @@ public class SimpleNodesInfoTests extends ElasticsearchIntegrationTest {
         ClusterHealthResponse clusterHealth = client().admin().cluster().health(clusterHealthRequest().waitForGreenStatus()).actionGet();
         logger.info("--> done cluster_health, status " + clusterHealth.getStatus());
 
-        NodesInfoResponse response = client().admin().cluster().prepareNodesInfo().setPlugin(true).execute().actionGet();
+        NodesInfoResponse response = client().admin().cluster().prepareNodesInfo().execute().actionGet();
         logger.info("--> full json answer, status " + response.toString());
 
         assertNodeContainsPlugins(response, server1NodeId, Collections.EMPTY_LIST, Collections.EMPTY_LIST,