Fix handling of segment file sizes in stats API

This commit addresses an issue in the stats APIs where
include_segment_file_sizes was not being consumed leading to requests
containing this parameter being rejected.

Relates #21879
This commit is contained in:
Aaron Spiegel 2016-12-15 04:29:11 -08:00 committed by Jason Tedor
parent ef610636b6
commit 80d3d790ae
6 changed files with 268 additions and 6 deletions

View File

@ -34,7 +34,6 @@ import org.elasticsearch.rest.action.RestActions.NodesResponseRestListener;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -180,8 +179,8 @@ public class RestNodesStatsAction extends BaseRestHandler {
if (nodesStatsRequest.indices().isSet(Flag.Indexing) && (request.hasParam("types"))) { if (nodesStatsRequest.indices().isSet(Flag.Indexing) && (request.hasParam("types"))) {
nodesStatsRequest.indices().types(request.paramAsStringArray("types", null)); nodesStatsRequest.indices().types(request.paramAsStringArray("types", null));
} }
if (nodesStatsRequest.indices().isSet(Flag.Segments) && (request.hasParam("include_segment_file_sizes"))) { if (nodesStatsRequest.indices().isSet(Flag.Segments)) {
nodesStatsRequest.indices().includeSegmentFileSizes(true); nodesStatsRequest.indices().includeSegmentFileSizes(request.paramAsBoolean("include_segment_file_sizes", false));
} }
return channel -> client.admin().cluster().nodesStats(nodesStatsRequest, new NodesResponseRestListener<>(channel)); return channel -> client.admin().cluster().nodesStats(nodesStatsRequest, new NodesResponseRestListener<>(channel));

View File

@ -37,7 +37,6 @@ import org.elasticsearch.rest.action.RestBuilderListener;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -136,8 +135,8 @@ public class RestIndicesStatsAction extends BaseRestHandler {
request.paramAsStringArray("fielddata_fields", request.paramAsStringArray("fields", Strings.EMPTY_ARRAY))); request.paramAsStringArray("fielddata_fields", request.paramAsStringArray("fields", Strings.EMPTY_ARRAY)));
} }
if (indicesStatsRequest.segments() && request.hasParam("include_segment_file_sizes")) { if (indicesStatsRequest.segments()) {
indicesStatsRequest.includeSegmentFileSizes(true); indicesStatsRequest.includeSegmentFileSizes(request.paramAsBoolean("include_segment_file_sizes", false));
} }
return channel -> client.admin().indices().stats(indicesStatsRequest, new RestBuilderListener<IndicesStatsResponse>(channel) { return channel -> client.admin().indices().stats(indicesStatsRequest, new RestBuilderListener<IndicesStatsResponse>(channel) {

View File

@ -52,6 +52,11 @@
"types" : { "types" : {
"type" : "list", "type" : "list",
"description" : "A comma-separated list of document types for the `indexing` index metric" "description" : "A comma-separated list of document types for the `indexing` index metric"
},
"include_segment_file_sizes": {
"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
} }
} }
}, },

View File

@ -63,6 +63,11 @@
"timeout": { "timeout": {
"type" : "time", "type" : "time",
"description" : "Explicit operation timeout" "description" : "Explicit operation timeout"
},
"include_segment_file_sizes": {
"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
} }
} }
}, },

View File

