parent
0c1b9a6670
commit
ceed22fe00
|
@ -45,6 +45,7 @@ specified as well in the URI. Those stats can be any of:
|
||||||
`flush`:: Flush statistics.
|
`flush`:: Flush statistics.
|
||||||
`completion`:: Completion suggest statistics.
|
`completion`:: Completion suggest statistics.
|
||||||
`refresh`:: Refresh statistics.
|
`refresh`:: Refresh statistics.
|
||||||
|
`suggest`:: Suggest statistics.
|
||||||
|
|
||||||
Some statistics allow per field granularity which accepts a list comma-separated list of included fields. By default all fields are included:
|
Some statistics allow per field granularity which accepts a list comma-separated list of included fields. By default all fields are included:
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
},
|
},
|
||||||
"metric" : {
|
"metric" : {
|
||||||
"type" : "list",
|
"type" : "list",
|
||||||
"options" : ["_all", "completion", "docs", "fielddata", "filter_cache", "flush", "get", "id_cache", "indexing", "merge", "percolate", "refresh", "search", "segments", "store", "warmer"],
|
"options" : ["_all", "completion", "docs", "fielddata", "filter_cache", "flush", "get", "id_cache", "indexing", "merge", "percolate", "refresh", "search", "segments", "store", "warmer", "suggest"],
|
||||||
"description" : "Limit the information returned the specific metrics."
|
"description" : "Limit the information returned the specific metrics."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
},
|
},
|
||||||
"index_metric" : {
|
"index_metric" : {
|
||||||
"type" : "list",
|
"type" : "list",
|
||||||
"options" : ["_all", "completion", "docs", "fielddata", "filter_cache", "flush", "get", "id_cache", "indexing", "merge", "percolate", "refresh", "search", "segments", "store", "warmer"],
|
"options" : ["_all", "completion", "docs", "fielddata", "filter_cache", "flush", "get", "id_cache", "indexing", "merge", "percolate", "refresh", "search", "segments", "store", "warmer", "suggest"],
|
||||||
"description" : "Limit the information returned for `indices` metric to the specific index metrics. Isn't used if `indices` (or `all`) metric isn't specified."
|
"description" : "Limit the information returned for `indices` metric to the specific index metrics. Isn't used if `indices` (or `all`) metric isn't specified."
|
||||||
},
|
},
|
||||||
"node_id": {
|
"node_id": {
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
package org.elasticsearch.action.admin.indices.stats;
|
package org.elasticsearch.action.admin.indices.stats;
|
||||||
|
|
||||||
|
import org.elasticsearch.Version;
|
||||||
import org.elasticsearch.common.Nullable;
|
import org.elasticsearch.common.Nullable;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.io.stream.StreamOutput;
|
import org.elasticsearch.common.io.stream.StreamOutput;
|
||||||
|
@ -39,6 +40,7 @@ import org.elasticsearch.index.search.stats.SearchStats;
|
||||||
import org.elasticsearch.index.shard.DocsStats;
|
import org.elasticsearch.index.shard.DocsStats;
|
||||||
import org.elasticsearch.index.shard.service.IndexShard;
|
import org.elasticsearch.index.shard.service.IndexShard;
|
||||||
import org.elasticsearch.index.store.StoreStats;
|
import org.elasticsearch.index.store.StoreStats;
|
||||||
|
import org.elasticsearch.index.suggest.stats.SuggestStats;
|
||||||
import org.elasticsearch.index.translog.TranslogStats;
|
import org.elasticsearch.index.translog.TranslogStats;
|
||||||
import org.elasticsearch.index.warmer.WarmerStats;
|
import org.elasticsearch.index.warmer.WarmerStats;
|
||||||
import org.elasticsearch.search.suggest.completion.CompletionStats;
|
import org.elasticsearch.search.suggest.completion.CompletionStats;
|
||||||
|
@ -106,6 +108,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
case Translog:
|
case Translog:
|
||||||
translog = new TranslogStats();
|
translog = new TranslogStats();
|
||||||
break;
|
break;
|
||||||
|
case Suggest:
|
||||||
|
suggest = new SuggestStats();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IllegalStateException("Unknown Flag: " + flag);
|
throw new IllegalStateException("Unknown Flag: " + flag);
|
||||||
}
|
}
|
||||||
|
@ -166,6 +171,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
case Translog:
|
case Translog:
|
||||||
translog = indexShard.translogStats();
|
translog = indexShard.translogStats();
|
||||||
break;
|
break;
|
||||||
|
case Suggest:
|
||||||
|
suggest = indexShard.suggestStats();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new IllegalStateException("Unknown Flag: " + flag);
|
throw new IllegalStateException("Unknown Flag: " + flag);
|
||||||
}
|
}
|
||||||
|
@ -220,6 +228,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
@Nullable
|
@Nullable
|
||||||
public TranslogStats translog;
|
public TranslogStats translog;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public SuggestStats suggest;
|
||||||
|
|
||||||
public void add(CommonStats stats) {
|
public void add(CommonStats stats) {
|
||||||
if (docs == null) {
|
if (docs == null) {
|
||||||
if (stats.getDocs() != null) {
|
if (stats.getDocs() != null) {
|
||||||
|
@ -351,6 +362,14 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
} else {
|
} else {
|
||||||
translog.add(stats.getTranslog());
|
translog.add(stats.getTranslog());
|
||||||
}
|
}
|
||||||
|
if (suggest == null) {
|
||||||
|
if (stats.getSuggest() != null) {
|
||||||
|
suggest = new SuggestStats();
|
||||||
|
suggest.add(stats.getSuggest());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
suggest.add(stats.getSuggest());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
@ -429,7 +448,14 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public TranslogStats getTranslog() { return translog; }
|
public TranslogStats getTranslog() {
|
||||||
|
return translog;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public SuggestStats getSuggest() {
|
||||||
|
return suggest;
|
||||||
|
}
|
||||||
|
|
||||||
public static CommonStats readCommonStats(StreamInput in) throws IOException {
|
public static CommonStats readCommonStats(StreamInput in) throws IOException {
|
||||||
CommonStats stats = new CommonStats();
|
CommonStats stats = new CommonStats();
|
||||||
|
@ -485,6 +511,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
segments = SegmentsStats.readSegmentsStats(in);
|
segments = SegmentsStats.readSegmentsStats(in);
|
||||||
}
|
}
|
||||||
translog = in.readOptionalStreamable(new TranslogStats());
|
translog = in.readOptionalStreamable(new TranslogStats());
|
||||||
|
if (in.getVersion().onOrAfter(Version.V_1_2_0)) {
|
||||||
|
suggest = in.readOptionalStreamable(new SuggestStats());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -580,6 +609,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
segments.writeTo(out);
|
segments.writeTo(out);
|
||||||
}
|
}
|
||||||
out.writeOptionalStreamable(translog);
|
out.writeOptionalStreamable(translog);
|
||||||
|
if (out.getVersion().onOrAfter(Version.V_1_2_0)) {
|
||||||
|
out.writeOptionalStreamable(suggest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// note, requires a wrapping object
|
// note, requires a wrapping object
|
||||||
|
@ -633,6 +665,9 @@ public class CommonStats implements Streamable, ToXContent {
|
||||||
if (translog != null) {
|
if (translog != null) {
|
||||||
translog.toXContent(builder, params);
|
translog.toXContent(builder, params);
|
||||||
}
|
}
|
||||||
|
if (suggest != null) {
|
||||||
|
suggest.toXContent(builder, params);
|
||||||
|
}
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -223,7 +223,8 @@ public class CommonStatsFlags implements Streamable, Cloneable {
|
||||||
Percolate("percolate"),
|
Percolate("percolate"),
|
||||||
Completion("completion"),
|
Completion("completion"),
|
||||||
Segments("segments"),
|
Segments("segments"),
|
||||||
Translog("translog");
|
Translog("translog"),
|
||||||
|
Suggest("suggest");
|
||||||
|
|
||||||
private final String restName;
|
private final String restName;
|
||||||
|
|
||||||
|
|
|
@ -247,6 +247,15 @@ public class IndicesStatsRequest extends BroadcastOperationRequest<IndicesStatsR
|
||||||
return flags.isSet(Flag.Translog);
|
return flags.isSet(Flag.Translog);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IndicesStatsRequest suggest(boolean suggest) {
|
||||||
|
flags.set(Flag.Suggest, suggest);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean suggest() {
|
||||||
|
return flags.isSet(Flag.Suggest);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeTo(StreamOutput out) throws IOException {
|
public void writeTo(StreamOutput out) throws IOException {
|
||||||
super.writeTo(out);
|
super.writeTo(out);
|
||||||
|
|
|
@ -159,6 +159,11 @@ public class IndicesStatsRequestBuilder extends BroadcastOperationRequestBuilder
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IndicesStatsRequestBuilder setSuggest(boolean suggest) {
|
||||||
|
request.suggest(suggest);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doExecute(ActionListener<IndicesStatsResponse> listener) {
|
protected void doExecute(ActionListener<IndicesStatsResponse> listener) {
|
||||||
((IndicesAdminClient) client).stats(request, listener);
|
((IndicesAdminClient) client).stats(request, listener);
|
||||||
|
|
|
@ -193,6 +193,9 @@ public class TransportIndicesStatsAction extends TransportBroadcastOperationActi
|
||||||
if (request.request.translog()) {
|
if (request.request.translog()) {
|
||||||
flags.set(CommonStatsFlags.Flag.Translog);
|
flags.set(CommonStatsFlags.Flag.Translog);
|
||||||
}
|
}
|
||||||
|
if (request.request.suggest()) {
|
||||||
|
flags.set(CommonStatsFlags.Flag.Suggest);
|
||||||
|
}
|
||||||
|
|
||||||
return new ShardStats(indexShard, flags);
|
return new ShardStats(indexShard, flags);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.index.engine.Engine;
|
import org.elasticsearch.index.engine.Engine;
|
||||||
import org.elasticsearch.index.service.IndexService;
|
import org.elasticsearch.index.service.IndexService;
|
||||||
import org.elasticsearch.index.shard.service.IndexShard;
|
import org.elasticsearch.index.shard.service.IndexShard;
|
||||||
|
import org.elasticsearch.index.suggest.stats.ShardSuggestService;
|
||||||
import org.elasticsearch.indices.IndicesService;
|
import org.elasticsearch.indices.IndicesService;
|
||||||
import org.elasticsearch.search.suggest.Suggest;
|
import org.elasticsearch.search.suggest.Suggest;
|
||||||
import org.elasticsearch.search.suggest.SuggestPhase;
|
import org.elasticsearch.search.suggest.SuggestPhase;
|
||||||
|
@ -150,6 +151,9 @@ public class TransportSuggestAction extends TransportBroadcastOperationAction<Su
|
||||||
IndexService indexService = indicesService.indexServiceSafe(request.index());
|
IndexService indexService = indicesService.indexServiceSafe(request.index());
|
||||||
IndexShard indexShard = indexService.shardSafe(request.shardId());
|
IndexShard indexShard = indexService.shardSafe(request.shardId());
|
||||||
final Engine.Searcher searcher = indexShard.acquireSearcher("suggest");
|
final Engine.Searcher searcher = indexShard.acquireSearcher("suggest");
|
||||||
|
ShardSuggestService shardSuggestService = indexShard.shardSuggestService();
|
||||||
|
shardSuggestService.preSuggest();
|
||||||
|
long startTime = System.nanoTime();
|
||||||
XContentParser parser = null;
|
XContentParser parser = null;
|
||||||
try {
|
try {
|
||||||
BytesReference suggest = request.suggest();
|
BytesReference suggest = request.suggest();
|
||||||
|
@ -170,6 +174,7 @@ public class TransportSuggestAction extends TransportBroadcastOperationAction<Su
|
||||||
if (parser != null) {
|
if (parser != null) {
|
||||||
parser.close();
|
parser.close();
|
||||||
}
|
}
|
||||||
|
shardSuggestService.postSuggest(System.nanoTime() - startTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,6 +65,7 @@ import org.elasticsearch.index.snapshots.IndexShardSnapshotModule;
|
||||||
import org.elasticsearch.index.store.IndexStore;
|
import org.elasticsearch.index.store.IndexStore;
|
||||||
import org.elasticsearch.index.store.Store;
|
import org.elasticsearch.index.store.Store;
|
||||||
import org.elasticsearch.index.store.StoreModule;
|
import org.elasticsearch.index.store.StoreModule;
|
||||||
|
import org.elasticsearch.index.suggest.SuggestShardModule;
|
||||||
import org.elasticsearch.index.termvectors.ShardTermVectorModule;
|
import org.elasticsearch.index.termvectors.ShardTermVectorModule;
|
||||||
import org.elasticsearch.index.translog.Translog;
|
import org.elasticsearch.index.translog.Translog;
|
||||||
import org.elasticsearch.index.translog.TranslogModule;
|
import org.elasticsearch.index.translog.TranslogModule;
|
||||||
|
@ -334,6 +335,7 @@ public class InternalIndexService extends AbstractIndexComponent implements Inde
|
||||||
modules.add(new PercolatorShardModule());
|
modules.add(new PercolatorShardModule());
|
||||||
modules.add(new ShardTermVectorModule());
|
modules.add(new ShardTermVectorModule());
|
||||||
modules.add(new IndexShardSnapshotModule());
|
modules.add(new IndexShardSnapshotModule());
|
||||||
|
modules.add(new SuggestShardModule());
|
||||||
|
|
||||||
Injector shardInjector;
|
Injector shardInjector;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -53,6 +53,8 @@ import org.elasticsearch.index.shard.IllegalIndexShardStateException;
|
||||||
import org.elasticsearch.index.shard.IndexShardComponent;
|
import org.elasticsearch.index.shard.IndexShardComponent;
|
||||||
import org.elasticsearch.index.shard.IndexShardState;
|
import org.elasticsearch.index.shard.IndexShardState;
|
||||||
import org.elasticsearch.index.store.StoreStats;
|
import org.elasticsearch.index.store.StoreStats;
|
||||||
|
import org.elasticsearch.index.suggest.stats.ShardSuggestService;
|
||||||
|
import org.elasticsearch.index.suggest.stats.SuggestStats;
|
||||||
import org.elasticsearch.index.termvectors.ShardTermVectorService;
|
import org.elasticsearch.index.termvectors.ShardTermVectorService;
|
||||||
import org.elasticsearch.index.translog.TranslogStats;
|
import org.elasticsearch.index.translog.TranslogStats;
|
||||||
import org.elasticsearch.index.warmer.ShardIndexWarmerService;
|
import org.elasticsearch.index.warmer.ShardIndexWarmerService;
|
||||||
|
@ -108,12 +110,16 @@ public interface IndexShard extends IndexShardComponent {
|
||||||
|
|
||||||
TranslogStats translogStats();
|
TranslogStats translogStats();
|
||||||
|
|
||||||
|
SuggestStats suggestStats();
|
||||||
|
|
||||||
PercolatorQueriesRegistry percolateRegistry();
|
PercolatorQueriesRegistry percolateRegistry();
|
||||||
|
|
||||||
ShardPercolateService shardPercolateService();
|
ShardPercolateService shardPercolateService();
|
||||||
|
|
||||||
ShardTermVectorService termVectorService();
|
ShardTermVectorService termVectorService();
|
||||||
|
|
||||||
|
ShardSuggestService shardSuggestService();
|
||||||
|
|
||||||
MapperService mapperService();
|
MapperService mapperService();
|
||||||
|
|
||||||
IndexFieldDataService indexFieldDataService();
|
IndexFieldDataService indexFieldDataService();
|
||||||
|
|
|
@ -74,6 +74,8 @@ import org.elasticsearch.index.settings.IndexSettingsService;
|
||||||
import org.elasticsearch.index.shard.*;
|
import org.elasticsearch.index.shard.*;
|
||||||
import org.elasticsearch.index.store.Store;
|
import org.elasticsearch.index.store.Store;
|
||||||
import org.elasticsearch.index.store.StoreStats;
|
import org.elasticsearch.index.store.StoreStats;
|
||||||
|
import org.elasticsearch.index.suggest.stats.ShardSuggestService;
|
||||||
|
import org.elasticsearch.index.suggest.stats.SuggestStats;
|
||||||
import org.elasticsearch.index.termvectors.ShardTermVectorService;
|
import org.elasticsearch.index.termvectors.ShardTermVectorService;
|
||||||
import org.elasticsearch.index.translog.Translog;
|
import org.elasticsearch.index.translog.Translog;
|
||||||
import org.elasticsearch.index.translog.TranslogStats;
|
import org.elasticsearch.index.translog.TranslogStats;
|
||||||
|
@ -122,6 +124,7 @@ public class InternalIndexShard extends AbstractIndexShardComponent implements I
|
||||||
private final ShardTermVectorService termVectorService;
|
private final ShardTermVectorService termVectorService;
|
||||||
private final IndexFieldDataService indexFieldDataService;
|
private final IndexFieldDataService indexFieldDataService;
|
||||||
private final IndexService indexService;
|
private final IndexService indexService;
|
||||||
|
private final ShardSuggestService shardSuggestService;
|
||||||
|
|
||||||
private final Object mutex = new Object();
|
private final Object mutex = new Object();
|
||||||
private final String checkIndexOnStartup;
|
private final String checkIndexOnStartup;
|
||||||
|
@ -146,7 +149,7 @@ public class InternalIndexShard extends AbstractIndexShardComponent implements I
|
||||||
public InternalIndexShard(ShardId shardId, @IndexSettings Settings indexSettings, IndexSettingsService indexSettingsService, IndicesLifecycle indicesLifecycle, Store store, Engine engine, MergeSchedulerProvider mergeScheduler, Translog translog,
|
public InternalIndexShard(ShardId shardId, @IndexSettings Settings indexSettings, IndexSettingsService indexSettingsService, IndicesLifecycle indicesLifecycle, Store store, Engine engine, MergeSchedulerProvider mergeScheduler, Translog translog,
|
||||||
ThreadPool threadPool, MapperService mapperService, IndexQueryParserService queryParserService, IndexCache indexCache, IndexAliasesService indexAliasesService, ShardIndexingService indexingService, ShardGetService getService, ShardSearchService searchService, ShardIndexWarmerService shardWarmerService,
|
ThreadPool threadPool, MapperService mapperService, IndexQueryParserService queryParserService, IndexCache indexCache, IndexAliasesService indexAliasesService, ShardIndexingService indexingService, ShardGetService getService, ShardSearchService searchService, ShardIndexWarmerService shardWarmerService,
|
||||||
ShardFilterCache shardFilterCache, ShardFieldData shardFieldData, PercolatorQueriesRegistry percolatorQueriesRegistry, ShardPercolateService shardPercolateService, CodecService codecService,
|
ShardFilterCache shardFilterCache, ShardFieldData shardFieldData, PercolatorQueriesRegistry percolatorQueriesRegistry, ShardPercolateService shardPercolateService, CodecService codecService,
|
||||||
ShardTermVectorService termVectorService, IndexFieldDataService indexFieldDataService, IndexService indexService) {
|
ShardTermVectorService termVectorService, IndexFieldDataService indexFieldDataService, IndexService indexService, ShardSuggestService shardSuggestService) {
|
||||||
super(shardId, indexSettings);
|
super(shardId, indexSettings);
|
||||||
this.indicesLifecycle = (InternalIndicesLifecycle) indicesLifecycle;
|
this.indicesLifecycle = (InternalIndicesLifecycle) indicesLifecycle;
|
||||||
this.indexSettingsService = indexSettingsService;
|
this.indexSettingsService = indexSettingsService;
|
||||||
|
@ -171,6 +174,7 @@ public class InternalIndexShard extends AbstractIndexShardComponent implements I
|
||||||
this.indexFieldDataService = indexFieldDataService;
|
this.indexFieldDataService = indexFieldDataService;
|
||||||
this.indexService = indexService;
|
this.indexService = indexService;
|
||||||
this.codecService = codecService;
|
this.codecService = codecService;
|
||||||
|
this.shardSuggestService = shardSuggestService;
|
||||||
state = IndexShardState.CREATED;
|
state = IndexShardState.CREATED;
|
||||||
|
|
||||||
this.refreshInterval = indexSettings.getAsTime(INDEX_REFRESH_INTERVAL, engine.defaultRefreshInterval());
|
this.refreshInterval = indexSettings.getAsTime(INDEX_REFRESH_INTERVAL, engine.defaultRefreshInterval());
|
||||||
|
@ -213,6 +217,11 @@ public class InternalIndexShard extends AbstractIndexShardComponent implements I
|
||||||
return termVectorService;
|
return termVectorService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ShardSuggestService shardSuggestService() {
|
||||||
|
return shardSuggestService;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IndexFieldDataService indexFieldDataService() {
|
public IndexFieldDataService indexFieldDataService() {
|
||||||
return indexFieldDataService;
|
return indexFieldDataService;
|
||||||
|
@ -560,6 +569,11 @@ public class InternalIndexShard extends AbstractIndexShardComponent implements I
|
||||||
return translog.stats();
|
return translog.stats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SuggestStats suggestStats() {
|
||||||
|
return shardSuggestService.stats();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletionStats completionStats(String... fields) {
|
public CompletionStats completionStats(String... fields) {
|
||||||
CompletionStats completionStats = new CompletionStats();
|
CompletionStats completionStats = new CompletionStats();
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch 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.suggest;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.inject.AbstractModule;
|
||||||
|
import org.elasticsearch.index.suggest.stats.ShardSuggestService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SuggestShardModule extends AbstractModule {
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(ShardSuggestService.class).asEagerSingleton();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch 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.suggest.stats;
|
||||||
|
|
||||||
|
import org.elasticsearch.common.inject.Inject;
|
||||||
|
import org.elasticsearch.common.metrics.CounterMetric;
|
||||||
|
import org.elasticsearch.common.metrics.MeanMetric;
|
||||||
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.index.settings.IndexSettings;
|
||||||
|
import org.elasticsearch.index.shard.AbstractIndexShardComponent;
|
||||||
|
import org.elasticsearch.index.shard.ShardId;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class ShardSuggestService extends AbstractIndexShardComponent {
|
||||||
|
|
||||||
|
private final MeanMetric suggestMetric = new MeanMetric();
|
||||||
|
private final CounterMetric currentMetric = new CounterMetric();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public ShardSuggestService(ShardId shardId, @IndexSettings Settings indexSettings) {
|
||||||
|
super(shardId, indexSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called before suggest
|
||||||
|
*/
|
||||||
|
public void preSuggest() {
|
||||||
|
currentMetric.inc();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called after suggest
|
||||||
|
* @param tookInNanos time of suggest used in nanos
|
||||||
|
*/
|
||||||
|
public void postSuggest(long tookInNanos) {
|
||||||
|
currentMetric.dec();
|
||||||
|
suggestMetric.inc(tookInNanos);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The current stats
|
||||||
|
*/
|
||||||
|
public SuggestStats stats() {
|
||||||
|
return new SuggestStats(suggestMetric.count(), TimeUnit.NANOSECONDS.toMillis(suggestMetric.sum()), currentMetric.count());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,124 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch 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.suggest.stats;
|
||||||
|
|
||||||
|
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.unit.TimeValue;
|
||||||
|
import org.elasticsearch.common.xcontent.ToXContent;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentBuilderString;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exposes suggest related statistics.
|
||||||
|
*/
|
||||||
|
public class SuggestStats implements Streamable, ToXContent {
|
||||||
|
|
||||||
|
private long suggestCount;
|
||||||
|
private long suggestTimeInMillis;
|
||||||
|
private long current;
|
||||||
|
|
||||||
|
public SuggestStats() {
|
||||||
|
}
|
||||||
|
|
||||||
|
SuggestStats(long suggestCount, long suggestTimeInMillis, long current) {
|
||||||
|
this.suggestCount = suggestCount;
|
||||||
|
this.suggestTimeInMillis = suggestTimeInMillis;
|
||||||
|
this.current = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The number of times the suggest api has been invoked.
|
||||||
|
*/
|
||||||
|
public long getCount() {
|
||||||
|
return suggestCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The total amount of time spend in the suggest api
|
||||||
|
*/
|
||||||
|
public long getTimeInMillis() {
|
||||||
|
return suggestTimeInMillis;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The total amount of time spend in the suggest api
|
||||||
|
*/
|
||||||
|
public TimeValue getTime() {
|
||||||
|
return new TimeValue(getTimeInMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The total amount of active suggest api invocations.
|
||||||
|
*/
|
||||||
|
public long getCurrent() {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void add(SuggestStats suggestStats) {
|
||||||
|
if (suggestStats != null) {
|
||||||
|
suggestCount += suggestStats.getCount();
|
||||||
|
suggestTimeInMillis += suggestStats.getTimeInMillis();
|
||||||
|
current += suggestStats.getCurrent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SuggestStats readSuggestStats(StreamInput in) throws IOException {
|
||||||
|
SuggestStats stats = new SuggestStats();
|
||||||
|
stats.readFrom(in);
|
||||||
|
return stats;
|
||||||
|
}
|
||||||
|
|
||||||
|
static final class Fields {
|
||||||
|
static final XContentBuilderString SUGGEST = new XContentBuilderString("suggest");
|
||||||
|
static final XContentBuilderString TOTAL = new XContentBuilderString("total");
|
||||||
|
static final XContentBuilderString TIME = new XContentBuilderString("time");
|
||||||
|
static final XContentBuilderString TIME_IN_MILLIS = new XContentBuilderString("time_in_millis");
|
||||||
|
static final XContentBuilderString CURRENT = new XContentBuilderString("current");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readFrom(StreamInput in) throws IOException {
|
||||||
|
suggestCount = in.readVLong();
|
||||||
|
suggestTimeInMillis = in.readVLong();
|
||||||
|
current = in.readVLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeTo(StreamOutput out) throws IOException {
|
||||||
|
out.writeVLong(suggestCount);
|
||||||
|
out.writeVLong(suggestTimeInMillis);
|
||||||
|
out.writeVLong(current);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
|
||||||
|
builder.startObject(Fields.SUGGEST);
|
||||||
|
builder.field(Fields.TOTAL, suggestCount);
|
||||||
|
builder.timeValueField(Fields.TIME_IN_MILLIS, Fields.TIME, suggestTimeInMillis);
|
||||||
|
builder.field(Fields.CURRENT, current);
|
||||||
|
builder.endObject();
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
}
|
|
@ -47,6 +47,7 @@ import org.elasticsearch.index.shard.DocsStats;
|
||||||
import org.elasticsearch.index.shard.ShardId;
|
import org.elasticsearch.index.shard.ShardId;
|
||||||
import org.elasticsearch.index.shard.service.IndexShard;
|
import org.elasticsearch.index.shard.service.IndexShard;
|
||||||
import org.elasticsearch.index.store.StoreStats;
|
import org.elasticsearch.index.store.StoreStats;
|
||||||
|
import org.elasticsearch.index.suggest.stats.SuggestStats;
|
||||||
import org.elasticsearch.search.suggest.completion.CompletionStats;
|
import org.elasticsearch.search.suggest.completion.CompletionStats;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -150,6 +151,11 @@ public class NodeIndicesStats implements Streamable, Serializable, ToXContent {
|
||||||
return stats.getSegments();
|
return stats.getSegments();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public SuggestStats getSuggest() {
|
||||||
|
return stats.getSuggest();
|
||||||
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
|
@ -89,6 +89,7 @@ public class RestIndicesStatsAction extends BaseRestHandler {
|
||||||
indicesStatsRequest.segments(metrics.contains("segments"));
|
indicesStatsRequest.segments(metrics.contains("segments"));
|
||||||
indicesStatsRequest.fieldData(metrics.contains("fielddata"));
|
indicesStatsRequest.fieldData(metrics.contains("fielddata"));
|
||||||
indicesStatsRequest.completion(metrics.contains("completion"));
|
indicesStatsRequest.completion(metrics.contains("completion"));
|
||||||
|
indicesStatsRequest.suggest(metrics.contains("suggest"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (indicesStatsRequest.completion() && (request.hasParam("fields") || request.hasParam("completion_fields"))) {
|
if (indicesStatsRequest.completion() && (request.hasParam("fields") || request.hasParam("completion_fields"))) {
|
||||||
|
|
|
@ -277,6 +277,16 @@ public class RestIndicesAction extends AbstractCatAction {
|
||||||
table.addCell("warmer.total_time", "sibling:pri;alias:wtt,warmerTotalTime;default:false;text-align:right;desc:time spent in warmers");
|
table.addCell("warmer.total_time", "sibling:pri;alias:wtt,warmerTotalTime;default:false;text-align:right;desc:time spent in warmers");
|
||||||
table.addCell("pri.warmer.total_time", "default:false;text-align:right;desc:time spent in warmers");
|
table.addCell("pri.warmer.total_time", "default:false;text-align:right;desc:time spent in warmers");
|
||||||
|
|
||||||
|
table.addCell("suggest.current", "sibling:pri;alias:suc,suggestCurrent;default:false;text-align:right;desc:number of current suggest ops");
|
||||||
|
table.addCell("pri.suggest.current", "default:false;text-align:right;desc:number of current suggest ops");
|
||||||
|
|
||||||
|
table.addCell("suggest.time", "sibling:pri;alias:suti,suggestTime;default:false;text-align:right;desc:time spend in suggest");
|
||||||
|
table.addCell("pri.suggest.time", "default:false;text-align:right;desc:time spend in suggest");
|
||||||
|
|
||||||
|
table.addCell("suggest.total", "sibling:pri;alias:suto,suggestTotal;default:false;text-align:right;desc:number of suggest ops");
|
||||||
|
table.addCell("pri.suggest.total", "default:false;text-align:right;desc:number of suggest ops");
|
||||||
|
|
||||||
|
|
||||||
table.endHeaders();
|
table.endHeaders();
|
||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
|
@ -440,6 +450,15 @@ public class RestIndicesAction extends AbstractCatAction {
|
||||||
table.addCell(indexStats == null ? null : indexStats.getTotal().getWarmer().totalTime());
|
table.addCell(indexStats == null ? null : indexStats.getTotal().getWarmer().totalTime());
|
||||||
table.addCell(indexStats == null ? null : indexStats.getPrimaries().getWarmer().totalTime());
|
table.addCell(indexStats == null ? null : indexStats.getPrimaries().getWarmer().totalTime());
|
||||||
|
|
||||||
|
table.addCell(indexStats == null ? null : indexStats.getTotal().getSuggest().getCurrent());
|
||||||
|
table.addCell(indexStats == null ? null : indexStats.getPrimaries().getSuggest().getCurrent());
|
||||||
|
|
||||||
|
table.addCell(indexStats == null ? null : indexStats.getTotal().getSuggest().getTime());
|
||||||
|
table.addCell(indexStats == null ? null : indexStats.getPrimaries().getSuggest().getTime());
|
||||||
|
|
||||||
|
table.addCell(indexStats == null ? null : indexStats.getTotal().getSuggest().getCount());
|
||||||
|
table.addCell(indexStats == null ? null : indexStats.getPrimaries().getSuggest().getCount());
|
||||||
|
|
||||||
table.endRow();
|
table.endRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -201,6 +201,10 @@ public class RestNodesAction extends AbstractCatAction {
|
||||||
table.addCell("segments.count", "alias:sc,segmentsCount;default:false;text-align:right;desc:number of segments");
|
table.addCell("segments.count", "alias:sc,segmentsCount;default:false;text-align:right;desc:number of segments");
|
||||||
table.addCell("segments.memory", "alias:sm,segmentsMemory;default:false;text-align:right;desc:memory used by segments");
|
table.addCell("segments.memory", "alias:sm,segmentsMemory;default:false;text-align:right;desc:memory used by segments");
|
||||||
|
|
||||||
|
table.addCell("suggest.current", "alias:suc,suggestCurrent;default:false;text-align:right;desc:number of current suggest ops");
|
||||||
|
table.addCell("suggest.time", "alias:suti,suggestTime;default:false;text-align:right;desc:time spend in suggest");
|
||||||
|
table.addCell("suggest.total", "alias:suto,suggestTotal;default:false;text-align:right;desc:number of suggest ops");
|
||||||
|
|
||||||
table.endHeaders();
|
table.endHeaders();
|
||||||
return table;
|
return table;
|
||||||
}
|
}
|
||||||
|
@ -299,6 +303,10 @@ public class RestNodesAction extends AbstractCatAction {
|
||||||
table.addCell(stats == null ? null : stats.getIndices().getSegments().getCount());
|
table.addCell(stats == null ? null : stats.getIndices().getSegments().getCount());
|
||||||
table.addCell(stats == null ? null : stats.getIndices().getSegments().getMemory());
|
table.addCell(stats == null ? null : stats.getIndices().getSegments().getMemory());
|
||||||
|
|
||||||
|
table.addCell(stats == null ? null : stats.getIndices().getSuggest().getCurrent());
|
||||||
|
table.addCell(stats == null ? null : stats.getIndices().getSuggest().getTime());
|
||||||
|
table.addCell(stats == null ? null : stats.getIndices().getSuggest().getCount());
|
||||||
|
|
||||||
table.endRow();
|
table.endRow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,145 @@
|
||||||
|
/*
|
||||||
|
* Licensed to Elasticsearch 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.suggest.stats;
|
||||||
|
|
||||||
|
import org.elasticsearch.action.admin.cluster.node.stats.NodeStats;
|
||||||
|
import org.elasticsearch.action.admin.cluster.node.stats.NodesStatsResponse;
|
||||||
|
import org.elasticsearch.action.admin.indices.stats.IndicesStatsResponse;
|
||||||
|
import org.elasticsearch.action.suggest.SuggestResponse;
|
||||||
|
import org.elasticsearch.cluster.ClusterState;
|
||||||
|
import org.elasticsearch.cluster.routing.GroupShardsIterator;
|
||||||
|
import org.elasticsearch.cluster.routing.ShardIterator;
|
||||||
|
import org.elasticsearch.cluster.routing.ShardRouting;
|
||||||
|
import org.elasticsearch.common.settings.ImmutableSettings;
|
||||||
|
import org.elasticsearch.test.ElasticsearchIntegrationTest;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_REPLICAS;
|
||||||
|
import static org.elasticsearch.cluster.metadata.IndexMetaData.SETTING_NUMBER_OF_SHARDS;
|
||||||
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
|
||||||
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAllSuccessful;
|
||||||
|
import static org.hamcrest.Matchers.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public class SuggestStatsTests extends ElasticsearchIntegrationTest {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int numberOfReplicas() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSimpleStats() throws Exception {
|
||||||
|
// clear all stats first
|
||||||
|
client().admin().indices().prepareStats().clear().execute().actionGet();
|
||||||
|
final int numNodes = cluster().dataNodes();
|
||||||
|
assertThat(numNodes, greaterThanOrEqualTo(2));
|
||||||
|
final int shardsIdx1 = randomIntBetween(1, 10); // we make sure each node gets at least a single shard...
|
||||||
|
final int shardsIdx2 = Math.max(numNodes - shardsIdx1, randomIntBetween(1, 10));
|
||||||
|
final int totalShards = shardsIdx1 + shardsIdx2;
|
||||||
|
assertThat(numNodes, lessThanOrEqualTo(totalShards));
|
||||||
|
assertAcked(prepareCreate("test1").setSettings(ImmutableSettings.builder()
|
||||||
|
.put(SETTING_NUMBER_OF_SHARDS, shardsIdx1)
|
||||||
|
.put(SETTING_NUMBER_OF_REPLICAS, 0)));
|
||||||
|
assertAcked(prepareCreate("test2").setSettings(ImmutableSettings.builder()
|
||||||
|
.put(SETTING_NUMBER_OF_SHARDS, shardsIdx2)
|
||||||
|
.put(SETTING_NUMBER_OF_REPLICAS, 0)));
|
||||||
|
assertThat(shardsIdx1+shardsIdx2, equalTo(numAssignedShards("test1", "test2")));
|
||||||
|
assertThat(numAssignedShards("test1", "test2"), greaterThanOrEqualTo(2));
|
||||||
|
ensureGreen();
|
||||||
|
int suggestAllIdx = scaledRandomIntBetween(20, 50);
|
||||||
|
int suggestIdx1 = scaledRandomIntBetween(20, 50);
|
||||||
|
int suggestIdx2 = scaledRandomIntBetween(20, 50);
|
||||||
|
|
||||||
|
long startTime = System.currentTimeMillis();
|
||||||
|
for (int i = 0; i < suggestAllIdx; i++) {
|
||||||
|
SuggestResponse suggestResponse = cluster().clientNodeClient().prepareSuggest().setSuggestText("test").get();
|
||||||
|
assertAllSuccessful(suggestResponse);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < suggestIdx1; i++) {
|
||||||
|
SuggestResponse suggestResponse = cluster().clientNodeClient().prepareSuggest("test1").setSuggestText("test").get();
|
||||||
|
assertAllSuccessful(suggestResponse);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < suggestIdx2; i++) {
|
||||||
|
SuggestResponse suggestResponse = cluster().clientNodeClient().prepareSuggest("test2").setSuggestText("test").get();
|
||||||
|
assertAllSuccessful(suggestResponse);
|
||||||
|
}
|
||||||
|
long endTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
IndicesStatsResponse indicesStats = client().admin().indices().prepareStats().execute().actionGet();
|
||||||
|
|
||||||
|
// check current
|
||||||
|
assertThat(indicesStats.getTotal().getSuggest().getCurrent(), equalTo(0l));
|
||||||
|
|
||||||
|
// check suggest count
|
||||||
|
assertThat(indicesStats.getTotal().getSuggest().getCount(), equalTo((long)(suggestAllIdx * totalShards + suggestIdx1 * shardsIdx1 + suggestIdx2 * shardsIdx2)));
|
||||||
|
assertThat(indicesStats.getIndices().get("test1").getTotal().getSuggest().getCount(), equalTo((long)((suggestAllIdx + suggestIdx1) * shardsIdx1)));
|
||||||
|
assertThat(indicesStats.getIndices().get("test2").getTotal().getSuggest().getCount(), equalTo((long)((suggestAllIdx + suggestIdx2) * shardsIdx2)));
|
||||||
|
|
||||||
|
// check suggest time
|
||||||
|
assertThat(indicesStats.getTotal().getSuggest().getTimeInMillis(), greaterThan(0l));
|
||||||
|
assertThat(indicesStats.getTotal().getSuggest().getTimeInMillis(), lessThanOrEqualTo(endTime - startTime));
|
||||||
|
|
||||||
|
NodesStatsResponse nodeStats = client().admin().cluster().prepareNodesStats().execute().actionGet();
|
||||||
|
NodeStats[] nodes = nodeStats.getNodes();
|
||||||
|
Set<String> nodeIdsWithIndex = nodeIdsWithIndex("test1", "test2");
|
||||||
|
int num = 0;
|
||||||
|
for (NodeStats stat : nodes) {
|
||||||
|
SuggestStats suggestStats = stat.getIndices().getSuggest();
|
||||||
|
if (nodeIdsWithIndex.contains(stat.getNode().getId())) {
|
||||||
|
assertThat(suggestStats.getCount(), greaterThan(0l));
|
||||||
|
assertThat(suggestStats.getTimeInMillis(), greaterThan(0l));
|
||||||
|
num++;
|
||||||
|
} else {
|
||||||
|
assertThat(suggestStats.getCount(), equalTo(0l));
|
||||||
|
assertThat(suggestStats.getTimeInMillis(), equalTo(0l));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
assertThat(num, greaterThan(0));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<String> nodeIdsWithIndex(String... indices) {
|
||||||
|
ClusterState state = client().admin().cluster().prepareState().execute().actionGet().getState();
|
||||||
|
GroupShardsIterator allAssignedShardsGrouped = state.routingTable().allAssignedShardsGrouped(indices, true);
|
||||||
|
Set<String> nodes = new HashSet<String>();
|
||||||
|
for (ShardIterator shardIterator : allAssignedShardsGrouped) {
|
||||||
|
for (ShardRouting routing : shardIterator.asUnordered()) {
|
||||||
|
if (routing.active()) {
|
||||||
|
nodes.add(routing.currentNodeId());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected int numAssignedShards(String... indices) {
|
||||||
|
ClusterState state = client().admin().cluster().prepareState().execute().actionGet().getState();
|
||||||
|
GroupShardsIterator allAssignedShardsGrouped = state.routingTable().allAssignedShardsGrouped(indices, true);
|
||||||
|
return allAssignedShardsGrouped.size();
|
||||||
|
}
|
||||||
|
}
|
|
@ -315,7 +315,7 @@ public class SimpleIndexStatsTests extends ElasticsearchIntegrationTest {
|
||||||
@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.Segments, Flag.Translog};
|
Flag.FilterCache, Flag.IdCache, Flag.FieldData, Flag.Docs, Flag.Warmer, Flag.Percolate, Flag.Completion, Flag.Segments, Flag.Translog, Flag.Suggest};
|
||||||
|
|
||||||
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++) {
|
||||||
|
@ -373,6 +373,9 @@ public class SimpleIndexStatsTests extends ElasticsearchIntegrationTest {
|
||||||
case Translog:
|
case Translog:
|
||||||
builder.setTranslog(set);
|
builder.setTranslog(set);
|
||||||
break;
|
break;
|
||||||
|
case Suggest:
|
||||||
|
builder.setSuggest(set);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fail("new flag? " + flag);
|
fail("new flag? " + flag);
|
||||||
break;
|
break;
|
||||||
|
@ -413,6 +416,8 @@ public class SimpleIndexStatsTests extends ElasticsearchIntegrationTest {
|
||||||
return response.getSegments() != null;
|
return response.getSegments() != null;
|
||||||
case Translog:
|
case Translog:
|
||||||
return response.getTranslog() != null;
|
return response.getTranslog() != null;
|
||||||
|
case Suggest:
|
||||||
|
return response.getSuggest() != null;
|
||||||
default:
|
default:
|
||||||
fail("new flag? " + flag);
|
fail("new flag? " + flag);
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue