[ML][TEST] Improve RevertModelSnapshotIT (elastic/x-pack-elasticsearch#2954)
X-Pack side testing of elastic/machine-learning-cpp#390 Original commit: elastic/x-pack-elasticsearch@64e8ca85eb
This commit is contained in:
parent
1e30b12f97
commit
e00b4bd197
|
@ -7,6 +7,8 @@ package org.elasticsearch.xpack.ml.integration;
|
||||||
|
|
||||||
import org.elasticsearch.action.search.SearchResponse;
|
import org.elasticsearch.action.search.SearchResponse;
|
||||||
import org.elasticsearch.common.unit.TimeValue;
|
import org.elasticsearch.common.unit.TimeValue;
|
||||||
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
import org.elasticsearch.common.xcontent.json.JsonXContent;
|
||||||
import org.elasticsearch.index.query.QueryBuilders;
|
import org.elasticsearch.index.query.QueryBuilders;
|
||||||
import org.elasticsearch.rest.RestStatus;
|
import org.elasticsearch.rest.RestStatus;
|
||||||
import org.elasticsearch.search.SearchHits;
|
import org.elasticsearch.search.SearchHits;
|
||||||
|
@ -17,6 +19,7 @@ import org.elasticsearch.xpack.ml.job.config.Job;
|
||||||
import org.elasticsearch.xpack.ml.job.process.autodetect.state.ModelSizeStats;
|
import org.elasticsearch.xpack.ml.job.process.autodetect.state.ModelSizeStats;
|
||||||
import org.elasticsearch.xpack.ml.job.process.autodetect.state.ModelSnapshot;
|
import org.elasticsearch.xpack.ml.job.process.autodetect.state.ModelSnapshot;
|
||||||
import org.elasticsearch.xpack.ml.job.process.autodetect.state.Quantiles;
|
import org.elasticsearch.xpack.ml.job.process.autodetect.state.Quantiles;
|
||||||
|
import org.elasticsearch.xpack.ml.job.results.Bucket;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -31,6 +34,7 @@ import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.equalTo;
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.greaterThan;
|
import static org.hamcrest.Matchers.greaterThan;
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.not;
|
import static org.hamcrest.Matchers.not;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -49,14 +53,19 @@ public class RevertModelSnapshotIT extends MlNativeAutodetectIntegTestCase {
|
||||||
TimeValue bucketSpan = TimeValue.timeValueHours(1);
|
TimeValue bucketSpan = TimeValue.timeValueHours(1);
|
||||||
long startTime = 1491004800000L;
|
long startTime = 1491004800000L;
|
||||||
|
|
||||||
Job.Builder job = buildAndRegisterJob("revert-model-snapshot-split-it-job", bucketSpan);
|
Job.Builder job = buildAndRegisterJob("revert-model-snapshot-it-job", bucketSpan);
|
||||||
openJob(job.getId());
|
openJob(job.getId());
|
||||||
postData(job.getId(), generateData(startTime, bucketSpan, 10, Arrays.asList("foo"),
|
postData(job.getId(), generateData(startTime, bucketSpan, 10, Arrays.asList("foo"),
|
||||||
(bucketIndex, series) -> bucketIndex == 5 ? 100.0 : 10.0).stream().collect(Collectors.joining()));
|
(bucketIndex, series) -> bucketIndex == 5 ? 100.0 : 10.0).stream().collect(Collectors.joining()));
|
||||||
|
flushJob(job.getId(), true);
|
||||||
closeJob(job.getId());
|
closeJob(job.getId());
|
||||||
|
|
||||||
ModelSizeStats modelSizeStats1 = getJobStats(job.getId()).get(0).getModelSizeStats();
|
ModelSizeStats modelSizeStats1 = getJobStats(job.getId()).get(0).getModelSizeStats();
|
||||||
String quantiles1 = getQuantiles(job.getId());
|
Quantiles quantiles1 = getQuantiles(job.getId());
|
||||||
|
|
||||||
|
List<Bucket> midwayBuckets = getBuckets(job.getId());
|
||||||
|
Bucket revertPointBucket = midwayBuckets.get(midwayBuckets.size() - 1);
|
||||||
|
assertThat(revertPointBucket.isInterim(), is(true));
|
||||||
|
|
||||||
// We need to wait a second to ensure the second time around model snapshot will have a different ID (it depends on epoch seconds)
|
// We need to wait a second to ensure the second time around model snapshot will have a different ID (it depends on epoch seconds)
|
||||||
awaitBusy(() -> false, 1, TimeUnit.SECONDS);
|
awaitBusy(() -> false, 1, TimeUnit.SECONDS);
|
||||||
|
@ -67,7 +76,7 @@ public class RevertModelSnapshotIT extends MlNativeAutodetectIntegTestCase {
|
||||||
closeJob(job.getId());
|
closeJob(job.getId());
|
||||||
|
|
||||||
ModelSizeStats modelSizeStats2 = getJobStats(job.getId()).get(0).getModelSizeStats();
|
ModelSizeStats modelSizeStats2 = getJobStats(job.getId()).get(0).getModelSizeStats();
|
||||||
String quantiles2 = getQuantiles(job.getId());
|
Quantiles quantiles2 = getQuantiles(job.getId());
|
||||||
|
|
||||||
// Check model has grown since a new series was introduced
|
// Check model has grown since a new series was introduced
|
||||||
assertThat(modelSizeStats2.getModelBytes(), greaterThan(modelSizeStats1.getModelBytes()));
|
assertThat(modelSizeStats2.getModelBytes(), greaterThan(modelSizeStats1.getModelBytes()));
|
||||||
|
@ -75,6 +84,10 @@ public class RevertModelSnapshotIT extends MlNativeAutodetectIntegTestCase {
|
||||||
// Check quantiles have changed
|
// Check quantiles have changed
|
||||||
assertThat(quantiles2, not(equalTo(quantiles1)));
|
assertThat(quantiles2, not(equalTo(quantiles1)));
|
||||||
|
|
||||||
|
List<Bucket> finalPreRevertBuckets = getBuckets(job.getId());
|
||||||
|
Bucket finalPreRevertPointBucket = finalPreRevertBuckets.get(midwayBuckets.size() - 1);
|
||||||
|
assertThat(finalPreRevertPointBucket.isInterim(), is(false));
|
||||||
|
|
||||||
List<ModelSnapshot> modelSnapshots = getModelSnapshots(job.getId());
|
List<ModelSnapshot> modelSnapshots = getModelSnapshots(job.getId());
|
||||||
assertThat(modelSnapshots.size(), equalTo(2));
|
assertThat(modelSnapshots.size(), equalTo(2));
|
||||||
|
|
||||||
|
@ -89,7 +102,19 @@ public class RevertModelSnapshotIT extends MlNativeAutodetectIntegTestCase {
|
||||||
assertThat(getJobStats(job.getId()).get(0).getModelSizeStats().getModelBytes(), equalTo(modelSizeStats1.getModelBytes()));
|
assertThat(getJobStats(job.getId()).get(0).getModelSizeStats().getModelBytes(), equalTo(modelSizeStats1.getModelBytes()));
|
||||||
|
|
||||||
// Check quantiles have been reverted
|
// Check quantiles have been reverted
|
||||||
assertThat(getQuantiles(job.getId()), equalTo(quantiles1));
|
assertThat(getQuantiles(job.getId()).getTimestamp(), equalTo(revertSnapshot.getLatestResultTimeStamp()));
|
||||||
|
|
||||||
|
// Re-run 2nd half of data
|
||||||
|
openJob(job.getId());
|
||||||
|
postData(job.getId(), generateData(startTime + 10 * bucketSpan.getMillis(), bucketSpan, 10, Arrays.asList("foo", "bar"),
|
||||||
|
(bucketIndex, series) -> 10.0).stream().collect(Collectors.joining()));
|
||||||
|
closeJob(job.getId());
|
||||||
|
|
||||||
|
List<Bucket> finalPostRevertBuckets = getBuckets(job.getId());
|
||||||
|
Bucket finalPostRevertPointBucket = finalPostRevertBuckets.get(midwayBuckets.size() - 1);
|
||||||
|
assertThat(finalPostRevertPointBucket.getTimestamp(), equalTo(finalPreRevertPointBucket.getTimestamp()));
|
||||||
|
assertThat(finalPostRevertPointBucket.getAnomalyScore(), equalTo(finalPreRevertPointBucket.getAnomalyScore()));
|
||||||
|
assertThat(finalPostRevertPointBucket.getEventCount(), equalTo(finalPreRevertPointBucket.getEventCount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Job.Builder buildAndRegisterJob(String jobId, TimeValue bucketSpan) throws Exception {
|
private Job.Builder buildAndRegisterJob(String jobId, TimeValue bucketSpan) throws Exception {
|
||||||
|
@ -117,19 +142,30 @@ public class RevertModelSnapshotIT extends MlNativeAutodetectIntegTestCase {
|
||||||
record.put("value", timeAndSeriesToValueFunction.apply(i, field));
|
record.put("value", timeAndSeriesToValueFunction.apply(i, field));
|
||||||
record.put("series", field);
|
record.put("series", field);
|
||||||
data.add(createJsonRecord(record));
|
data.add(createJsonRecord(record));
|
||||||
|
|
||||||
|
record = new HashMap<>();
|
||||||
|
record.put("time", now + bucketSpan.getMillis() / 2);
|
||||||
|
record.put("value", timeAndSeriesToValueFunction.apply(i, field));
|
||||||
|
record.put("series", field);
|
||||||
|
data.add(createJsonRecord(record));
|
||||||
}
|
}
|
||||||
now += bucketSpan.getMillis();
|
now += bucketSpan.getMillis();
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getQuantiles(String jobId) {
|
private Quantiles getQuantiles(String jobId) {
|
||||||
SearchResponse response = client().prepareSearch(".ml-state")
|
SearchResponse response = client().prepareSearch(".ml-state")
|
||||||
.setQuery(QueryBuilders.idsQuery().addIds(Quantiles.documentId(jobId)))
|
.setQuery(QueryBuilders.idsQuery().addIds(Quantiles.documentId(jobId)))
|
||||||
.setSize(1)
|
.setSize(1)
|
||||||
.get();
|
.get();
|
||||||
SearchHits hits = response.getHits();
|
SearchHits hits = response.getHits();
|
||||||
assertThat(hits.getTotalHits(), equalTo(1L));
|
assertThat(hits.getTotalHits(), equalTo(1L));
|
||||||
return hits.getAt(0).getSourceAsString();
|
try {
|
||||||
|
XContentParser parser = JsonXContent.jsonXContent.createParser(null, hits.getAt(0).getSourceAsString());
|
||||||
|
return Quantiles.PARSER.apply(parser, null);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue