瀏覽代碼

Support include_unloaded_segments in node stats (#69682)

Adds support for the include_unloaded_segments flag in node stats, which helps with understanding resource usage of
shared_cache-style searchable snapshots on a per-node basis.
Yannick Welsch 4 年之前
父節點
當前提交
529c6227fe

+ 2 - 1
docs/reference/cat/nodes.asciidoc

@@ -60,7 +60,7 @@ Valid columns are:
 `s` (content node),
 `t` ({transform} node),
 `v` (voting-only node),
-`w` (warm node), and 
+`w` (warm node), and
 `-` (coordinating node only).
 +
 For example, `dim` indicates a master-eligible data and ingest node. See
@@ -316,6 +316,7 @@ include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=time]
 
 include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=cat-v]
 
+include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=include-unloaded-segments]
 
 [[cat-nodes-api-example]]
 ==== {api-examples-title}

+ 2 - 0
docs/reference/cluster/nodes-stats.asciidoc

@@ -141,6 +141,8 @@ include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=timeoutparms]
 
 include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=include-segment-file-sizes]
 
+include::{es-repo-dir}/rest-api/common-parms.asciidoc[tag=include-unloaded-segments]
+
 [role="child_attributes"]
 [[cluster-nodes-stats-api-response-body]]
 ==== {api-response-body-title}

+ 5 - 0
rest-api-spec/src/main/resources/rest-api-spec/api/cat.nodes.json

@@ -79,6 +79,11 @@
         "type":"boolean",
         "description":"Verbose mode. Display column headers",
         "default":false
+      },
+      "include_unloaded_segments":{
+        "type":"boolean",
+        "description":"If set to true segment stats will include stats for segments that are not currently loaded into memory",
+        "default":false
       }
     }
   }

+ 5 - 0
rest-api-spec/src/main/resources/rest-api-spec/api/nodes.stats.json

@@ -226,6 +226,11 @@
         "type":"boolean",
         "description":"Whether to report the aggregated disk usage of each one of the Lucene index files (only applies if segment stats are requested)",
         "default":false
+      },
+      "include_unloaded_segments":{
+        "type":"boolean",
+        "description":"If set to true segment stats will include stats for segments that are not currently loaded into memory",
+        "default":false
       }
     }
   }

+ 42 - 0
rest-api-spec/src/main/resources/rest-api-spec/test/indices.stats/11_metric.yml

@@ -162,3 +162,45 @@ setup:
   - is_false:  _all.total.translog
   - is_false:  _all.total.recovery
   - is_true:   _all.total.segments.file_sizes
+
+---
+"Metric - _all include_unloaded_segments":
+  - do:
+      indices.stats: { metric: _all, include_unloaded_segments: true }
+
+  - is_true:   _all.total.docs
+  - is_true:   _all.total.store
+  - is_true:   _all.total.indexing
+  - is_true:   _all.total.get
+  - is_true:   _all.total.search
+  - is_true:   _all.total.merges
+  - is_true:   _all.total.refresh
+  - is_true:   _all.total.flush
+  - is_true:   _all.total.warmer
+  - is_true:   _all.total.query_cache
+  - is_true:   _all.total.fielddata
+  - is_true:   _all.total.completion
+  - is_true:   _all.total.segments
+  - is_true:   _all.total.translog
+  - is_true:   _all.total.recovery
+
+---
+"Metric - segments include_unloaded_segments":
+  - do:
+      indices.stats: { metric: segments, include_unloaded_segments: true }
+
+  - is_false:  _all.total.docs
+  - is_false:  _all.total.store
+  - is_false:  _all.total.indexing
+  - is_false:  _all.total.get
+  - is_false:  _all.total.search
+  - is_false:  _all.total.merges
+  - is_false:  _all.total.refresh
+  - is_false:  _all.total.flush
+  - is_false:  _all.total.warmer
+  - is_false:  _all.total.query_cache
+  - is_false:  _all.total.fielddata
+  - is_false:  _all.total.completion
+  - is_true:   _all.total.segments
+  - is_false:  _all.total.translog
+  - is_false:  _all.total.recovery

+ 59 - 0
rest-api-spec/src/main/resources/rest-api-spec/test/nodes.stats/11_indices_metrics.yml

@@ -225,3 +225,62 @@
   - is_false:  nodes.$node_id.indices.recovery
   - is_true:   nodes.$node_id.indices.segments.file_sizes
 
+---
+"Metric - _all include_unloaded_segments":
+  - skip:
+      features: [arbitrary_key]
+      version: " - 7.99.99"
+      reason: waiting for backport
+  - do:
+      nodes.info: {}
+  - set:
+      nodes._arbitrary_key_: node_id
+
+  - do:
+      nodes.stats: { metric: indices, index_metric: _all, include_unloaded_segments: true }
+
+  - is_true:   nodes.$node_id.indices.docs
+  - is_true:   nodes.$node_id.indices.store
+  - is_true:   nodes.$node_id.indices.indexing
+  - is_true:   nodes.$node_id.indices.get
+  - is_true:   nodes.$node_id.indices.search
+  - is_true:   nodes.$node_id.indices.merges
+  - is_true:   nodes.$node_id.indices.refresh
+  - is_true:   nodes.$node_id.indices.flush
+  - is_true:   nodes.$node_id.indices.warmer
+  - is_true:   nodes.$node_id.indices.query_cache
+  - is_true:   nodes.$node_id.indices.fielddata
+  - is_true:   nodes.$node_id.indices.completion
+  - is_true:   nodes.$node_id.indices.segments
+  - is_true:   nodes.$node_id.indices.translog
+  - is_true:   nodes.$node_id.indices.recovery
+
+---
+"Metric - segments include_unloaded_segments":
+  - skip:
+      features: [arbitrary_key]
+      version: " - 7.99.99"
+      reason: waiting for backport
+  - do:
+      nodes.info: {}
+  - set:
+      nodes._arbitrary_key_: node_id
+
+  - do:
+      nodes.stats: { metric: indices, index_metric: segments, include_unloaded_segments: true }
+
+  - is_false:  nodes.$node_id.indices.docs
+  - is_false:  nodes.$node_id.indices.store
+  - is_false:  nodes.$node_id.indices.indexing
+  - is_false:  nodes.$node_id.indices.get
+  - is_false:  nodes.$node_id.indices.search
+  - is_false:  nodes.$node_id.indices.merges
+  - is_false:  nodes.$node_id.indices.refresh
+  - is_false:  nodes.$node_id.indices.flush
+  - is_false:  nodes.$node_id.indices.warmer
+  - is_false:  nodes.$node_id.indices.query_cache
+  - is_false:  nodes.$node_id.indices.fielddata
+  - is_false:  nodes.$node_id.indices.completion
+  - is_true:   nodes.$node_id.indices.segments
+  - is_false:  nodes.$node_id.indices.translog
+  - is_false:  nodes.$node_id.indices.recovery

+ 1 - 0
server/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestNodesStatsAction.java

@@ -159,6 +159,7 @@ public class RestNodesStatsAction extends BaseRestHandler {
         }
         if (nodesStatsRequest.indices().isSet(Flag.Segments)) {
             nodesStatsRequest.indices().includeSegmentFileSizes(request.paramAsBoolean("include_segment_file_sizes", false));
+            nodesStatsRequest.indices().includeUnloadedSegments(request.paramAsBoolean("include_unloaded_segments", false));
         }
 
         return channel -> client.admin().cluster().nodesStats(nodesStatsRequest, new NodesResponseRestListener<>(channel));

+ 2 - 0
server/src/main/java/org/elasticsearch/rest/action/cat/RestNodesAction.java

@@ -80,6 +80,7 @@ public class RestNodesAction extends AbstractCatAction {
         clusterStateRequest.clear().nodes(true);
         clusterStateRequest.masterNodeTimeout(request.paramAsTime("master_timeout", clusterStateRequest.masterNodeTimeout()));
         final boolean fullId = request.paramAsBoolean("full_id", false);
+        final boolean includeUnloadedSegments = request.paramAsBoolean("include_unloaded_segments", false);
         return channel -> client.admin().cluster().state(clusterStateRequest, new RestActionListener<ClusterStateResponse>(channel) {
             @Override
             public void processResponse(final ClusterStateResponse clusterStateResponse) {
@@ -100,6 +101,7 @@ public class RestNodesAction extends AbstractCatAction {
                             NodesStatsRequest.Metric.PROCESS.metricName(),
                             NodesStatsRequest.Metric.SCRIPT.metricName()
                         );
+                        nodesStatsRequest.indices().includeUnloadedSegments(includeUnloadedSegments);
                         client.admin().cluster().nodesStats(nodesStatsRequest, new RestResponseListener<NodesStatsResponse>(channel) {
                             @Override
                             public RestResponse buildResponse(NodesStatsResponse nodesStatsResponse) throws Exception {