@ -121,3 +121,46 @@ setup:
- is_false: _all.total.translog - is_false: _all.total.translog
- is_true: _all.total.recovery - is_true: _all.total.recovery
---
"Metric - _all include_segment_file_sizes":
- do:
indices.stats: { metric: _all, include_segment_file_sizes: 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
- is_true: _all.total.segments.file_sizes
---
"Metric - segments include_segment_file_sizes":
- do:
indices.stats: { metric: segments, include_segment_file_sizes: 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
- is_true: _all.total.segments.file_sizes

View File

@ -0,0 +1,211 @@
---
"Metric - blank":
- do:
cluster.state: {}
- set: { master_node: master }
- do:
nodes.stats: {}
- is_true: nodes.$master.indices.docs
- is_true: nodes.$master.indices.store
- is_true: nodes.$master.indices.indexing
- is_true: nodes.$master.indices.get
- is_true: nodes.$master.indices.search
- is_true: nodes.$master.indices.merges
- is_true: nodes.$master.indices.refresh
- is_true: nodes.$master.indices.flush
- is_true: nodes.$master.indices.warmer
- is_true: nodes.$master.indices.query_cache
- is_true: nodes.$master.indices.fielddata
- is_true: nodes.$master.indices.completion
- is_true: nodes.$master.indices.segments
- is_true: nodes.$master.indices.translog
- is_true: nodes.$master.indices.recovery
---
"Metric - _all":
- do:
cluster.state: {}
- set: { master_node: master }
- do:
nodes.stats: { metric: _all }
- is_true: nodes.$master.indices.docs
- is_true: nodes.$master.indices.store
- is_true: nodes.$master.indices.indexing
- is_true: nodes.$master.indices.get
- is_true: nodes.$master.indices.search
- is_true: nodes.$master.indices.merges
- is_true: nodes.$master.indices.refresh
- is_true: nodes.$master.indices.flush
- is_true: nodes.$master.indices.warmer
- is_true: nodes.$master.indices.query_cache
- is_true: nodes.$master.indices.fielddata
- is_true: nodes.$master.indices.completion
- is_true: nodes.$master.indices.segments
- is_true: nodes.$master.indices.translog
- is_true: nodes.$master.indices.recovery
---
"Metric - indices _all":
- do:
cluster.state: {}
- set: { master_node: master }
- do:
nodes.stats: { metric: indices, index_metric: _all }
- is_true: nodes.$master.indices.docs
- is_true: nodes.$master.indices.store
- is_true: nodes.$master.indices.indexing
- is_true: nodes.$master.indices.get
- is_true: nodes.$master.indices.search
- is_true: nodes.$master.indices.merges
- is_true: nodes.$master.indices.refresh
- is_true: nodes.$master.indices.flush
- is_true: nodes.$master.indices.warmer
- is_true: nodes.$master.indices.query_cache
- is_true: nodes.$master.indices.fielddata
- is_true: nodes.$master.indices.completion
- is_true: nodes.$master.indices.segments
- is_true: nodes.$master.indices.translog
- is_true: nodes.$master.indices.recovery
---
"Metric - one":
- do:
cluster.state: {}
- set: { master_node: master }
- do:
nodes.stats: { metric: indices, index_metric: docs }
- is_true: nodes.$master.indices.docs
- is_false: nodes.$master.indices.store
- is_false: nodes.$master.indices.indexing
- is_false: nodes.$master.indices.get
- is_false: nodes.$master.indices.search
- is_false: nodes.$master.indices.merges
- is_false: nodes.$master.indices.refresh
- is_false: nodes.$master.indices.flush
- is_false: nodes.$master.indices.warmer
- is_false: nodes.$master.indices.query_cache
- is_false: nodes.$master.indices.fielddata
- is_false: nodes.$master.indices.completion
- is_false: nodes.$master.indices.segments
- is_false: nodes.$master.indices.translog
- is_false: nodes.$master.indices.recovery
---
"Metric - multi":
- do:
cluster.state: {}
- set: { master_node: master }
- do:
nodes.stats: { metric: indices, index_metric: [ store, get, merge ] }
- is_false: nodes.$master.indices.docs
- is_true: nodes.$master.indices.store
- is_false: nodes.$master.indices.indexing
- is_true: nodes.$master.indices.get
- is_false: nodes.$master.indices.search
- is_true: nodes.$master.indices.merges
- is_false: nodes.$master.indices.refresh
- is_false: nodes.$master.indices.flush
- is_false: nodes.$master.indices.warmer
- is_false: nodes.$master.indices.query_cache
- is_false: nodes.$master.indices.fielddata
- is_false: nodes.$master.indices.completion
- is_false: nodes.$master.indices.segments
- is_false: nodes.$master.indices.translog
- is_false: nodes.$master.indices.recovery
---
"Metric - recovery":
- do:
cluster.state: {}
- set: { master_node: master }
- do:
nodes.stats: { metric: indices, index_metric: [ recovery ] }
- is_false: nodes.$master.indices.docs
- is_false: nodes.$master.indices.store
- is_false: nodes.$master.indices.indexing
- is_false: nodes.$master.indices.get
- is_false: nodes.$master.indices.search
- is_false: nodes.$master.indices.merges
- is_false: nodes.$master.indices.refresh
- is_false: nodes.$master.indices.flush
- is_false: nodes.$master.indices.warmer
- is_false: nodes.$master.indices.query_cache
- is_false: nodes.$master.indices.fielddata
- is_false: nodes.$master.indices.completion
- is_false: nodes.$master.indices.segments
- is_false: nodes.$master.indices.translog
- is_true: nodes.$master.indices.recovery
---
"Metric - _all include_segment_file_sizes":
- do:
cluster.state: {}
- set: { master_node: master }
- do:
nodes.stats: { metric: indices, index_metric: _all, include_segment_file_sizes: true }
- is_true: nodes.$master.indices.docs
- is_true: nodes.$master.indices.store
- is_true: nodes.$master.indices.indexing
- is_true: nodes.$master.indices.get
- is_true: nodes.$master.indices.search
- is_true: nodes.$master.indices.merges
- is_true: nodes.$master.indices.refresh
- is_true: nodes.$master.indices.flush
- is_true: nodes.$master.indices.warmer
- is_true: nodes.$master.indices.query_cache
- is_true: nodes.$master.indices.fielddata
- is_true: nodes.$master.indices.completion
- is_true: nodes.$master.indices.segments
- is_true: nodes.$master.indices.translog
- is_true: nodes.$master.indices.recovery
- is_true: nodes.$master.indices.segments.file_sizes
---
"Metric - segments include_segment_file_sizes":
- do:
cluster.state: {}
- set: { master_node: master }
- do:
nodes.stats: { metric: indices, index_metric: segments, include_segment_file_sizes: true }
- is_false: nodes.$master.indices.docs
- is_false: nodes.$master.indices.store
- is_false: nodes.$master.indices.indexing
- is_false: nodes.$master.indices.get
- is_false: nodes.$master.indices.search
- is_false: nodes.$master.indices.merges
- is_false: nodes.$master.indices.refresh
- is_false: nodes.$master.indices.flush
- is_false: nodes.$master.indices.warmer
- is_false: nodes.$master.indices.query_cache
- is_false: nodes.$master.indices.fielddata
- is_false: nodes.$master.indices.completion
- is_true: nodes.$master.indices.segments
- is_false: nodes.$master.indices.translog
- is_false: nodes.$master.indices.recovery
- is_true: nodes.$master.indices.segments.file_sizes