Removes two unused AnalysisConfig options (#35645)

* ML: Removing result_finalization_window && overlapping_buckets

* Reverting bad method deletions

* Setting to current before backport to try and get a green build

* fixing testBuildAutodetectCommand test

* disabling bwc tests for backport
This commit is contained in:
Benjamin Trent 2018-11-19 08:29:53 -06:00 committed by GitHub
parent 450db7fcf7
commit 6d4a3f8fce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 56 additions and 283 deletions

View File

@ -60,8 +60,6 @@ public class AnalysisConfig implements ToXContentObject {
public static final ParseField SUMMARY_COUNT_FIELD_NAME = new ParseField("summary_count_field_name"); public static final ParseField SUMMARY_COUNT_FIELD_NAME = new ParseField("summary_count_field_name");
public static final ParseField DETECTORS = new ParseField("detectors"); public static final ParseField DETECTORS = new ParseField("detectors");
public static final ParseField INFLUENCERS = new ParseField("influencers"); public static final ParseField INFLUENCERS = new ParseField("influencers");
public static final ParseField OVERLAPPING_BUCKETS = new ParseField("overlapping_buckets");
public static final ParseField RESULT_FINALIZATION_WINDOW = new ParseField("result_finalization_window");
public static final ParseField MULTIVARIATE_BY_FIELDS = new ParseField("multivariate_by_fields"); public static final ParseField MULTIVARIATE_BY_FIELDS = new ParseField("multivariate_by_fields");
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -84,8 +82,6 @@ public class AnalysisConfig implements ToXContentObject {
builder.setLatency(TimeValue.parseTimeValue(val, LATENCY.getPreferredName())), LATENCY); builder.setLatency(TimeValue.parseTimeValue(val, LATENCY.getPreferredName())), LATENCY);
PARSER.declareString(Builder::setSummaryCountFieldName, SUMMARY_COUNT_FIELD_NAME); PARSER.declareString(Builder::setSummaryCountFieldName, SUMMARY_COUNT_FIELD_NAME);
PARSER.declareStringArray(Builder::setInfluencers, INFLUENCERS); PARSER.declareStringArray(Builder::setInfluencers, INFLUENCERS);
PARSER.declareBoolean(Builder::setOverlappingBuckets, OVERLAPPING_BUCKETS);
PARSER.declareLong(Builder::setResultFinalizationWindow, RESULT_FINALIZATION_WINDOW);
PARSER.declareBoolean(Builder::setMultivariateByFields, MULTIVARIATE_BY_FIELDS); PARSER.declareBoolean(Builder::setMultivariateByFields, MULTIVARIATE_BY_FIELDS);
} }
@ -100,14 +96,11 @@ public class AnalysisConfig implements ToXContentObject {
private final String summaryCountFieldName; private final String summaryCountFieldName;
private final List<Detector> detectors; private final List<Detector> detectors;
private final List<String> influencers; private final List<String> influencers;
private final Boolean overlappingBuckets;
private final Long resultFinalizationWindow;
private final Boolean multivariateByFields; private final Boolean multivariateByFields;
private AnalysisConfig(TimeValue bucketSpan, String categorizationFieldName, List<String> categorizationFilters, private AnalysisConfig(TimeValue bucketSpan, String categorizationFieldName, List<String> categorizationFilters,
CategorizationAnalyzerConfig categorizationAnalyzerConfig, TimeValue latency, String summaryCountFieldName, CategorizationAnalyzerConfig categorizationAnalyzerConfig, TimeValue latency, String summaryCountFieldName,
List<Detector> detectors, List<String> influencers, Boolean overlappingBuckets, Long resultFinalizationWindow, List<Detector> detectors, List<String> influencers, Boolean multivariateByFields) {
Boolean multivariateByFields) {
this.detectors = Collections.unmodifiableList(detectors); this.detectors = Collections.unmodifiableList(detectors);
this.bucketSpan = bucketSpan; this.bucketSpan = bucketSpan;
this.latency = latency; this.latency = latency;
@ -116,8 +109,6 @@ public class AnalysisConfig implements ToXContentObject {
this.categorizationFilters = categorizationFilters == null ? null : Collections.unmodifiableList(categorizationFilters); this.categorizationFilters = categorizationFilters == null ? null : Collections.unmodifiableList(categorizationFilters);
this.summaryCountFieldName = summaryCountFieldName; this.summaryCountFieldName = summaryCountFieldName;
this.influencers = Collections.unmodifiableList(influencers); this.influencers = Collections.unmodifiableList(influencers);
this.overlappingBuckets = overlappingBuckets;
this.resultFinalizationWindow = resultFinalizationWindow;
this.multivariateByFields = multivariateByFields; this.multivariateByFields = multivariateByFields;
} }
@ -177,14 +168,6 @@ public class AnalysisConfig implements ToXContentObject {
return influencers; return influencers;
} }
public Boolean getOverlappingBuckets() {
return overlappingBuckets;
}
public Long getResultFinalizationWindow() {
return resultFinalizationWindow;
}
public Boolean getMultivariateByFields() { public Boolean getMultivariateByFields() {
return multivariateByFields; return multivariateByFields;
} }
@ -255,12 +238,6 @@ public class AnalysisConfig implements ToXContentObject {
} }
builder.endArray(); builder.endArray();
builder.field(INFLUENCERS.getPreferredName(), influencers); builder.field(INFLUENCERS.getPreferredName(), influencers);
if (overlappingBuckets != null) {
builder.field(OVERLAPPING_BUCKETS.getPreferredName(), overlappingBuckets);
}
if (resultFinalizationWindow != null) {
builder.field(RESULT_FINALIZATION_WINDOW.getPreferredName(), resultFinalizationWindow);
}
if (multivariateByFields != null) { if (multivariateByFields != null) {
builder.field(MULTIVARIATE_BY_FIELDS.getPreferredName(), multivariateByFields); builder.field(MULTIVARIATE_BY_FIELDS.getPreferredName(), multivariateByFields);
} }
@ -287,8 +264,6 @@ public class AnalysisConfig implements ToXContentObject {
Objects.equals(summaryCountFieldName, that.summaryCountFieldName) && Objects.equals(summaryCountFieldName, that.summaryCountFieldName) &&
Objects.equals(detectors, that.detectors) && Objects.equals(detectors, that.detectors) &&
Objects.equals(influencers, that.influencers) && Objects.equals(influencers, that.influencers) &&
Objects.equals(overlappingBuckets, that.overlappingBuckets) &&
Objects.equals(resultFinalizationWindow, that.resultFinalizationWindow) &&
Objects.equals(multivariateByFields, that.multivariateByFields); Objects.equals(multivariateByFields, that.multivariateByFields);
} }
@ -296,8 +271,7 @@ public class AnalysisConfig implements ToXContentObject {
public int hashCode() { public int hashCode() {
return Objects.hash( return Objects.hash(
bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig, latency, bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig, latency,
summaryCountFieldName, detectors, influencers, overlappingBuckets, resultFinalizationWindow, summaryCountFieldName, detectors, influencers, multivariateByFields);
multivariateByFields);
} }
public static Builder builder(List<Detector> detectors) { public static Builder builder(List<Detector> detectors) {
@ -314,8 +288,6 @@ public class AnalysisConfig implements ToXContentObject {
private CategorizationAnalyzerConfig categorizationAnalyzerConfig; private CategorizationAnalyzerConfig categorizationAnalyzerConfig;
private String summaryCountFieldName; private String summaryCountFieldName;
private List<String> influencers = new ArrayList<>(); private List<String> influencers = new ArrayList<>();
private Boolean overlappingBuckets;
private Long resultFinalizationWindow;
private Boolean multivariateByFields; private Boolean multivariateByFields;
public Builder(List<Detector> detectors) { public Builder(List<Detector> detectors) {
@ -332,8 +304,6 @@ public class AnalysisConfig implements ToXContentObject {
this.categorizationAnalyzerConfig = analysisConfig.categorizationAnalyzerConfig; this.categorizationAnalyzerConfig = analysisConfig.categorizationAnalyzerConfig;
this.summaryCountFieldName = analysisConfig.summaryCountFieldName; this.summaryCountFieldName = analysisConfig.summaryCountFieldName;
this.influencers = new ArrayList<>(analysisConfig.influencers); this.influencers = new ArrayList<>(analysisConfig.influencers);
this.overlappingBuckets = analysisConfig.overlappingBuckets;
this.resultFinalizationWindow = analysisConfig.resultFinalizationWindow;
this.multivariateByFields = analysisConfig.multivariateByFields; this.multivariateByFields = analysisConfig.multivariateByFields;
} }
@ -391,16 +361,6 @@ public class AnalysisConfig implements ToXContentObject {
return this; return this;
} }
public Builder setOverlappingBuckets(Boolean overlappingBuckets) {
this.overlappingBuckets = overlappingBuckets;
return this;
}
public Builder setResultFinalizationWindow(Long resultFinalizationWindow) {
this.resultFinalizationWindow = resultFinalizationWindow;
return this;
}
public Builder setMultivariateByFields(Boolean multivariateByFields) { public Builder setMultivariateByFields(Boolean multivariateByFields) {
this.multivariateByFields = multivariateByFields; this.multivariateByFields = multivariateByFields;
return this; return this;
@ -409,8 +369,7 @@ public class AnalysisConfig implements ToXContentObject {
public AnalysisConfig build() { public AnalysisConfig build() {
return new AnalysisConfig(bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig, return new AnalysisConfig(bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig,
latency, summaryCountFieldName, detectors, influencers, overlappingBuckets, latency, summaryCountFieldName, detectors, influencers, multivariateByFields);
resultFinalizationWindow, multivariateByFields);
} }
} }
} }

View File

@ -89,12 +89,6 @@ public class AnalysisConfigTests extends AbstractXContentTestCase<AnalysisConfig
if (randomBoolean()) { if (randomBoolean()) {
builder.setMultivariateByFields(randomBoolean()); builder.setMultivariateByFields(randomBoolean());
} }
if (randomBoolean()) {
builder.setOverlappingBuckets(randomBoolean());
}
if (randomBoolean()) {
builder.setResultFinalizationWindow(randomNonNegativeLong());
}
builder.setInfluencers(Arrays.asList(generateRandomStringArray(10, 10, false))); builder.setInfluencers(Arrays.asList(generateRandomStringArray(10, 10, false)));
return builder; return builder;

View File

@ -61,15 +61,11 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
private static final ParseField SUMMARY_COUNT_FIELD_NAME = new ParseField("summary_count_field_name"); private static final ParseField SUMMARY_COUNT_FIELD_NAME = new ParseField("summary_count_field_name");
private static final ParseField DETECTORS = new ParseField("detectors"); private static final ParseField DETECTORS = new ParseField("detectors");
private static final ParseField INFLUENCERS = new ParseField("influencers"); private static final ParseField INFLUENCERS = new ParseField("influencers");
private static final ParseField OVERLAPPING_BUCKETS = new ParseField("overlapping_buckets");
private static final ParseField RESULT_FINALIZATION_WINDOW = new ParseField("result_finalization_window");
private static final ParseField MULTIVARIATE_BY_FIELDS = new ParseField("multivariate_by_fields"); private static final ParseField MULTIVARIATE_BY_FIELDS = new ParseField("multivariate_by_fields");
public static final String ML_CATEGORY_FIELD = "mlcategory"; public static final String ML_CATEGORY_FIELD = "mlcategory";
public static final Set<String> AUTO_CREATED_FIELDS = new HashSet<>(Collections.singletonList(ML_CATEGORY_FIELD)); public static final Set<String> AUTO_CREATED_FIELDS = new HashSet<>(Collections.singletonList(ML_CATEGORY_FIELD));
public static final long DEFAULT_RESULT_FINALIZATION_WINDOW = 2L;
// These parsers follow the pattern that metadata is parsed leniently (to allow for enhancements), whilst config is parsed strictly // These parsers follow the pattern that metadata is parsed leniently (to allow for enhancements), whilst config is parsed strictly
public static final ConstructingObjectParser<AnalysisConfig.Builder, Void> LENIENT_PARSER = createParser(true); public static final ConstructingObjectParser<AnalysisConfig.Builder, Void> LENIENT_PARSER = createParser(true);
public static final ConstructingObjectParser<AnalysisConfig.Builder, Void> STRICT_PARSER = createParser(false); public static final ConstructingObjectParser<AnalysisConfig.Builder, Void> STRICT_PARSER = createParser(false);
@ -94,8 +90,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
builder.setLatency(TimeValue.parseTimeValue(val, LATENCY.getPreferredName())), LATENCY); builder.setLatency(TimeValue.parseTimeValue(val, LATENCY.getPreferredName())), LATENCY);
parser.declareString(Builder::setSummaryCountFieldName, SUMMARY_COUNT_FIELD_NAME); parser.declareString(Builder::setSummaryCountFieldName, SUMMARY_COUNT_FIELD_NAME);
parser.declareStringArray(Builder::setInfluencers, INFLUENCERS); parser.declareStringArray(Builder::setInfluencers, INFLUENCERS);
parser.declareBoolean(Builder::setOverlappingBuckets, OVERLAPPING_BUCKETS);
parser.declareLong(Builder::setResultFinalizationWindow, RESULT_FINALIZATION_WINDOW);
parser.declareBoolean(Builder::setMultivariateByFields, MULTIVARIATE_BY_FIELDS); parser.declareBoolean(Builder::setMultivariateByFields, MULTIVARIATE_BY_FIELDS);
return parser; return parser;
@ -112,14 +106,11 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
private final String summaryCountFieldName; private final String summaryCountFieldName;
private final List<Detector> detectors; private final List<Detector> detectors;
private final List<String> influencers; private final List<String> influencers;
private final Boolean overlappingBuckets;
private final Long resultFinalizationWindow;
private final Boolean multivariateByFields; private final Boolean multivariateByFields;
private AnalysisConfig(TimeValue bucketSpan, String categorizationFieldName, List<String> categorizationFilters, private AnalysisConfig(TimeValue bucketSpan, String categorizationFieldName, List<String> categorizationFilters,
CategorizationAnalyzerConfig categorizationAnalyzerConfig, TimeValue latency, String summaryCountFieldName, CategorizationAnalyzerConfig categorizationAnalyzerConfig, TimeValue latency, String summaryCountFieldName,
List<Detector> detectors, List<String> influencers, Boolean overlappingBuckets, Long resultFinalizationWindow, List<Detector> detectors, List<String> influencers, Boolean multivariateByFields) {
Boolean multivariateByFields) {
this.detectors = detectors; this.detectors = detectors;
this.bucketSpan = bucketSpan; this.bucketSpan = bucketSpan;
this.latency = latency; this.latency = latency;
@ -128,8 +119,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
this.categorizationFilters = categorizationFilters == null ? null : Collections.unmodifiableList(categorizationFilters); this.categorizationFilters = categorizationFilters == null ? null : Collections.unmodifiableList(categorizationFilters);
this.summaryCountFieldName = summaryCountFieldName; this.summaryCountFieldName = summaryCountFieldName;
this.influencers = Collections.unmodifiableList(influencers); this.influencers = Collections.unmodifiableList(influencers);
this.overlappingBuckets = overlappingBuckets;
this.resultFinalizationWindow = resultFinalizationWindow;
this.multivariateByFields = multivariateByFields; this.multivariateByFields = multivariateByFields;
} }
@ -146,8 +135,13 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
summaryCountFieldName = in.readOptionalString(); summaryCountFieldName = in.readOptionalString();
detectors = Collections.unmodifiableList(in.readList(Detector::new)); detectors = Collections.unmodifiableList(in.readList(Detector::new));
influencers = Collections.unmodifiableList(in.readList(StreamInput::readString)); influencers = Collections.unmodifiableList(in.readList(StreamInput::readString));
overlappingBuckets = in.readOptionalBoolean();
resultFinalizationWindow = in.readOptionalLong(); // BWC for result_finalization_window and overlapping_buckets
// TODO Remove in 7.0.0
if (in.getVersion().before(Version.CURRENT)) {//setting to current before backport
in.readOptionalBoolean();
in.readOptionalLong();
}
multivariateByFields = in.readOptionalBoolean(); multivariateByFields = in.readOptionalBoolean();
// BWC for removed multiple_bucket_spans // BWC for removed multiple_bucket_spans
@ -185,8 +179,13 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
out.writeOptionalString(summaryCountFieldName); out.writeOptionalString(summaryCountFieldName);
out.writeList(detectors); out.writeList(detectors);
out.writeStringList(influencers); out.writeStringList(influencers);
out.writeOptionalBoolean(overlappingBuckets);
out.writeOptionalLong(resultFinalizationWindow); // BWC for result_finalization_window and overlapping_buckets
// TODO Remove in 7.0.0
if (out.getVersion().before(Version.CURRENT)) { //setting to current before backport
out.writeOptionalBoolean(null);
out.writeOptionalLong(null);
}
out.writeOptionalBoolean(multivariateByFields); out.writeOptionalBoolean(multivariateByFields);
// BWC for removed multiple_bucket_spans // BWC for removed multiple_bucket_spans
@ -291,14 +290,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
.flatMap(Set::stream).collect(Collectors.toSet()); .flatMap(Set::stream).collect(Collectors.toSet());
} }
public Boolean getOverlappingBuckets() {
return overlappingBuckets;
}
public Long getResultFinalizationWindow() {
return resultFinalizationWindow;
}
public Boolean getMultivariateByFields() { public Boolean getMultivariateByFields() {
return multivariateByFields; return multivariateByFields;
} }
@ -394,12 +385,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
} }
builder.endArray(); builder.endArray();
builder.field(INFLUENCERS.getPreferredName(), influencers); builder.field(INFLUENCERS.getPreferredName(), influencers);
if (overlappingBuckets != null) {
builder.field(OVERLAPPING_BUCKETS.getPreferredName(), overlappingBuckets);
}
if (resultFinalizationWindow != null) {
builder.field(RESULT_FINALIZATION_WINDOW.getPreferredName(), resultFinalizationWindow);
}
if (multivariateByFields != null) { if (multivariateByFields != null) {
builder.field(MULTIVARIATE_BY_FIELDS.getPreferredName(), multivariateByFields); builder.field(MULTIVARIATE_BY_FIELDS.getPreferredName(), multivariateByFields);
} }
@ -420,8 +405,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
Objects.equals(summaryCountFieldName, that.summaryCountFieldName) && Objects.equals(summaryCountFieldName, that.summaryCountFieldName) &&
Objects.equals(detectors, that.detectors) && Objects.equals(detectors, that.detectors) &&
Objects.equals(influencers, that.influencers) && Objects.equals(influencers, that.influencers) &&
Objects.equals(overlappingBuckets, that.overlappingBuckets) &&
Objects.equals(resultFinalizationWindow, that.resultFinalizationWindow) &&
Objects.equals(multivariateByFields, that.multivariateByFields); Objects.equals(multivariateByFields, that.multivariateByFields);
} }
@ -429,9 +412,7 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
public int hashCode() { public int hashCode() {
return Objects.hash( return Objects.hash(
bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig, latency, bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig, latency,
summaryCountFieldName, detectors, influencers, overlappingBuckets, resultFinalizationWindow, summaryCountFieldName, detectors, influencers, multivariateByFields);
multivariateByFields
);
} }
public static class Builder { public static class Builder {
@ -446,8 +427,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
private CategorizationAnalyzerConfig categorizationAnalyzerConfig; private CategorizationAnalyzerConfig categorizationAnalyzerConfig;
private String summaryCountFieldName; private String summaryCountFieldName;
private List<String> influencers = new ArrayList<>(); private List<String> influencers = new ArrayList<>();
private Boolean overlappingBuckets;
private Long resultFinalizationWindow;
private Boolean multivariateByFields; private Boolean multivariateByFields;
public Builder(List<Detector> detectors) { public Builder(List<Detector> detectors) {
@ -464,8 +443,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
this.categorizationAnalyzerConfig = analysisConfig.categorizationAnalyzerConfig; this.categorizationAnalyzerConfig = analysisConfig.categorizationAnalyzerConfig;
this.summaryCountFieldName = analysisConfig.summaryCountFieldName; this.summaryCountFieldName = analysisConfig.summaryCountFieldName;
this.influencers = new ArrayList<>(analysisConfig.influencers); this.influencers = new ArrayList<>(analysisConfig.influencers);
this.overlappingBuckets = analysisConfig.overlappingBuckets;
this.resultFinalizationWindow = analysisConfig.resultFinalizationWindow;
this.multivariateByFields = analysisConfig.multivariateByFields; this.multivariateByFields = analysisConfig.multivariateByFields;
} }
@ -517,14 +494,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
this.influencers = ExceptionsHelper.requireNonNull(influencers, INFLUENCERS.getPreferredName()); this.influencers = ExceptionsHelper.requireNonNull(influencers, INFLUENCERS.getPreferredName());
} }
public void setOverlappingBuckets(Boolean overlappingBuckets) {
this.overlappingBuckets = overlappingBuckets;
}
public void setResultFinalizationWindow(Long resultFinalizationWindow) {
this.resultFinalizationWindow = resultFinalizationWindow;
}
public void setMultivariateByFields(Boolean multivariateByFields) { public void setMultivariateByFields(Boolean multivariateByFields) {
this.multivariateByFields = multivariateByFields; this.multivariateByFields = multivariateByFields;
} }
@ -536,7 +505,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
* <li>Check that if non-null Latency is &lt;= MAX_LATENCY</li> * <li>Check that if non-null Latency is &lt;= MAX_LATENCY</li>
* <li>Check there is at least one detector configured</li> * <li>Check there is at least one detector configured</li>
* <li>Check all the detectors are configured correctly</li> * <li>Check all the detectors are configured correctly</li>
* <li>Check that OVERLAPPING_BUCKETS is set appropriately</li>
* <li>Check that MULTIPLE_BUCKETSPANS are set appropriately</li> * <li>Check that MULTIPLE_BUCKETSPANS are set appropriately</li>
* <li>If Per Partition normalization is configured at least one detector * <li>If Per Partition normalization is configured at least one detector
* must have a partition field and no influences can be used</li> * must have a partition field and no influences can be used</li>
@ -555,17 +523,13 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
verifyMlCategoryIsUsedWhenCategorizationFieldNameIsSet(); verifyMlCategoryIsUsedWhenCategorizationFieldNameIsSet();
verifyCategorizationAnalyzer(); verifyCategorizationAnalyzer();
verifyCategorizationFilters(); verifyCategorizationFilters();
checkFieldIsNotNegativeIfSpecified(RESULT_FINALIZATION_WINDOW.getPreferredName(), resultFinalizationWindow);
verifyNoMetricFunctionsWhenSummaryCountFieldNameIsSet(); verifyNoMetricFunctionsWhenSummaryCountFieldNameIsSet();
overlappingBuckets = verifyOverlappingBucketsConfig(overlappingBuckets, detectors);
verifyNoInconsistentNestedFieldNames(); verifyNoInconsistentNestedFieldNames();
return new AnalysisConfig(bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig, return new AnalysisConfig(bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig,
latency, summaryCountFieldName, detectors, influencers, overlappingBuckets, latency, summaryCountFieldName, detectors, influencers, multivariateByFields);
resultFinalizationWindow, multivariateByFields);
} }
private void verifyNoMetricFunctionsWhenSummaryCountFieldNameIsSet() { private void verifyNoMetricFunctionsWhenSummaryCountFieldNameIsSet() {
@ -576,13 +540,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
} }
} }
private static void checkFieldIsNotNegativeIfSpecified(String fieldName, Long value) {
if (value != null && value < 0) {
String msg = Messages.getMessage(Messages.JOB_CONFIG_FIELD_VALUE_TOO_LOW, fieldName, 0, value);
throw ExceptionsHelper.badRequestException(msg);
}
}
private void verifyDetectorAreDefined() { private void verifyDetectorAreDefined() {
if (detectors == null || detectors.isEmpty()) { if (detectors == null || detectors.isEmpty()) {
throw ExceptionsHelper.badRequestException(Messages.getMessage(Messages.JOB_CONFIG_NO_DETECTORS)); throw ExceptionsHelper.badRequestException(Messages.getMessage(Messages.JOB_CONFIG_NO_DETECTORS));
@ -697,25 +654,5 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
return false; return false;
} }
} }
private static Boolean verifyOverlappingBucketsConfig(Boolean overlappingBuckets, List<Detector> detectors) {
// If any detector function is rare/freq_rare, mustn't use overlapping buckets
boolean mustNotUse = false;
List<DetectorFunction> illegalFunctions = new ArrayList<>();
for (Detector d : detectors) {
if (Detector.NO_OVERLAPPING_BUCKETS_FUNCTIONS.contains(d.getFunction())) {
illegalFunctions.add(d.getFunction());
mustNotUse = true;
}
}
if (Boolean.TRUE.equals(overlappingBuckets) && mustNotUse) {
throw ExceptionsHelper.badRequestException(
Messages.getMessage(Messages.JOB_CONFIG_OVERLAPPING_BUCKETS_INCOMPATIBLE_FUNCTION, illegalFunctions.toString()));
}
return overlappingBuckets;
}
} }
} }

View File

@ -184,25 +184,6 @@ public class Detector implements ToXContentObject, Writeable {
DetectorFunction.HIGH_NON_ZERO_COUNT DetectorFunction.HIGH_NON_ZERO_COUNT
); );
/**
* The set of functions that must not be used with overlapping buckets
*/
public static final EnumSet<DetectorFunction> NO_OVERLAPPING_BUCKETS_FUNCTIONS = EnumSet.of(
DetectorFunction.RARE,
DetectorFunction.FREQ_RARE
);
/**
* The set of functions that should not be used with overlapping buckets
* as they gain no benefit but have overhead
*/
public static final EnumSet<DetectorFunction> OVERLAPPING_BUCKETS_FUNCTIONS_NOT_NEEDED = EnumSet.of(
DetectorFunction.MIN,
DetectorFunction.MAX,
DetectorFunction.TIME_OF_DAY,
DetectorFunction.TIME_OF_WEEK
);
/** /**
* Functions that do not support rule conditions: * Functions that do not support rule conditions:
* <ul> * <ul>

View File

@ -138,8 +138,6 @@ public final class Messages {
public static final String JOB_CONFIG_NO_DETECTORS = "No detectors configured"; public static final String JOB_CONFIG_NO_DETECTORS = "No detectors configured";
public static final String JOB_CONFIG_OVERFIELD_INCOMPATIBLE_FUNCTION = public static final String JOB_CONFIG_OVERFIELD_INCOMPATIBLE_FUNCTION =
"over_field_name cannot be used with function ''{0}''"; "over_field_name cannot be used with function ''{0}''";
public static final String JOB_CONFIG_OVERLAPPING_BUCKETS_INCOMPATIBLE_FUNCTION =
"Overlapping buckets cannot be used with function ''{0}''";
public static final String JOB_CONFIG_UNKNOWN_FUNCTION = "Unknown function ''{0}''"; public static final String JOB_CONFIG_UNKNOWN_FUNCTION = "Unknown function ''{0}''";
public static final String JOB_CONFIG_UPDATE_ANALYSIS_LIMITS_MODEL_MEMORY_LIMIT_CANNOT_BE_DECREASED = public static final String JOB_CONFIG_UPDATE_ANALYSIS_LIMITS_MODEL_MEMORY_LIMIT_CANNOT_BE_DECREASED =
"Invalid update value for analysis_limits: model_memory_limit cannot be decreased below current usage; " + "Invalid update value for analysis_limits: model_memory_limit cannot be decreased below current usage; " +

View File

@ -90,12 +90,6 @@ public class AnalysisConfigTests extends AbstractSerializingTestCase<AnalysisCon
if (randomBoolean()) { if (randomBoolean()) {
builder.setMultivariateByFields(randomBoolean()); builder.setMultivariateByFields(randomBoolean());
} }
if (randomBoolean()) {
builder.setOverlappingBuckets(randomBoolean());
}
if (randomBoolean()) {
builder.setResultFinalizationWindow(randomNonNegativeLong());
}
builder.setInfluencers(Arrays.asList(generateRandomStringArray(10, 10, false))); builder.setInfluencers(Arrays.asList(generateRandomStringArray(10, 10, false)));
@ -564,94 +558,6 @@ public class AnalysisConfigTests extends AbstractSerializingTestCase<AnalysisCon
RecordWriter.CONTROL_FIELD_NAME), e.getMessage()); RecordWriter.CONTROL_FIELD_NAME), e.getMessage());
} }
public void testVerify_OverlappingBuckets() {
List<Detector> detectors;
Detector detector;
boolean onByDefault = false;
// Uncomment this when overlappingBuckets turned on by default
if (onByDefault) {
// Test overlappingBuckets unset
AnalysisConfig.Builder analysisConfig = createValidConfig();
analysisConfig.setBucketSpan(TimeValue.timeValueSeconds(5000L));
detectors = new ArrayList<>();
detector = new Detector.Builder("count", null).build();
detectors.add(detector);
detector = new Detector.Builder("mean", "value").build();
detectors.add(detector);
analysisConfig.setDetectors(detectors);
AnalysisConfig ac = analysisConfig.build();
assertTrue(ac.getOverlappingBuckets());
// Test overlappingBuckets unset
analysisConfig = createValidConfig();
analysisConfig.setBucketSpan(TimeValue.timeValueSeconds(5000L));
detectors = new ArrayList<>();
detector = new Detector.Builder("count", null).build();
detectors.add(detector);
detector = new Detector.Builder("rare", "value").build();
detectors.add(detector);
analysisConfig.setDetectors(detectors);
ac = analysisConfig.build();
assertFalse(ac.getOverlappingBuckets());
// Test overlappingBuckets unset
analysisConfig = createValidConfig();
analysisConfig.setBucketSpan(TimeValue.timeValueSeconds(5000L));
detectors = new ArrayList<>();
detector = new Detector.Builder("count", null).build();
detectors.add(detector);
detector = new Detector.Builder("min", "value").build();
detectors.add(detector);
detector = new Detector.Builder("max", "value").build();
detectors.add(detector);
analysisConfig.setDetectors(detectors);
ac = analysisConfig.build();
assertFalse(ac.getOverlappingBuckets());
}
// Test overlappingBuckets set
AnalysisConfig.Builder analysisConfig = createValidConfig();
analysisConfig.setBucketSpan(TimeValue.timeValueSeconds(5000L));
detectors = new ArrayList<>();
detector = new Detector.Builder("count", null).build();
detectors.add(detector);
Detector.Builder builder = new Detector.Builder("rare", null);
builder.setByFieldName("value");
detectors.add(builder.build());
analysisConfig.setOverlappingBuckets(false);
analysisConfig.setDetectors(detectors);
assertFalse(analysisConfig.build().getOverlappingBuckets());
// Test overlappingBuckets set
analysisConfig = createValidConfig();
analysisConfig.setBucketSpan(TimeValue.timeValueSeconds(5000L));
analysisConfig.setOverlappingBuckets(true);
detectors = new ArrayList<>();
detector = new Detector.Builder("count", null).build();
detectors.add(detector);
builder = new Detector.Builder("rare", null);
builder.setByFieldName("value");
detectors.add(builder.build());
analysisConfig.setDetectors(detectors);
ElasticsearchException e = ESTestCase.expectThrows(ElasticsearchException.class, analysisConfig::build);
assertEquals("Overlapping buckets cannot be used with function '[rare]'", e.getMessage());
// Test overlappingBuckets set
analysisConfig = createValidConfig();
analysisConfig.setBucketSpan(TimeValue.timeValueSeconds(5000L));
analysisConfig.setOverlappingBuckets(false);
detectors = new ArrayList<>();
detector = new Detector.Builder("count", null).build();
detectors.add(detector);
detector = new Detector.Builder("mean", "value").build();
detectors.add(detector);
analysisConfig.setDetectors(detectors);
AnalysisConfig ac = analysisConfig.build();
assertFalse(ac.getOverlappingBuckets());
}
public void testVerify_GivenMetricAndSummaryCountField() { public void testVerify_GivenMetricAndSummaryCountField() {
Detector d = new Detector.Builder("metric", "my_metric").build(); Detector d = new Detector.Builder("metric", "my_metric").build();
AnalysisConfig.Builder ac = new AnalysisConfig.Builder(Collections.singletonList(d)); AnalysisConfig.Builder ac = new AnalysisConfig.Builder(Collections.singletonList(d));
@ -728,7 +634,7 @@ public class AnalysisConfigTests extends AbstractSerializingTestCase<AnalysisCon
@Override @Override
protected AnalysisConfig mutateInstance(AnalysisConfig instance) { protected AnalysisConfig mutateInstance(AnalysisConfig instance) {
AnalysisConfig.Builder builder = new AnalysisConfig.Builder(instance); AnalysisConfig.Builder builder = new AnalysisConfig.Builder(instance);
switch (between(0, 10)) { switch (between(0, 8)) {
case 0: case 0:
List<Detector> detectors = new ArrayList<>(instance.getDetectors()); List<Detector> detectors = new ArrayList<>(instance.getDetectors());
Detector.Builder detector = new Detector.Builder(); Detector.Builder detector = new Detector.Builder();
@ -806,20 +712,6 @@ public class AnalysisConfigTests extends AbstractSerializingTestCase<AnalysisCon
builder.setInfluencers(influencers); builder.setInfluencers(influencers);
break; break;
case 8: case 8:
if (instance.getOverlappingBuckets() == null) {
builder.setOverlappingBuckets(randomBoolean());
} else {
builder.setOverlappingBuckets(instance.getOverlappingBuckets() == false);
}
break;
case 9:
if (instance.getResultFinalizationWindow() == null) {
builder.setResultFinalizationWindow(between(1, 100) * 1000L);
} else {
builder.setResultFinalizationWindow(instance.getResultFinalizationWindow() + (between(1, 100) * 1000));
}
break;
case 10:
if (instance.getMultivariateByFields() == null) { if (instance.getMultivariateByFields() == null) {
builder.setMultivariateByFields(randomBoolean()); builder.setMultivariateByFields(randomBoolean());
} else { } else {

View File

@ -43,7 +43,6 @@ public class UpdateInterimResultsIT extends MlNativeAutodetectIntegTestCase {
AnalysisConfig.Builder analysisConfig = new AnalysisConfig.Builder( AnalysisConfig.Builder analysisConfig = new AnalysisConfig.Builder(
Collections.singletonList(new Detector.Builder("max", "value").build())); Collections.singletonList(new Detector.Builder("max", "value").build()));
analysisConfig.setBucketSpan(TimeValue.timeValueSeconds(BUCKET_SPAN_SECONDS)); analysisConfig.setBucketSpan(TimeValue.timeValueSeconds(BUCKET_SPAN_SECONDS));
analysisConfig.setOverlappingBuckets(true);
DataDescription.Builder dataDescription = new DataDescription.Builder(); DataDescription.Builder dataDescription = new DataDescription.Builder();
dataDescription.setTimeFormat("epoch"); dataDescription.setTimeFormat("epoch");
Job.Builder job = new Job.Builder(JOB_ID); Job.Builder job = new Job.Builder(JOB_ID);
@ -77,10 +76,9 @@ public class UpdateInterimResultsIT extends MlNativeAutodetectIntegTestCase {
// We might need to retry this while waiting for a refresh // We might need to retry this while waiting for a refresh
assertBusy(() -> { assertBusy(() -> {
List<Bucket> firstInterimBuckets = getInterimResults(job.getId()); List<Bucket> firstInterimBuckets = getInterimResults(job.getId());
assertThat("interim buckets were: " + firstInterimBuckets, firstInterimBuckets.size(), equalTo(2)); assertThat("interim buckets were: " + firstInterimBuckets, firstInterimBuckets.size(), equalTo(1));
assertThat(firstInterimBuckets.get(0).getTimestamp().getTime(), equalTo(1400039000000L)); assertThat(firstInterimBuckets.get(0).getTimestamp().getTime(), equalTo(1400040000000L));
assertThat(firstInterimBuckets.get(1).getTimestamp().getTime(), equalTo(1400040000000L)); assertThat(firstInterimBuckets.get(0).getRecords().get(0).getActual().get(0), equalTo(16.0));
assertThat(firstInterimBuckets.get(1).getRecords().get(0).getActual().get(0), equalTo(16.0));
}); });
// push 1 more record, flush (with interim), check same interim result // push 1 more record, flush (with interim), check same interim result
@ -90,9 +88,7 @@ public class UpdateInterimResultsIT extends MlNativeAutodetectIntegTestCase {
assertBusy(() -> { assertBusy(() -> {
List<Bucket> secondInterimBuckets = getInterimResults(job.getId()); List<Bucket> secondInterimBuckets = getInterimResults(job.getId());
assertThat(secondInterimBuckets.get(0).getTimestamp().getTime(), equalTo(1400039000000L)); assertThat(secondInterimBuckets.get(0).getTimestamp().getTime(), equalTo(1400040000000L));
assertThat(secondInterimBuckets.get(1).getTimestamp().getTime(), equalTo(1400040000000L));
assertThat(secondInterimBuckets.get(1).getRecords().get(0).getActual().get(0), equalTo(16.0));
}); });
// push rest of data, close, verify no interim results // push rest of data, close, verify no interim results
@ -103,11 +99,11 @@ public class UpdateInterimResultsIT extends MlNativeAutodetectIntegTestCase {
// Verify interim results have been replaced with finalized results // Verify interim results have been replaced with finalized results
GetBucketsAction.Request bucketRequest = new GetBucketsAction.Request(job.getId()); GetBucketsAction.Request bucketRequest = new GetBucketsAction.Request(job.getId());
bucketRequest.setTimestamp("1400039500000"); bucketRequest.setTimestamp("1400040000000");
bucketRequest.setExpand(true); bucketRequest.setExpand(true);
List<Bucket> bucket = client().execute(GetBucketsAction.INSTANCE, bucketRequest).get().getBuckets().results(); List<Bucket> bucket = client().execute(GetBucketsAction.INSTANCE, bucketRequest).get().getBuckets().results();
assertThat(bucket.size(), equalTo(1)); assertThat(bucket.size(), equalTo(1));
assertThat(bucket.get(0).getRecords().get(0).getActual().get(0), equalTo(14.0)); assertThat(bucket.get(0).getRecords().get(0).getActual().get(0), equalTo(16.0));
} }
private String createData(int halfBuckets) { private String createData(int halfBuckets) {

View File

@ -68,7 +68,6 @@ public class AutodetectBuilder {
private static final String MODEL_PLOT_CONFIG_ARG = "--modelplotconfig="; private static final String MODEL_PLOT_CONFIG_ARG = "--modelplotconfig=";
private static final String FIELD_CONFIG_ARG = "--fieldconfig="; private static final String FIELD_CONFIG_ARG = "--fieldconfig=";
static final String LATENCY_ARG = "--latency="; static final String LATENCY_ARG = "--latency=";
static final String RESULT_FINALIZATION_WINDOW_ARG = "--resultFinalizationWindow=";
static final String MULTIVARIATE_BY_FIELDS_ARG = "--multivariateByFields"; static final String MULTIVARIATE_BY_FIELDS_ARG = "--multivariateByFields";
static final String PERSIST_INTERVAL_ARG = "--persistInterval="; static final String PERSIST_INTERVAL_ARG = "--persistInterval=";
static final String MAX_QUANTILE_INTERVAL_ARG = "--maxQuantileInterval="; static final String MAX_QUANTILE_INTERVAL_ARG = "--maxQuantileInterval=";
@ -202,15 +201,7 @@ public class AutodetectBuilder {
if (analysisConfig != null) { if (analysisConfig != null) {
addIfNotNull(analysisConfig.getBucketSpan(), BUCKET_SPAN_ARG, command); addIfNotNull(analysisConfig.getBucketSpan(), BUCKET_SPAN_ARG, command);
addIfNotNull(analysisConfig.getLatency(), LATENCY_ARG, command); addIfNotNull(analysisConfig.getLatency(), LATENCY_ARG, command);
addIfNotNull(analysisConfig.getSummaryCountFieldName(), addIfNotNull(analysisConfig.getSummaryCountFieldName(), SUMMARY_COUNT_FIELD_ARG, command);
SUMMARY_COUNT_FIELD_ARG, command);
if (Boolean.TRUE.equals(analysisConfig.getOverlappingBuckets())) {
Long window = analysisConfig.getResultFinalizationWindow();
if (window == null) {
window = AnalysisConfig.DEFAULT_RESULT_FINALIZATION_WINDOW;
}
command.add(RESULT_FINALIZATION_WINDOW_ARG + window);
}
if (Boolean.TRUE.equals(analysisConfig.getMultivariateByFields())) { if (Boolean.TRUE.equals(analysisConfig.getMultivariateByFields())) {
command.add(MULTIVARIATE_BY_FIELDS_ARG); command.add(MULTIVARIATE_BY_FIELDS_ARG);
} }

View File

@ -54,8 +54,8 @@ public class AutodetectBuilderTests extends ESTestCase {
acBuilder.setBucketSpan(TimeValue.timeValueSeconds(120)); acBuilder.setBucketSpan(TimeValue.timeValueSeconds(120));
acBuilder.setLatency(TimeValue.timeValueSeconds(360)); acBuilder.setLatency(TimeValue.timeValueSeconds(360));
acBuilder.setSummaryCountFieldName("summaryField"); acBuilder.setSummaryCountFieldName("summaryField");
acBuilder.setOverlappingBuckets(true);
acBuilder.setMultivariateByFields(true); acBuilder.setMultivariateByFields(true);
job.setAnalysisConfig(acBuilder); job.setAnalysisConfig(acBuilder);
DataDescription.Builder dd = new DataDescription.Builder(); DataDescription.Builder dd = new DataDescription.Builder();
@ -65,12 +65,11 @@ public class AutodetectBuilderTests extends ESTestCase {
job.setDataDescription(dd); job.setDataDescription(dd);
List<String> command = autodetectBuilder(job.build()).buildAutodetectCommand(); List<String> command = autodetectBuilder(job.build()).buildAutodetectCommand();
assertEquals(12, command.size()); assertEquals(11, command.size());
assertTrue(command.contains(AutodetectBuilder.AUTODETECT_PATH)); assertTrue(command.contains(AutodetectBuilder.AUTODETECT_PATH));
assertTrue(command.contains(AutodetectBuilder.BUCKET_SPAN_ARG + "120")); assertTrue(command.contains(AutodetectBuilder.BUCKET_SPAN_ARG + "120"));
assertTrue(command.contains(AutodetectBuilder.LATENCY_ARG + "360")); assertTrue(command.contains(AutodetectBuilder.LATENCY_ARG + "360"));
assertTrue(command.contains(AutodetectBuilder.SUMMARY_COUNT_FIELD_ARG + "summaryField")); assertTrue(command.contains(AutodetectBuilder.SUMMARY_COUNT_FIELD_ARG + "summaryField"));
assertTrue(command.contains(AutodetectBuilder.RESULT_FINALIZATION_WINDOW_ARG + "2"));
assertTrue(command.contains(AutodetectBuilder.MULTIVARIATE_BY_FIELDS_ARG)); assertTrue(command.contains(AutodetectBuilder.MULTIVARIATE_BY_FIELDS_ARG));
assertTrue(command.contains(AutodetectBuilder.LENGTH_ENCODED_INPUT_ARG)); assertTrue(command.contains(AutodetectBuilder.LENGTH_ENCODED_INPUT_ARG));

View File

@ -1,4 +1,9 @@
--- ---
setup:
- skip:
version: "all"
reason: "Temporarily disabled while backporting https://github.com/elastic/elasticsearch/pull/35645"
---
"Test get old cluster job": "Test get old cluster job":
- do: - do:
xpack.ml.get_jobs: xpack.ml.get_jobs:

View File

@ -1,4 +1,9 @@
--- ---
setup:
- skip:
version: "all"
reason: "Temporarily disabled while backporting https://github.com/elastic/elasticsearch/pull/35645"
---
"Test old cluster datafeed": "Test old cluster datafeed":
- do: - do:
xpack.ml.get_datafeeds: xpack.ml.get_datafeeds:

View File

@ -1,4 +1,9 @@
--- ---
setup:
- skip:
version: "all"
reason: "Temporarily disabled while backporting https://github.com/elastic/elasticsearch/pull/35645"
---
"Put job on the old cluster and post some data": "Put job on the old cluster and post some data":
- do: - do:

View File

@ -1,4 +1,9 @@
--- ---
setup:
- skip:
version: "all"
reason: "Temporarily disabled while backporting https://github.com/elastic/elasticsearch/pull/35645"
---
"Put job and datafeed in old cluster": "Put job and datafeed in old cluster":
- do: - do:

View File

@ -1,4 +1,7 @@
setup: setup:
- skip:
version: "all"
reason: "Temporarily disabled while backporting https://github.com/elastic/elasticsearch/pull/35645"
- do: - do:
cluster.health: cluster.health:
wait_for_status: green wait_for_status: green

View File

@ -1,4 +1,7 @@
setup: setup:
- skip:
version: "all"
reason: "Temporarily disabled while backporting https://github.com/elastic/elasticsearch/pull/35645"
- do: - do:
cluster.health: cluster.health:
wait_for_status: green wait_for_status: green