From 4f8e8ff8c5373b0d1eff6fc627f8b862e90d13d0 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Fri, 12 Jul 2019 16:59:17 +0200 Subject: [PATCH 1/3] Add usage stats for frozen indices --- docs/reference/rest-api/info.asciidoc | 4 ++ .../xpack/core/XPackClientPlugin.java | 5 +- .../elasticsearch/xpack/core/XPackField.java | 2 + .../elasticsearch/xpack/core/XPackPlugin.java | 3 + .../core/action/XPackUsageFeatureAction.java | 3 +- .../frozen/FrozenIndicesFeatureSetUsage.java | 65 +++++++++++++++++++ .../FrozenIndicesUsageTransportAction.java | 44 +++++++++++++ .../FrozenIndicesFeatureSetUsageTests.java | 48 ++++++++++++++ 8 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesFeatureSetUsage.java create mode 100644 x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesUsageTransportAction.java create mode 100644 x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesFeatureSetUsageTests.java diff --git a/docs/reference/rest-api/info.asciidoc b/docs/reference/rest-api/info.asciidoc index adbf5f01979a0..8246bbd9be83c 100644 --- a/docs/reference/rest-api/info.asciidoc +++ b/docs/reference/rest-api/info.asciidoc @@ -75,6 +75,10 @@ Example response: "available" : true, "enabled" : true }, + "frozen_indices" : { + "available" : true, + "enabled" : true + }, "graph" : { "available" : true, "enabled" : true diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackClientPlugin.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackClientPlugin.java index fec75af8f0f67..2cfd867aa38f5 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackClientPlugin.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackClientPlugin.java @@ -52,6 +52,7 @@ import org.elasticsearch.xpack.core.dataframe.transforms.TimeSyncConfig; import org.elasticsearch.xpack.core.deprecation.DeprecationInfoAction; import org.elasticsearch.xpack.core.flattened.FlattenedFeatureSetUsage; +import org.elasticsearch.xpack.core.frozen.FrozenIndicesFeatureSetUsage; import org.elasticsearch.xpack.core.graph.GraphFeatureSetUsage; import org.elasticsearch.xpack.core.graph.action.GraphExploreAction; import org.elasticsearch.xpack.core.indexlifecycle.AllocateAction; @@ -491,7 +492,9 @@ public List getNamedWriteables() { // Vectors new NamedWriteableRegistry.Entry(XPackFeatureSet.Usage.class, XPackField.VECTORS, VectorsFeatureSetUsage::new), // Voting Only Node - new NamedWriteableRegistry.Entry(XPackFeatureSet.Usage.class, XPackField.VOTING_ONLY, VotingOnlyNodeFeatureSetUsage::new) + new NamedWriteableRegistry.Entry(XPackFeatureSet.Usage.class, XPackField.VOTING_ONLY, VotingOnlyNodeFeatureSetUsage::new), + // Frozen indices + new NamedWriteableRegistry.Entry(XPackFeatureSet.Usage.class, XPackField.FROZEN_INDICES, FrozenIndicesFeatureSetUsage::new) ); } diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackField.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackField.java index 351606e321873..b3f6f2fbd3611 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackField.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackField.java @@ -43,6 +43,8 @@ public final class XPackField { public static final String VECTORS = "vectors"; /** Name constant for the voting-only-node feature. */ public static final String VOTING_ONLY = "voting_only"; + /** Name constant for the frozen index feature. */ + public static final String FROZEN_INDICES = "frozen_indices"; private XPackField() {} diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackPlugin.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackPlugin.java index a9d4e9f8b9bec..37fbb3334ec06 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackPlugin.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/XPackPlugin.java @@ -63,7 +63,9 @@ import org.elasticsearch.xpack.core.action.TransportXPackUsageAction; import org.elasticsearch.xpack.core.action.XPackInfoAction; import org.elasticsearch.xpack.core.action.XPackUsageAction; +import org.elasticsearch.xpack.core.action.XPackUsageFeatureAction; import org.elasticsearch.xpack.core.action.XPackUsageResponse; +import org.elasticsearch.xpack.core.frozen.FrozenIndicesUsageTransportAction; import org.elasticsearch.xpack.core.ml.MlMetadata; import org.elasticsearch.xpack.core.rest.action.RestFreezeIndexAction; import org.elasticsearch.xpack.core.rest.action.RestReloadAnalyzersAction; @@ -251,6 +253,7 @@ public Collection createComponents(Client client, ClusterService cluster actions.add(new ActionHandler<>(XPackUsageAction.INSTANCE, getUsageAction())); actions.add(new ActionHandler<>(TransportFreezeIndexAction.FreezeIndexAction.INSTANCE, TransportFreezeIndexAction.class)); + actions.add(new ActionHandler<>(XPackUsageFeatureAction.FROZEN_INDICES, FrozenIndicesUsageTransportAction.class)); actions.addAll(licensing.getActions()); actions.add(new ActionHandler<>(ReloadAnalyzerAction.INSTANCE, TransportReloadAnalyzersAction.class)); return actions; diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/XPackUsageFeatureAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/XPackUsageFeatureAction.java index 3c2c5b5b3e310..29f4f506c93b4 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/XPackUsageFeatureAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/action/XPackUsageFeatureAction.java @@ -36,10 +36,11 @@ public class XPackUsageFeatureAction extends StreamableResponseActionType ALL = Arrays.asList( SECURITY, MONITORING, WATCHER, GRAPH, MACHINE_LEARNING, LOGSTASH, SQL, ROLLUP, INDEX_LIFECYCLE, CCR, DATA_FRAME, FLATTENED, - VECTORS, VOTING_ONLY + VECTORS, VOTING_ONLY, FROZEN_INDICES ); private XPackUsageFeatureAction(String name) { diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesFeatureSetUsage.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesFeatureSetUsage.java new file mode 100644 index 0000000000000..cc556330497f3 --- /dev/null +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesFeatureSetUsage.java @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.core.frozen; + +import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.xpack.core.XPackFeatureSet; +import org.elasticsearch.xpack.core.XPackField; + +import java.io.IOException; +import java.util.Objects; + +public class FrozenIndicesFeatureSetUsage extends XPackFeatureSet.Usage { + + private final int numberOfFrozenIndices; + + public FrozenIndicesFeatureSetUsage(StreamInput input) throws IOException { + super(input); + numberOfFrozenIndices = input.readVInt(); + } + + @Override + public void writeTo(StreamOutput out) throws IOException { + super.writeTo(out); + out.writeVInt(numberOfFrozenIndices); + } + + public FrozenIndicesFeatureSetUsage(boolean available, boolean enabled, int numberOfFrozenIndices) { + super(XPackField.FROZEN_INDICES, available, enabled); + this.numberOfFrozenIndices = numberOfFrozenIndices; + } + + @Override + protected void innerXContent(XContentBuilder builder, Params params) throws IOException { + super.innerXContent(builder, params); + builder.field("indices_count", numberOfFrozenIndices); + } + + public int getNumberOfFrozenIndices() { + return numberOfFrozenIndices; + } + + @Override + public int hashCode() { + return Objects.hash(available, enabled, numberOfFrozenIndices); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + FrozenIndicesFeatureSetUsage other = (FrozenIndicesFeatureSetUsage) obj; + return Objects.equals(available, other.available) && + Objects.equals(enabled, other.enabled) && + Objects.equals(numberOfFrozenIndices, other.numberOfFrozenIndices); + } +} diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesUsageTransportAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesUsageTransportAction.java new file mode 100644 index 0000000000000..06be773f51fad --- /dev/null +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesUsageTransportAction.java @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.core.frozen; + +import org.elasticsearch.action.ActionListener; +import org.elasticsearch.action.support.ActionFilters; +import org.elasticsearch.cluster.ClusterState; +import org.elasticsearch.cluster.metadata.IndexMetaData; +import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; +import org.elasticsearch.cluster.service.ClusterService; +import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.index.engine.FrozenEngine; +import org.elasticsearch.protocol.xpack.XPackUsageRequest; +import org.elasticsearch.tasks.Task; +import org.elasticsearch.threadpool.ThreadPool; +import org.elasticsearch.transport.TransportService; +import org.elasticsearch.xpack.core.action.XPackUsageFeatureAction; +import org.elasticsearch.xpack.core.action.XPackUsageFeatureResponse; +import org.elasticsearch.xpack.core.action.XPackUsageFeatureTransportAction; + +public class FrozenIndicesUsageTransportAction extends XPackUsageFeatureTransportAction { + + @Inject + public FrozenIndicesUsageTransportAction(TransportService transportService, ClusterService clusterService, ThreadPool threadPool, + ActionFilters actionFilters, IndexNameExpressionResolver indexNameExpressionResolver) { + super(XPackUsageFeatureAction.FROZEN_INDICES.name(), transportService, clusterService, threadPool, actionFilters, + indexNameExpressionResolver); + } + + @Override + protected void masterOperation(Task task, XPackUsageRequest request, ClusterState state, + ActionListener listener) { + int numFrozenIndices = 0; + for (IndexMetaData indexMetaData : state.metaData()) { + if (FrozenEngine.INDEX_FROZEN.exists(indexMetaData.getSettings())) { + numFrozenIndices++; + } + } + listener.onResponse(new XPackUsageFeatureResponse(new FrozenIndicesFeatureSetUsage(true, true, numFrozenIndices))); + } +} diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesFeatureSetUsageTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesFeatureSetUsageTests.java new file mode 100644 index 0000000000000..34f7757fa2ff3 --- /dev/null +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesFeatureSetUsageTests.java @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +package org.elasticsearch.xpack.core.frozen; + +import org.elasticsearch.common.io.stream.Writeable; +import org.elasticsearch.test.AbstractWireSerializingTestCase; + +import java.io.IOException; + +public class FrozenIndicesFeatureSetUsageTests extends AbstractWireSerializingTestCase { + + @Override + protected FrozenIndicesFeatureSetUsage createTestInstance() { + boolean available = randomBoolean(); + boolean enabled = randomBoolean(); + return new FrozenIndicesFeatureSetUsage(available, enabled, randomIntBetween(0, 100000)); + } + + @Override + protected FrozenIndicesFeatureSetUsage mutateInstance(FrozenIndicesFeatureSetUsage instance) throws IOException { + boolean available = instance.available(); + boolean enabled = instance.enabled(); + int numFrozenIndices = instance.getNumberOfFrozenIndices(); + switch (between(0, 2)) { + case 0: + available = available == false; + break; + case 1: + enabled = enabled == false; + break; + case 2: + numFrozenIndices = randomValueOtherThan(numFrozenIndices, () -> randomIntBetween(0, 100000)); + break; + default: + throw new AssertionError("Illegal randomisation branch"); + } + return new FrozenIndicesFeatureSetUsage(available, enabled, numFrozenIndices); + } + + @Override + protected Writeable.Reader instanceReader() { + return FrozenIndicesFeatureSetUsage::new; + } + +} From ed526ba634744be83b7b091f2ae003a12b4782c0 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Mon, 15 Jul 2019 09:35:46 +0200 Subject: [PATCH 2/3] not exposed as sub-plugin --- docs/reference/rest-api/info.asciidoc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/reference/rest-api/info.asciidoc b/docs/reference/rest-api/info.asciidoc index 8246bbd9be83c..adbf5f01979a0 100644 --- a/docs/reference/rest-api/info.asciidoc +++ b/docs/reference/rest-api/info.asciidoc @@ -75,10 +75,6 @@ Example response: "available" : true, "enabled" : true }, - "frozen_indices" : { - "available" : true, - "enabled" : true - }, "graph" : { "available" : true, "enabled" : true From eb709347dfd63cda7beeb8c8355cd775fad40759 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Mon, 15 Jul 2019 10:29:02 +0200 Subject: [PATCH 3/3] Add test and fix condition --- .../FrozenIndicesUsageTransportAction.java | 2 +- .../test/indices.freeze/20_stats.yml | 2 +- .../test/indices.freeze/30_usage.yml | 60 +++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugin/src/test/resources/rest-api-spec/test/indices.freeze/30_usage.yml diff --git a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesUsageTransportAction.java b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesUsageTransportAction.java index 06be773f51fad..2b5677a559773 100644 --- a/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesUsageTransportAction.java +++ b/x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/frozen/FrozenIndicesUsageTransportAction.java @@ -35,7 +35,7 @@ protected void masterOperation(Task task, XPackUsageRequest request, ClusterStat ActionListener listener) { int numFrozenIndices = 0; for (IndexMetaData indexMetaData : state.metaData()) { - if (FrozenEngine.INDEX_FROZEN.exists(indexMetaData.getSettings())) { + if (FrozenEngine.INDEX_FROZEN.get(indexMetaData.getSettings())) { numFrozenIndices++; } } diff --git a/x-pack/plugin/src/test/resources/rest-api-spec/test/indices.freeze/20_stats.yml b/x-pack/plugin/src/test/resources/rest-api-spec/test/indices.freeze/20_stats.yml index fd6163761dcb9..1962fa232c8e9 100644 --- a/x-pack/plugin/src/test/resources/rest-api-spec/test/indices.freeze/20_stats.yml +++ b/x-pack/plugin/src/test/resources/rest-api-spec/test/indices.freeze/20_stats.yml @@ -51,7 +51,7 @@ setup: # unfreeze index - do: - indices.freeze: + indices.unfreeze: index: test - is_true: acknowledged diff --git a/x-pack/plugin/src/test/resources/rest-api-spec/test/indices.freeze/30_usage.yml b/x-pack/plugin/src/test/resources/rest-api-spec/test/indices.freeze/30_usage.yml new file mode 100644 index 0000000000000..9135c19f6794a --- /dev/null +++ b/x-pack/plugin/src/test/resources/rest-api-spec/test/indices.freeze/30_usage.yml @@ -0,0 +1,60 @@ +--- +setup: + - do: + indices.create: + index: test + - do: + cluster.health: + wait_for_no_initializing_shards: true + +--- +"Usage stats on frozen indices": + - skip: + version: " - 7.9.99" + reason: "frozen indices have usage stats starting in version 8.0.0" + + - do: + index: + index: test + id: 1 + body: { "foo": "bar" } + + - do: + index: + index: test + id: 2 + body: { "foo": "bar" } + + - do: + index: + index: test + id: 3 + body: { "foo": "bar" } + + - do: {xpack.usage: {}} + - match: { frozen_indices.available: true } + - match: { frozen_indices.enabled: true } + - match: { frozen_indices.indices_count: 0 } + + # freeze index + - do: + indices.freeze: + index: test + - is_true: acknowledged + + + - do: {xpack.usage: {}} + - match: { frozen_indices.available: true } + - match: { frozen_indices.enabled: true } + - match: { frozen_indices.indices_count: 1 } + + # unfreeze index + - do: + indices.unfreeze: + index: test + - is_true: acknowledged + + - do: {xpack.usage: {}} + - match: { frozen_indices.available: true } + - match: { frozen_indices.enabled: true } + - match: { frozen_indices.indices_count: 0 }