Adds a size based ILM policy to automatically rollover ml stats indices. Backport of #53349
This commit is contained in:
parent
0fd0516d0d
commit
cc7751eb16
|
@ -10,6 +10,8 @@
|
||||||
"auto_expand_replicas" : "0-1",
|
"auto_expand_replicas" : "0-1",
|
||||||
"hidden": true
|
"hidden": true
|
||||||
}
|
}
|
||||||
|
${xpack.ml.index.lifecycle.settings}
|
||||||
},
|
},
|
||||||
"mappings" : ${xpack.ml.stats.mappings}
|
"mappings" : ${xpack.ml.stats.mappings},
|
||||||
|
"aliases" : {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,11 +56,12 @@ public class MlIndexTemplateRegistry extends IndexTemplateRegistry {
|
||||||
ROOT_RESOURCE_PATH + "inference_index_template.json", Version.CURRENT.id, VERSION_PATTERN,
|
ROOT_RESOURCE_PATH + "inference_index_template.json", Version.CURRENT.id, VERSION_PATTERN,
|
||||||
Collections.singletonMap(VERSION_ID_PATTERN, String.valueOf(Version.CURRENT.id)));
|
Collections.singletonMap(VERSION_ID_PATTERN, String.valueOf(Version.CURRENT.id)));
|
||||||
|
|
||||||
private static final IndexTemplateConfig STATS_TEMPLATE = statsTemplate();
|
private static final IndexTemplateConfig STATS_TEMPLATE = statsTemplate(true);
|
||||||
|
private static final IndexTemplateConfig STATS_TEMPLATE_NO_ILM = statsTemplate(false);
|
||||||
|
|
||||||
private static final String ML_STATE_ILM_POLICY_NAME = "ml-state-ilm-policy";
|
private static final String ML_SIZE_BASED_ILM_POLICY_NAME = "ml-size-based-ilm-policy";
|
||||||
private static final LifecyclePolicyConfig ML_STATE_ILM_POLICY =
|
private static final LifecyclePolicyConfig ML_SIZE_BASED_ILM_POLICY =
|
||||||
new LifecyclePolicyConfig(ML_STATE_ILM_POLICY_NAME, ANOMALY_DETECTION_PATH + "state_index_ilm_policy.json");
|
new LifecyclePolicyConfig(ML_SIZE_BASED_ILM_POLICY_NAME, ROOT_RESOURCE_PATH + "size_based_ilm_policy.json");
|
||||||
|
|
||||||
private static IndexTemplateConfig configTemplate() {
|
private static IndexTemplateConfig configTemplate() {
|
||||||
Map<String, String> variables = new HashMap<>();
|
Map<String, String> variables = new HashMap<>();
|
||||||
|
@ -81,7 +82,7 @@ public class MlIndexTemplateRegistry extends IndexTemplateRegistry {
|
||||||
variables.put(
|
variables.put(
|
||||||
"xpack.ml.index.lifecycle.settings",
|
"xpack.ml.index.lifecycle.settings",
|
||||||
ilmEnabled
|
ilmEnabled
|
||||||
? ",\"index.lifecycle.name\": \"" + ML_STATE_ILM_POLICY_NAME + "\"\n" +
|
? ",\"index.lifecycle.name\": \"" + ML_SIZE_BASED_ILM_POLICY_NAME + "\"\n" +
|
||||||
",\"index.lifecycle.rollover_alias\": \"" + AnomalyDetectorsIndex.jobStateIndexWriteAlias() + "\"\n"
|
",\"index.lifecycle.rollover_alias\": \"" + AnomalyDetectorsIndex.jobStateIndexWriteAlias() + "\"\n"
|
||||||
: "");
|
: "");
|
||||||
|
|
||||||
|
@ -102,10 +103,16 @@ public class MlIndexTemplateRegistry extends IndexTemplateRegistry {
|
||||||
variables);
|
variables);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IndexTemplateConfig statsTemplate() {
|
private static IndexTemplateConfig statsTemplate(boolean ilmEnabled) {
|
||||||
Map<String, String> variables = new HashMap<>();
|
Map<String, String> variables = new HashMap<>();
|
||||||
variables.put(VERSION_ID_PATTERN, String.valueOf(Version.CURRENT.id));
|
variables.put(VERSION_ID_PATTERN, String.valueOf(Version.CURRENT.id));
|
||||||
variables.put("xpack.ml.stats.mappings", MlStatsIndex.mapping());
|
variables.put("xpack.ml.stats.mappings", MlStatsIndex.mapping());
|
||||||
|
variables.put(
|
||||||
|
"xpack.ml.index.lifecycle.settings",
|
||||||
|
ilmEnabled
|
||||||
|
? ",\"index.lifecycle.name\": \"" + ML_SIZE_BASED_ILM_POLICY_NAME + "\"\n" +
|
||||||
|
",\"index.lifecycle.rollover_alias\": \"" + MlStatsIndex.writeAlias() + "\"\n"
|
||||||
|
: "");
|
||||||
|
|
||||||
return new IndexTemplateConfig(MlStatsIndex.TEMPLATE_NAME,
|
return new IndexTemplateConfig(MlStatsIndex.TEMPLATE_NAME,
|
||||||
ROOT_RESOURCE_PATH + "stats_index_template.json",
|
ROOT_RESOURCE_PATH + "stats_index_template.json",
|
||||||
|
@ -126,7 +133,7 @@ public class MlIndexTemplateRegistry extends IndexTemplateRegistry {
|
||||||
INFERENCE_TEMPLATE,
|
INFERENCE_TEMPLATE,
|
||||||
META_TEMPLATE,
|
META_TEMPLATE,
|
||||||
NOTIFICATIONS_TEMPLATE,
|
NOTIFICATIONS_TEMPLATE,
|
||||||
STATS_TEMPLATE);
|
ilmEnabled ? STATS_TEMPLATE : STATS_TEMPLATE_NO_ILM);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -141,7 +148,7 @@ public class MlIndexTemplateRegistry extends IndexTemplateRegistry {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<LifecyclePolicyConfig> getPolicyConfigs() {
|
protected List<LifecyclePolicyConfig> getPolicyConfigs() {
|
||||||
return Collections.singletonList(ML_STATE_ILM_POLICY);
|
return Collections.singletonList(ML_SIZE_BASED_ILM_POLICY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -29,6 +29,7 @@ import org.elasticsearch.threadpool.ThreadPool;
|
||||||
import org.elasticsearch.xpack.core.XPackSettings;
|
import org.elasticsearch.xpack.core.XPackSettings;
|
||||||
import org.elasticsearch.xpack.core.ilm.LifecycleAction;
|
import org.elasticsearch.xpack.core.ilm.LifecycleAction;
|
||||||
import org.elasticsearch.xpack.core.ilm.RolloverAction;
|
import org.elasticsearch.xpack.core.ilm.RolloverAction;
|
||||||
|
import org.elasticsearch.xpack.core.ml.MlStatsIndex;
|
||||||
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndexFields;
|
import org.elasticsearch.xpack.core.ml.job.persistence.AnomalyDetectorsIndexFields;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
|
@ -98,7 +99,7 @@ public class MlIndexTemplateRegistryTests extends ESTestCase {
|
||||||
.filter(r -> r.name().equals(AnomalyDetectorsIndexFields.STATE_INDEX_PREFIX))
|
.filter(r -> r.name().equals(AnomalyDetectorsIndexFields.STATE_INDEX_PREFIX))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
.orElseThrow(() -> new AssertionError("expected the ml state index template to be put"));
|
.orElseThrow(() -> new AssertionError("expected the ml state index template to be put"));
|
||||||
assertThat(req.settings().get("index.lifecycle.name"), equalTo("ml-state-ilm-policy"));
|
assertThat(req.settings().get("index.lifecycle.name"), equalTo("ml-size-based-ilm-policy"));
|
||||||
assertThat(req.settings().get("index.lifecycle.rollover_alias"), equalTo(".ml-state-write"));
|
assertThat(req.settings().get("index.lifecycle.rollover_alias"), equalTo(".ml-state-write"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,6 +123,46 @@ public class MlIndexTemplateRegistryTests extends ESTestCase {
|
||||||
assertThat(req.settings().get("index.lifecycle.rollover_alias"), is(nullValue()));
|
assertThat(req.settings().get("index.lifecycle.rollover_alias"), is(nullValue()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testStatsTemplateWithIlm() {
|
||||||
|
MlIndexTemplateRegistry registry =
|
||||||
|
new MlIndexTemplateRegistry(
|
||||||
|
Settings.builder()
|
||||||
|
.put(XPackSettings.INDEX_LIFECYCLE_ENABLED.getKey(), true)
|
||||||
|
.build(),
|
||||||
|
clusterService, threadPool, client, xContentRegistry);
|
||||||
|
|
||||||
|
registry.clusterChanged(createClusterChangedEvent(nodes));
|
||||||
|
|
||||||
|
verify(client.admin().indices(), times(7)).putTemplate(putIndexTemplateRequestCaptor.capture(), anyObject());
|
||||||
|
|
||||||
|
PutIndexTemplateRequest req = putIndexTemplateRequestCaptor.getAllValues().stream()
|
||||||
|
.filter(r -> r.name().equals(MlStatsIndex.TEMPLATE_NAME))
|
||||||
|
.findFirst()
|
||||||
|
.orElseThrow(() -> new AssertionError("expected the ml stats index template to be put"));
|
||||||
|
assertThat(req.settings().get("index.lifecycle.name"), equalTo("ml-size-based-ilm-policy"));
|
||||||
|
assertThat(req.settings().get("index.lifecycle.rollover_alias"), equalTo(".ml-stats-write"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testStatsTemplateWithNoIlm() {
|
||||||
|
MlIndexTemplateRegistry registry =
|
||||||
|
new MlIndexTemplateRegistry(
|
||||||
|
Settings.builder()
|
||||||
|
.put(XPackSettings.INDEX_LIFECYCLE_ENABLED.getKey(), false)
|
||||||
|
.build(),
|
||||||
|
clusterService, threadPool, client, xContentRegistry);
|
||||||
|
|
||||||
|
registry.clusterChanged(createClusterChangedEvent(nodes));
|
||||||
|
|
||||||
|
verify(client.admin().indices(), times(7)).putTemplate(putIndexTemplateRequestCaptor.capture(), anyObject());
|
||||||
|
|
||||||
|
PutIndexTemplateRequest req = putIndexTemplateRequestCaptor.getAllValues().stream()
|
||||||
|
.filter(r -> r.name().equals(MlStatsIndex.TEMPLATE_NAME))
|
||||||
|
.findFirst()
|
||||||
|
.orElseThrow(() -> new AssertionError("expected the ml stats index template to be put"));
|
||||||
|
assertThat(req.settings().get("index.lifecycle.name"), is(nullValue()));
|
||||||
|
assertThat(req.settings().get("index.lifecycle.rollover_alias"), is(nullValue()));
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static <Response> Answer<Response> withResponse(Response response) {
|
private static <Response> Answer<Response> withResponse(Response response) {
|
||||||
return invocationOnMock -> {
|
return invocationOnMock -> {
|
||||||
|
|
Loading…
Reference in New Issue