parent
e1b6988886
commit
c95c7096e5
|
@ -28,6 +28,7 @@ import org.elasticsearch.common.xcontent.ToXContent;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.index.cache.filter.FilterCacheStats;
|
import org.elasticsearch.index.cache.filter.FilterCacheStats;
|
||||||
import org.elasticsearch.index.cache.id.IdCacheStats;
|
import org.elasticsearch.index.cache.id.IdCacheStats;
|
||||||
|
import org.elasticsearch.index.engine.SegmentsStats;
|
||||||
import org.elasticsearch.index.fielddata.FieldDataStats;
|
import org.elasticsearch.index.fielddata.FieldDataStats;
|
||||||
import org.elasticsearch.index.flush.FlushStats;
|
import org.elasticsearch.index.flush.FlushStats;
|
||||||
import org.elasticsearch.index.get.GetStats;
|
import org.elasticsearch.index.get.GetStats;
|
||||||
|
@ -96,6 +97,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
case Completion:
|
case Completion:
|
||||||
completion = new CompletionStats();
|
completion = new CompletionStats();
|
||||||
break;
|
break;
|
||||||
|
case Segments:
|
||||||
|
segments = new SegmentsStats();
|
||||||
|
break;
|
||||||
case Percolate:
|
case Percolate:
|
||||||
percolate = new PercolateStats();
|
percolate = new PercolateStats();
|
||||||
break;
|
break;
|
||||||
|
@ -150,6 +154,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
case Completion:
|
case Completion:
|
||||||
completion = indexShard.completionStats(flags.completionDataFields());
|
completion = indexShard.completionStats(flags.completionDataFields());
|
||||||
break;
|
break;
|
||||||
|
case Segments:
|
||||||
|
segments = indexShard.segmentStats();
|
||||||
|
break;
|
||||||
case Percolate:
|
case Percolate:
|
||||||
percolate = indexShard.shardPercolateService().stats();
|
percolate = indexShard.shardPercolateService().stats();
|
||||||
break;
|
break;
|
||||||
|
@ -201,6 +208,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
@Nullable
|
@Nullable
|
||||||
public CompletionStats completion;
|
public CompletionStats completion;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public SegmentsStats segments;
|
||||||
|
|
||||||
public void add(CommonStats stats) {
|
public void add(CommonStats stats) {
|
||||||
if (docs == null) {
|
if (docs == null) {
|
||||||
if (stats.getDocs() != null) {
|
if (stats.getDocs() != null) {
|
||||||
|
@ -316,6 +326,14 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
} else {
|
} else {
|
||||||
completion.add(stats.getCompletion());
|
completion.add(stats.getCompletion());
|
||||||
}
|
}
|
||||||
|
if (segments == null) {
|
||||||
|
if (stats.getSegments() != null) {
|
||||||
|
segments = new SegmentsStats();
|
||||||
|
segments.add(stats.getSegments());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
segments.add(stats.getSegments());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@ -388,6 +406,11 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
return completion;
|
return completion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public SegmentsStats getSegments() {
|
||||||
|
return segments;
|
||||||
|
}
|
||||||
|
|
||||||
public static CommonStats readCommonStats(StreamInput in) throws IOException {
|
public static CommonStats readCommonStats(StreamInput in) throws IOException {
|
||||||
CommonStats stats = new CommonStats();
|
CommonStats stats = new CommonStats();
|
||||||
stats.readFrom(in);
|
stats.readFrom(in);
|
||||||
|
@ -440,6 +463,11 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
completion = CompletionStats.readCompletionStats(in);
|
completion = CompletionStats.readCompletionStats(in);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (in.getVersion().after(Version.V_0_90_6)) {
|
||||||
|
if (in.readBoolean()) {
|
||||||
|
segments = SegmentsStats.readSegmentsStats(in);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -530,6 +558,14 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
completion.writeTo(out);
|
completion.writeTo(out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (out.getVersion().after(Version.V_0_90_6)) {
|
||||||
|
if (segments == null) {
|
||||||
|
out.writeBoolean(false);
|
||||||
|
} else {
|
||||||
|
out.writeBoolean(true);
|
||||||
|
segments.writeTo(out);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// note, requires a wrapping object
|
// note, requires a wrapping object
|
||||||
|
@ -577,6 +613,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
if (completion != null) {
|
if (completion != null) {
|
||||||
completion.toXContent(builder, params);
|
completion.toXContent(builder, params);
|
||||||
}
|
}
|
||||||
|
if (segments != null) {
|
||||||
|
segments.toXContent(builder, params);
|
||||||
|
}
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -211,7 +211,8 @@ public class CommonStatsFlags implements Streamable, Cloneable {
|
||||||
Docs("docs"),
|
Docs("docs"),
|
||||||
Warmer("warmer"),
|
Warmer("warmer"),
|
||||||
Percolate("percolate"),
|
Percolate("percolate"),
|
||||||
Completion("completion");
|
Completion("completion"),
|
||||||
|
Segments("segments");
|
||||||
|
|
||||||
private final String restName;
|
private final String restName;
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,15 @@ public class IndicesStatsRequest extends BroadcastOperationRequest<IndicesStatsR
|
||||||
return flags.isSet(Flag.Percolate);
|
return flags.isSet(Flag.Percolate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IndicesStatsRequest segments(boolean segments) {
|
||||||
|
flags.set(Flag.Segments, segments);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean segments() {
|
||||||
|
return flags.isSet(Flag.Segments);
|
||||||
|
}
|
||||||
|
|
||||||
public IndicesStatsRequest fieldDataFields(String... fieldDataFields) {
|
public IndicesStatsRequest fieldDataFields(String... fieldDataFields) {
|
||||||
flags.fieldDataFields(fieldDataFields);
|
flags.fieldDataFields(fieldDataFields);
|
||||||
return this;
|
return this;
|
||||||
|
@ -221,7 +230,7 @@ public class IndicesStatsRequest extends BroadcastOperationRequest<IndicesStatsR
|
||||||
return flags.isSet(Flag.Completion);
|
return flags.isSet(Flag.Completion);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IndicesStatsRequest completionFields(String ... completionDataFields) {
|
public IndicesStatsRequest completionFields(String... completionDataFields) {
|
||||||
flags.completionDataFields(completionDataFields);
|
flags.completionDataFields(completionDataFields);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,11 @@ public class IndicesStatsRequestBuilder extends BroadcastOperationRequestBuilder
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IndicesStatsRequestBuilder setSegments(boolean segments) {
|
||||||
|
request.segments(segments);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public IndicesStatsRequestBuilder setCompletion(boolean completion) {
|
public IndicesStatsRequestBuilder setCompletion(boolean completion) {
|
||||||
request.completion(completion);
|
request.completion(completion);
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -183,6 +183,9 @@ public class TransportIndicesStatsAction extends TransportBroadcastOperationActi
|
||||||
if (request.request.percolate()) {
|
if (request.request.percolate()) {
|
||||||
flags.set(CommonStatsFlags.Flag.Percolate);
|
flags.set(CommonStatsFlags.Flag.Percolate);
|
||||||
}
|
}
|
||||||
|
if (request.request.segments()) {
|
||||||
|
flags.set(CommonStatsFlags.Flag.Segments);
|
||||||
|
}
|
||||||
if (request.request.completion()) {
|
if (request.request.completion()) {
|
||||||
flags.set(CommonStatsFlags.Flag.Completion);
|
flags.set(CommonStatsFlags.Flag.Completion);
|
||||||
flags.completionDataFields(request.request.completionFields());
|
flags.completionDataFields(request.request.completionFields());
|
||||||
|
|
|
@ -90,6 +90,14 @@ public interface Engine extends IndexShardComponent, CloseableComponent {
|
||||||
*/
|
*/
|
||||||
Searcher acquireSearcher(String source) throws EngineException;
|
Searcher acquireSearcher(String source) throws EngineException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Global stats on segments.
|
||||||
|
*/
|
||||||
|
SegmentsStats segmentsStats();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of segments in the engine.
|
||||||
|
*/
|
||||||
List<Segment> segments();
|
List<Segment> segments();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* Licensed to ElasticSearch and Shay Banon under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. ElasticSearch licenses this
|
||||||
|
* file to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.elasticsearch.index.engine;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
|
import org.elasticsearch.common.io.stream.Streamable;
|
||||||
|
import org.elasticsearch.common.xcontent.ToXContent;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentBuilderString;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SegmentsStats implements Streamable, ToXContent {
|
||||||
|
|
||||||
|
private long count;
|
||||||
|
|
||||||
|
public SegmentsStats() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(long count) {
|
||||||
|
this.count += count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(SegmentsStats mergeStats) {
|
||||||
|
if (mergeStats == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.count += mergeStats.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The the segments count.
|
||||||
|
*/
|
||||||
|
public long getCount() {
|
||||||
|
return this.count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SegmentsStats readSegmentsStats(StreamInput in) throws IOException {
|
||||||
|
SegmentsStats stats = new SegmentsStats();
|
||||||
|
stats.readFrom(in);
|
||||||
|
return stats;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
|
builder.startObject(Fields.SEGMENTS);
|
||||||
|
builder.field(Fields.COUNT, count);
|
||||||
|
builder.endObject();
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
static final class Fields {
|
||||||
|
static final XContentBuilderString SEGMENTS = new XContentBuilderString("segments");
|
||||||
|
static final XContentBuilderString COUNT = new XContentBuilderString("count");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFrom(StreamInput in) throws IOException {
|
||||||
|
count = in.readVLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(StreamOutput out) throws IOException {
|
||||||
|
out.writeVLong(count);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1118,6 +1118,24 @@ public class RobinEngine extends AbstractIndexShardComponent implements Engine {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SegmentsStats segmentsStats() {
|
||||||
|
rwl.readLock().lock();
|
||||||
|
try {
|
||||||
|
ensureOpen();
|
||||||
|
Searcher searcher = acquireSearcher("segments_stats");
|
||||||
|
try {
|
||||||
|
SegmentsStats stats = new SegmentsStats();
|
||||||
|
stats.add(searcher.reader().leaves().size());
|
||||||
|
return stats;
|
||||||
|
} finally {
|
||||||
|
searcher.release();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
rwl.readLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Segment> segments() {
|
public List<Segment> segments() {
|
||||||
rwl.readLock().lock();
|
rwl.readLock().lock();
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.elasticsearch.index.cache.id.IdCacheStats;
|
||||||
import org.elasticsearch.index.cache.id.ShardIdCache;
|
import org.elasticsearch.index.cache.id.ShardIdCache;
|
||||||
import org.elasticsearch.index.engine.Engine;
|
import org.elasticsearch.index.engine.Engine;
|
||||||
import org.elasticsearch.index.engine.EngineException;
|
import org.elasticsearch.index.engine.EngineException;
|
||||||
|
import org.elasticsearch.index.engine.SegmentsStats;
|
||||||
import org.elasticsearch.index.fielddata.FieldDataStats;
|
import org.elasticsearch.index.fielddata.FieldDataStats;
|
||||||
import org.elasticsearch.index.fielddata.IndexFieldDataService;
|
import org.elasticsearch.index.fielddata.IndexFieldDataService;
|
||||||
import org.elasticsearch.index.fielddata.ShardFieldData;
|
import org.elasticsearch.index.fielddata.ShardFieldData;
|
||||||
|
@ -89,6 +90,8 @@ public interface IndexShard extends IndexShardComponent {
|
||||||
|
|
||||||
MergeStats mergeStats();
|
MergeStats mergeStats();
|
||||||
|
|
||||||
|
SegmentsStats segmentStats();
|
||||||
|
|
||||||
RefreshStats refreshStats();
|
RefreshStats refreshStats();
|
||||||
|
|
||||||
FlushStats flushStats();
|
FlushStats flushStats();
|
||||||
|
|
|
@ -520,6 +520,11 @@ public class InternalIndexShard extends AbstractIndexShardComponent implements I
|
||||||
return mergeScheduler.stats();
|
return mergeScheduler.stats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SegmentsStats segmentStats() {
|
||||||
|
return engine.segmentsStats();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WarmerStats warmerStats() {
|
public WarmerStats warmerStats() {
|
||||||
return shardWarmerService.stats();
|
return shardWarmerService.stats();
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
import org.elasticsearch.common.xcontent.XContentBuilderString;
|
import org.elasticsearch.common.xcontent.XContentBuilderString;
|
||||||
import org.elasticsearch.index.cache.filter.FilterCacheStats;
|
import org.elasticsearch.index.cache.filter.FilterCacheStats;
|
||||||
import org.elasticsearch.index.cache.id.IdCacheStats;
|
import org.elasticsearch.index.cache.id.IdCacheStats;
|
||||||
|
import org.elasticsearch.index.engine.SegmentsStats;
|
||||||
import org.elasticsearch.index.fielddata.FieldDataStats;
|
import org.elasticsearch.index.fielddata.FieldDataStats;
|
||||||
import org.elasticsearch.index.flush.FlushStats;
|
import org.elasticsearch.index.flush.FlushStats;
|
||||||
import org.elasticsearch.index.get.GetStats;
|
import org.elasticsearch.index.get.GetStats;
|
||||||
|
@ -39,6 +40,7 @@ import org.elasticsearch.index.refresh.RefreshStats;
|
||||||
import org.elasticsearch.index.search.stats.SearchStats;
|
import org.elasticsearch.index.search.stats.SearchStats;
|
||||||
import org.elasticsearch.index.shard.DocsStats;
|
import org.elasticsearch.index.shard.DocsStats;
|
||||||
import org.elasticsearch.index.store.StoreStats;
|
import org.elasticsearch.index.store.StoreStats;
|
||||||
|
import org.elasticsearch.search.suggest.completion.CompletionStats;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
@ -117,6 +119,16 @@ public class NodeIndicesStats implements Streamable, Serializable, ToXContent {
|
||||||
return stats.getIdCache();
|
return stats.getIdCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public CompletionStats getCompletion() {
|
||||||
|
return stats.getCompletion();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public SegmentsStats getSegments() {
|
||||||
|
return stats.getSegments();
|
||||||
|
}
|
||||||
|
|
||||||
public static NodeIndicesStats readIndicesStats(StreamInput in) throws IOException {
|
public static NodeIndicesStats readIndicesStats(StreamInput in) throws IOException {
|
||||||
NodeIndicesStats stats = new NodeIndicesStats();
|
NodeIndicesStats stats = new NodeIndicesStats();
|
||||||
stats.readFrom(in);
|
stats.readFrom(in);
|
||||||
|
|
|
@ -96,6 +96,9 @@ public class RestIndicesStatsAction extends BaseRestHandler {
|
||||||
|
|
||||||
controller.registerHandler(GET, "/_stats/percolate", new RestPercolateStatsHandler());
|
controller.registerHandler(GET, "/_stats/percolate", new RestPercolateStatsHandler());
|
||||||
controller.registerHandler(GET, "/{index}/_stats/percolate", new RestPercolateStatsHandler());
|
controller.registerHandler(GET, "/{index}/_stats/percolate", new RestPercolateStatsHandler());
|
||||||
|
|
||||||
|
controller.registerHandler(GET, "/_stats/segments", new RestSegmentsStatsHandler());
|
||||||
|
controller.registerHandler(GET, "/{index}/_stats/segments", new RestSegmentsStatsHandler());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -120,7 +123,7 @@ public class RestIndicesStatsAction extends BaseRestHandler {
|
||||||
}
|
}
|
||||||
/* We use "fields" as the default field list for stats that support field inclusion filters and further down
|
/* We use "fields" as the default field list for stats that support field inclusion filters and further down
|
||||||
* a more specific list of fields that overrides this list.*/
|
* a more specific list of fields that overrides this list.*/
|
||||||
final String[] defaultIncludedFields = request.paramAsStringArray("fields", null);
|
final String[] defaultIncludedFields = request.paramAsStringArray("fields", null);
|
||||||
indicesStatsRequest.docs(request.paramAsBoolean("docs", indicesStatsRequest.docs()));
|
indicesStatsRequest.docs(request.paramAsBoolean("docs", indicesStatsRequest.docs()));
|
||||||
indicesStatsRequest.store(request.paramAsBoolean("store", indicesStatsRequest.store()));
|
indicesStatsRequest.store(request.paramAsBoolean("store", indicesStatsRequest.store()));
|
||||||
indicesStatsRequest.indexing(request.paramAsBoolean("indexing", indicesStatsRequest.indexing()));
|
indicesStatsRequest.indexing(request.paramAsBoolean("indexing", indicesStatsRequest.indexing()));
|
||||||
|
@ -135,6 +138,7 @@ public class RestIndicesStatsAction extends BaseRestHandler {
|
||||||
indicesStatsRequest.fieldData(request.paramAsBoolean("fielddata", indicesStatsRequest.fieldData()));
|
indicesStatsRequest.fieldData(request.paramAsBoolean("fielddata", indicesStatsRequest.fieldData()));
|
||||||
indicesStatsRequest.fieldDataFields(request.paramAsStringArray("fielddata_fields", defaultIncludedFields));
|
indicesStatsRequest.fieldDataFields(request.paramAsStringArray("fielddata_fields", defaultIncludedFields));
|
||||||
indicesStatsRequest.percolate(request.paramAsBoolean("percolate", indicesStatsRequest.percolate()));
|
indicesStatsRequest.percolate(request.paramAsBoolean("percolate", indicesStatsRequest.percolate()));
|
||||||
|
indicesStatsRequest.segments(request.paramAsBoolean("segments", indicesStatsRequest.segments()));
|
||||||
indicesStatsRequest.completion(request.paramAsBoolean("completion", indicesStatsRequest.completion()));
|
indicesStatsRequest.completion(request.paramAsBoolean("completion", indicesStatsRequest.completion()));
|
||||||
indicesStatsRequest.completionFields(request.paramAsStringArray("completion_fields", defaultIncludedFields));
|
indicesStatsRequest.completionFields(request.paramAsStringArray("completion_fields", defaultIncludedFields));
|
||||||
|
|
||||||
|
@ -710,4 +714,40 @@ public class RestIndicesStatsAction extends BaseRestHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class RestSegmentsStatsHandler implements RestHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleRequest(final RestRequest request, final RestChannel channel) {
|
||||||
|
IndicesStatsRequest indicesStatsRequest = new IndicesStatsRequest();
|
||||||
|
indicesStatsRequest.listenerThreaded(false);
|
||||||
|
indicesStatsRequest.clear().segments(true);
|
||||||
|
indicesStatsRequest.indices(Strings.splitStringByCommaToArray(request.param("index")));
|
||||||
|
|
||||||
|
client.admin().indices().stats(indicesStatsRequest, new ActionListener<IndicesStatsResponse>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(IndicesStatsResponse response) {
|
||||||
|
try {
|
||||||
|
XContentBuilder builder = RestXContentBuilder.restContentBuilder(request);
|
||||||
|
builder.startObject();
|
||||||
|
builder.field("ok", true);
|
||||||
|
buildBroadcastShardsHeader(builder, response);
|
||||||
|
response.toXContent(builder, request);
|
||||||
|
builder.endObject();
|
||||||
|
channel.sendResponse(new XContentRestResponse(request, OK, builder));
|
||||||
|
} catch (Throwable e) {
|
||||||
|
onFailure(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Throwable e) {
|
||||||
|
try {
|
||||||
|
channel.sendResponse(new XContentThrowableRestResponse(request, e));
|
||||||
|
} catch (IOException e1) {
|
||||||
|
logger.error("Failed to send failure response", e1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -206,6 +206,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
|
||||||
public void testSegments() throws Exception {
|
public void testSegments() throws Exception {
|
||||||
List<Segment> segments = engine.segments();
|
List<Segment> segments = engine.segments();
|
||||||
assertThat(segments.isEmpty(), equalTo(true));
|
assertThat(segments.isEmpty(), equalTo(true));
|
||||||
|
assertThat(engine.segmentsStats().getCount(), equalTo(0l));
|
||||||
final boolean defaultCompound = defaultSettings.getAsBoolean(RobinEngine.INDEX_COMPOUND_ON_FLUSH, true);
|
final boolean defaultCompound = defaultSettings.getAsBoolean(RobinEngine.INDEX_COMPOUND_ON_FLUSH, true);
|
||||||
|
|
||||||
// create a doc and refresh
|
// create a doc and refresh
|
||||||
|
@ -218,6 +219,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
segments = engine.segments();
|
segments = engine.segments();
|
||||||
assertThat(segments.size(), equalTo(1));
|
assertThat(segments.size(), equalTo(1));
|
||||||
|
assertThat(engine.segmentsStats().getCount(), equalTo(1l));
|
||||||
assertThat(segments.get(0).isCommitted(), equalTo(false));
|
assertThat(segments.get(0).isCommitted(), equalTo(false));
|
||||||
assertThat(segments.get(0).isSearch(), equalTo(true));
|
assertThat(segments.get(0).isSearch(), equalTo(true));
|
||||||
assertThat(segments.get(0).getNumDocs(), equalTo(2));
|
assertThat(segments.get(0).getNumDocs(), equalTo(2));
|
||||||
|
@ -228,6 +230,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
segments = engine.segments();
|
segments = engine.segments();
|
||||||
assertThat(segments.size(), equalTo(1));
|
assertThat(segments.size(), equalTo(1));
|
||||||
|
assertThat(engine.segmentsStats().getCount(), equalTo(1l));
|
||||||
assertThat(segments.get(0).isCommitted(), equalTo(true));
|
assertThat(segments.get(0).isCommitted(), equalTo(true));
|
||||||
assertThat(segments.get(0).isSearch(), equalTo(true));
|
assertThat(segments.get(0).isSearch(), equalTo(true));
|
||||||
assertThat(segments.get(0).getNumDocs(), equalTo(2));
|
assertThat(segments.get(0).getNumDocs(), equalTo(2));
|
||||||
|
@ -242,6 +245,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
segments = engine.segments();
|
segments = engine.segments();
|
||||||
assertThat(segments.size(), equalTo(2));
|
assertThat(segments.size(), equalTo(2));
|
||||||
|
assertThat(engine.segmentsStats().getCount(), equalTo(2l));
|
||||||
assertThat(segments.get(0).getGeneration() < segments.get(1).getGeneration(), equalTo(true));
|
assertThat(segments.get(0).getGeneration() < segments.get(1).getGeneration(), equalTo(true));
|
||||||
assertThat(segments.get(0).isCommitted(), equalTo(true));
|
assertThat(segments.get(0).isCommitted(), equalTo(true));
|
||||||
assertThat(segments.get(0).isSearch(), equalTo(true));
|
assertThat(segments.get(0).isSearch(), equalTo(true));
|
||||||
|
@ -262,6 +266,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
segments = engine.segments();
|
segments = engine.segments();
|
||||||
assertThat(segments.size(), equalTo(2));
|
assertThat(segments.size(), equalTo(2));
|
||||||
|
assertThat(engine.segmentsStats().getCount(), equalTo(2l));
|
||||||
assertThat(segments.get(0).getGeneration() < segments.get(1).getGeneration(), equalTo(true));
|
assertThat(segments.get(0).getGeneration() < segments.get(1).getGeneration(), equalTo(true));
|
||||||
assertThat(segments.get(0).isCommitted(), equalTo(true));
|
assertThat(segments.get(0).isCommitted(), equalTo(true));
|
||||||
assertThat(segments.get(0).isSearch(), equalTo(true));
|
assertThat(segments.get(0).isSearch(), equalTo(true));
|
||||||
|
@ -282,6 +287,7 @@ public class RobinEngineTests extends ElasticsearchTestCase {
|
||||||
|
|
||||||
segments = engine.segments();
|
segments = engine.segments();
|
||||||
assertThat(segments.size(), equalTo(3));
|
assertThat(segments.size(), equalTo(3));
|
||||||
|
assertThat(engine.segmentsStats().getCount(), equalTo(3l));
|
||||||
assertThat(segments.get(0).getGeneration() < segments.get(1).getGeneration(), equalTo(true));
|
assertThat(segments.get(0).getGeneration() < segments.get(1).getGeneration(), equalTo(true));
|
||||||
assertThat(segments.get(0).isCommitted(), equalTo(true));
|
assertThat(segments.get(0).isCommitted(), equalTo(true));
|
||||||
assertThat(segments.get(0).isSearch(), equalTo(true));
|
assertThat(segments.get(0).isSearch(), equalTo(true));
|
||||||
|
|
|
@ -20,8 +20,11 @@
|
||||||
package org.elasticsearch.indices.stats;
|
package org.elasticsearch.indices.stats;
|
||||||
|
|
||||||
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
|
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
|
||||||
import org.elasticsearch.action.admin.indices.stats.*;
|
import org.elasticsearch.action.admin.indices.stats.CommonStats;
|
||||||
|
import org.elasticsearch.action.admin.indices.stats.CommonStatsFlags;
|
||||||
import org.elasticsearch.action.admin.indices.stats.CommonStatsFlags.Flag;
|
import org.elasticsearch.action.admin.indices.stats.CommonStatsFlags.Flag;
|
||||||
|
import org.elasticsearch.action.admin.indices.stats.IndicesStatsRequestBuilder;
|
||||||
|
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
|
||||||
import org.elasticsearch.action.get.GetResponse;
|
import org.elasticsearch.action.get.GetResponse;
|
||||||
import org.elasticsearch.common.Priority;
|
import org.elasticsearch.common.Priority;
|
||||||
import org.elasticsearch.common.bytes.BytesReference;
|
import org.elasticsearch.common.bytes.BytesReference;
|
||||||
|
@ -41,7 +44,7 @@ import static org.hamcrest.Matchers.*;
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ClusterScope(scope=Scope.SUITE, numNodes=2)
|
@ClusterScope(scope = Scope.SUITE, numNodes = 2)
|
||||||
public class SimpleIndexStatsTests extends AbstractIntegrationTest {
|
public class SimpleIndexStatsTests extends AbstractIntegrationTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -187,13 +190,32 @@ public class SimpleIndexStatsTests extends AbstractIntegrationTest {
|
||||||
assertThat(stats.getTotal().getMerge().getTotal(), greaterThan(0l));
|
assertThat(stats.getTotal().getMerge().getTotal(), greaterThan(0l));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSegmentsStasts() {
|
||||||
|
prepareCreate("test1", 2).setSettings("index.number_of_shards", 5, "index.number_of_replicas", 1).get();
|
||||||
|
|
||||||
|
ClusterHealthResponse clusterHealthResponse = client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().get();
|
||||||
|
assertThat(clusterHealthResponse.isTimedOut(), equalTo(false));
|
||||||
|
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
index("test1", "type1", Integer.toString(i), "field", "value");
|
||||||
|
index("test1", "type2", Integer.toString(i), "field", "value");
|
||||||
|
client().admin().indices().prepareFlush().get();
|
||||||
|
}
|
||||||
|
client().admin().indices().prepareOptimize().setWaitForMerge(true).setMaxNumSegments(1).execute().actionGet();
|
||||||
|
IndicesStatsResponse stats = client().admin().indices().prepareStats().setSegments(true).get();
|
||||||
|
|
||||||
|
assertThat(stats.getTotal().getSegments(), notNullValue());
|
||||||
|
assertThat(stats.getTotal().getSegments().getCount(), equalTo(10l));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAllFlags() throws Exception {
|
public void testAllFlags() throws Exception {
|
||||||
// rely on 1 replica for this tests
|
// rely on 1 replica for this tests
|
||||||
createIndex("test1");
|
createIndex("test1");
|
||||||
createIndex("test2");
|
createIndex("test2");
|
||||||
|
|
||||||
ClusterHealthResponse clusterHealthResponse = client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().execute().actionGet();
|
ClusterHealthResponse clusterHealthResponse = client().admin().cluster().prepareHealth().setWaitForEvents(Priority.LANGUID).setWaitForGreenStatus().get();
|
||||||
assertThat(clusterHealthResponse.isTimedOut(), equalTo(false));
|
assertThat(clusterHealthResponse.isTimedOut(), equalTo(false));
|
||||||
|
|
||||||
client().prepareIndex("test1", "type1", Integer.toString(1)).setSource("field", "value").execute().actionGet();
|
client().prepareIndex("test1", "type1", Integer.toString(1)).setSource("field", "value").execute().actionGet();
|
||||||
|
@ -297,7 +319,7 @@ public class SimpleIndexStatsTests extends AbstractIntegrationTest {
|
||||||
@Test
|
@Test
|
||||||
public void testFlagOrdinalOrder() {
|
public void testFlagOrdinalOrder() {
|
||||||
Flag[] flags = new Flag[]{Flag.Store, Flag.Indexing, Flag.Get, Flag.Search, Flag.Merge, Flag.Flush, Flag.Refresh,
|
Flag[] flags = new Flag[]{Flag.Store, Flag.Indexing, Flag.Get, Flag.Search, Flag.Merge, Flag.Flush, Flag.Refresh,
|
||||||
Flag.FilterCache, Flag.IdCache, Flag.FieldData, Flag.Docs, Flag.Warmer, Flag.Percolate, Flag.Completion};
|
Flag.FilterCache, Flag.IdCache, Flag.FieldData, Flag.Docs, Flag.Warmer, Flag.Percolate, Flag.Completion, Flag.Segments};
|
||||||
|
|
||||||
assertThat(flags.length, equalTo(Flag.values().length));
|
assertThat(flags.length, equalTo(Flag.values().length));
|
||||||
for (int i = 0; i < flags.length; i++) {
|
for (int i = 0; i < flags.length; i++) {
|
||||||
|
@ -349,6 +371,9 @@ public class SimpleIndexStatsTests extends AbstractIntegrationTest {
|
||||||
case Completion:
|
case Completion:
|
||||||
builder.setCompletion(set);
|
builder.setCompletion(set);
|
||||||
break;
|
break;
|
||||||
|
case Segments:
|
||||||
|
builder.setSegments(set);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert false : "new flag? " + flag;
|
assert false : "new flag? " + flag;
|
||||||
break;
|
break;
|
||||||
|
@ -385,6 +410,8 @@ public class SimpleIndexStatsTests extends AbstractIntegrationTest {
|
||||||
return response.getPercolate() != null;
|
return response.getPercolate() != null;
|
||||||
case Completion:
|
case Completion:
|
||||||
return response.getCompletion() != null;
|
return response.getCompletion() != null;
|
||||||
|
case Segments:
|
||||||
|
return response.getSegments() != null;
|
||||||
default:
|
default:
|
||||||
assert false : "new flag? " + flag;
|
assert false : "new flag? " + flag;
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue