Skip to content

Commit f30bb0e

Browse files
[ML] Remove multiple_bucket_spans (#32496)
This commit removes the never released multiple_bucket_spans configuration parameter. This is now replaced with the new multibucket feature that requires no configuration.
1 parent 1567931 commit f30bb0e

File tree

4 files changed

+20
-154
lines changed

4 files changed

+20
-154
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/config/AnalysisConfig.java

Lines changed: 19 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ public class AnalysisConfig implements ToXContentObject, Writeable {
6464
private static final ParseField OVERLAPPING_BUCKETS = new ParseField("overlapping_buckets");
6565
private static final ParseField RESULT_FINALIZATION_WINDOW = new ParseField("result_finalization_window");
6666
private static final ParseField MULTIVARIATE_BY_FIELDS = new ParseField("multivariate_by_fields");
67-
private static final ParseField MULTIPLE_BUCKET_SPANS = new ParseField("multiple_bucket_spans");
6867
private static final ParseField USER_PER_PARTITION_NORMALIZATION = new ParseField("use_per_partition_normalization");
6968

7069
public static final String ML_CATEGORY_FIELD = "mlcategory";
@@ -99,9 +98,6 @@ private static ConstructingObjectParser<AnalysisConfig.Builder, Void> createPars
9998
parser.declareBoolean(Builder::setOverlappingBuckets, OVERLAPPING_BUCKETS);
10099
parser.declareLong(Builder::setResultFinalizationWindow, RESULT_FINALIZATION_WINDOW);
101100
parser.declareBoolean(Builder::setMultivariateByFields, MULTIVARIATE_BY_FIELDS);
102-
parser.declareStringArray((builder, values) -> builder.setMultipleBucketSpans(
103-
values.stream().map(v -> TimeValue.parseTimeValue(v, MULTIPLE_BUCKET_SPANS.getPreferredName()))
104-
.collect(Collectors.toList())), MULTIPLE_BUCKET_SPANS);
105101
parser.declareBoolean(Builder::setUsePerPartitionNormalization, USER_PER_PARTITION_NORMALIZATION);
106102

107103
return parser;
@@ -121,13 +117,12 @@ private static ConstructingObjectParser<AnalysisConfig.Builder, Void> createPars
121117
private final Boolean overlappingBuckets;
122118
private final Long resultFinalizationWindow;
123119
private final Boolean multivariateByFields;
124-
private final List<TimeValue> multipleBucketSpans;
125120
private final boolean usePerPartitionNormalization;
126121

127122
private AnalysisConfig(TimeValue bucketSpan, String categorizationFieldName, List<String> categorizationFilters,
128123
CategorizationAnalyzerConfig categorizationAnalyzerConfig, TimeValue latency, String summaryCountFieldName,
129124
List<Detector> detectors, List<String> influencers, Boolean overlappingBuckets, Long resultFinalizationWindow,
130-
Boolean multivariateByFields, List<TimeValue> multipleBucketSpans, boolean usePerPartitionNormalization) {
125+
Boolean multivariateByFields, boolean usePerPartitionNormalization) {
131126
this.detectors = detectors;
132127
this.bucketSpan = bucketSpan;
133128
this.latency = latency;
@@ -139,7 +134,6 @@ private AnalysisConfig(TimeValue bucketSpan, String categorizationFieldName, Lis
139134
this.overlappingBuckets = overlappingBuckets;
140135
this.resultFinalizationWindow = resultFinalizationWindow;
141136
this.multivariateByFields = multivariateByFields;
142-
this.multipleBucketSpans = multipleBucketSpans == null ? null : Collections.unmodifiableList(multipleBucketSpans);
143137
this.usePerPartitionNormalization = usePerPartitionNormalization;
144138
}
145139

@@ -159,16 +153,18 @@ public AnalysisConfig(StreamInput in) throws IOException {
159153
overlappingBuckets = in.readOptionalBoolean();
160154
resultFinalizationWindow = in.readOptionalLong();
161155
multivariateByFields = in.readOptionalBoolean();
162-
if (in.readBoolean()) {
163-
final int arraySize = in.readVInt();
164-
final List<TimeValue> spans = new ArrayList<>(arraySize);
165-
for (int i = 0; i < arraySize; i++) {
166-
spans.add(in.readTimeValue());
156+
157+
// BWC for removed multiple_bucket_spans
158+
// TODO Remove in 7.0.0
159+
if (in.getVersion().before(Version.V_6_5_0)) {
160+
if (in.readBoolean()) {
161+
final int arraySize = in.readVInt();
162+
for (int i = 0; i < arraySize; i++) {
163+
in.readTimeValue();
164+
}
167165
}
168-
multipleBucketSpans = Collections.unmodifiableList(spans);
169-
} else {
170-
multipleBucketSpans = null;
171166
}
167+
172168
usePerPartitionNormalization = in.readBoolean();
173169
}
174170

@@ -192,15 +188,13 @@ public void writeTo(StreamOutput out) throws IOException {
192188
out.writeOptionalBoolean(overlappingBuckets);
193189
out.writeOptionalLong(resultFinalizationWindow);
194190
out.writeOptionalBoolean(multivariateByFields);
195-
if (multipleBucketSpans != null) {
196-
out.writeBoolean(true);
197-
out.writeVInt(multipleBucketSpans.size());
198-
for (TimeValue span : multipleBucketSpans) {
199-
out.writeTimeValue(span);
200-
}
201-
} else {
191+
192+
// BWC for removed multiple_bucket_spans
193+
// TODO Remove in 7.0.0
194+
if (out.getVersion().before(Version.V_6_5_0)) {
202195
out.writeBoolean(false);
203196
}
197+
204198
out.writeBoolean(usePerPartitionNormalization);
205199
}
206200

@@ -305,10 +299,6 @@ public Boolean getMultivariateByFields() {
305299
return multivariateByFields;
306300
}
307301

308-
public List<TimeValue> getMultipleBucketSpans() {
309-
return multipleBucketSpans;
310-
}
311-
312302
public boolean getUsePerPartitionNormalization() {
313303
return usePerPartitionNormalization;
314304
}
@@ -413,10 +403,6 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
413403
if (multivariateByFields != null) {
414404
builder.field(MULTIVARIATE_BY_FIELDS.getPreferredName(), multivariateByFields);
415405
}
416-
if (multipleBucketSpans != null) {
417-
builder.field(MULTIPLE_BUCKET_SPANS.getPreferredName(),
418-
multipleBucketSpans.stream().map(TimeValue::getStringRep).collect(Collectors.toList()));
419-
}
420406
if (usePerPartitionNormalization) {
421407
builder.field(USER_PER_PARTITION_NORMALIZATION.getPreferredName(), usePerPartitionNormalization);
422408
}
@@ -440,16 +426,15 @@ public boolean equals(Object o) {
440426
Objects.equals(influencers, that.influencers) &&
441427
Objects.equals(overlappingBuckets, that.overlappingBuckets) &&
442428
Objects.equals(resultFinalizationWindow, that.resultFinalizationWindow) &&
443-
Objects.equals(multivariateByFields, that.multivariateByFields) &&
444-
Objects.equals(multipleBucketSpans, that.multipleBucketSpans);
429+
Objects.equals(multivariateByFields, that.multivariateByFields);
445430
}
446431

447432
@Override
448433
public int hashCode() {
449434
return Objects.hash(
450435
bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig, latency,
451436
summaryCountFieldName, detectors, influencers, overlappingBuckets, resultFinalizationWindow,
452-
multivariateByFields, multipleBucketSpans, usePerPartitionNormalization
437+
multivariateByFields, usePerPartitionNormalization
453438
);
454439
}
455440

@@ -468,7 +453,6 @@ public static class Builder {
468453
private Boolean overlappingBuckets;
469454
private Long resultFinalizationWindow;
470455
private Boolean multivariateByFields;
471-
private List<TimeValue> multipleBucketSpans;
472456
private boolean usePerPartitionNormalization = false;
473457

474458
public Builder(List<Detector> detectors) {
@@ -488,8 +472,6 @@ public Builder(AnalysisConfig analysisConfig) {
488472
this.overlappingBuckets = analysisConfig.overlappingBuckets;
489473
this.resultFinalizationWindow = analysisConfig.resultFinalizationWindow;
490474
this.multivariateByFields = analysisConfig.multivariateByFields;
491-
this.multipleBucketSpans = analysisConfig.multipleBucketSpans == null ? null
492-
: new ArrayList<>(analysisConfig.multipleBucketSpans);
493475
this.usePerPartitionNormalization = analysisConfig.usePerPartitionNormalization;
494476
}
495477

@@ -553,10 +535,6 @@ public void setMultivariateByFields(Boolean multivariateByFields) {
553535
this.multivariateByFields = multivariateByFields;
554536
}
555537

556-
public void setMultipleBucketSpans(List<TimeValue> multipleBucketSpans) {
557-
this.multipleBucketSpans = multipleBucketSpans;
558-
}
559-
560538
public void setUsePerPartitionNormalization(boolean usePerPartitionNormalization) {
561539
this.usePerPartitionNormalization = usePerPartitionNormalization;
562540
}
@@ -588,7 +566,6 @@ public AnalysisConfig build() {
588566
verifyCategorizationAnalyzer();
589567
verifyCategorizationFilters();
590568
checkFieldIsNotNegativeIfSpecified(RESULT_FINALIZATION_WINDOW.getPreferredName(), resultFinalizationWindow);
591-
verifyMultipleBucketSpans();
592569

593570
verifyNoMetricFunctionsWhenSummaryCountFieldNameIsSet();
594571

@@ -603,7 +580,7 @@ public AnalysisConfig build() {
603580

604581
return new AnalysisConfig(bucketSpan, categorizationFieldName, categorizationFilters, categorizationAnalyzerConfig,
605582
latency, summaryCountFieldName, detectors, influencers, overlappingBuckets,
606-
resultFinalizationWindow, multivariateByFields, multipleBucketSpans, usePerPartitionNormalization);
583+
resultFinalizationWindow, multivariateByFields, usePerPartitionNormalization);
607584
}
608585

609586
private void verifyNoMetricFunctionsWhenSummaryCountFieldNameIsSet() {
@@ -727,19 +704,6 @@ private void verifyCategorizationFiltersAreValidRegex() {
727704
}
728705
}
729706

730-
private void verifyMultipleBucketSpans() {
731-
if (multipleBucketSpans == null) {
732-
return;
733-
}
734-
735-
for (TimeValue span : multipleBucketSpans) {
736-
if ((span.getSeconds() % bucketSpan.getSeconds() != 0L) || (span.compareTo(bucketSpan) <= 0)) {
737-
throw ExceptionsHelper.badRequestException(
738-
Messages.getMessage(Messages.JOB_CONFIG_MULTIPLE_BUCKETSPANS_MUST_BE_MULTIPLE, span, bucketSpan));
739-
}
740-
}
741-
}
742-
743707
private static void checkDetectorsHavePartitionFields(List<Detector> detectors) {
744708
for (Detector detector : detectors) {
745709
if (!Strings.isNullOrEmpty(detector.getPartitionFieldName())) {

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,6 @@ public final class Messages {
123123
public static final String JOB_CONFIG_INVALID_TIMEFORMAT = "Invalid Time format string ''{0}''";
124124
public static final String JOB_CONFIG_MISSING_ANALYSISCONFIG = "An analysis_config must be set";
125125
public static final String JOB_CONFIG_MISSING_DATA_DESCRIPTION = "A data_description must be set";
126-
public static final String JOB_CONFIG_MULTIPLE_BUCKETSPANS_MUST_BE_MULTIPLE =
127-
"Multiple bucket_span ''{0}'' must be a multiple of the main bucket_span ''{1}''";
128126
public static final String JOB_CONFIG_ANALYSIS_FIELD_MUST_BE_SET =
129127
"Unless a count or temporal function is used one of field_name, by_field_name or over_field_name must be set";
130128
public static final String JOB_CONFIG_NO_DETECTORS = "No detectors configured";

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/AnalysisConfigTests.java

Lines changed: 1 addition & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,6 @@ public static AnalysisConfig.Builder createRandomized() {
8787
if (randomBoolean()) {
8888
builder.setLatency(TimeValue.timeValueSeconds(randomIntBetween(1, 1_000_000)));
8989
}
90-
if (randomBoolean()) {
91-
int numBucketSpans = randomIntBetween(0, 10);
92-
List<TimeValue> multipleBucketSpans = new ArrayList<>();
93-
for (int i = 2; i <= numBucketSpans; i++) {
94-
multipleBucketSpans.add(TimeValue.timeValueSeconds(bucketSpan.getSeconds() * i));
95-
}
96-
builder.setMultipleBucketSpans(multipleBucketSpans);
97-
}
9890
if (randomBoolean()) {
9991
builder.setMultivariateByFields(randomBoolean());
10092
}
@@ -255,28 +247,6 @@ public void testFieldConfiguration_multipleDetectors_NotPreSummarised() {
255247
}
256248
}
257249

258-
public void testFieldConfiguration_singleDetector_PreSummarised() {
259-
// Multiple detectors, pre-summarised
260-
AnalysisConfig.Builder builder = createConfigBuilder();
261-
builder.setSummaryCountFieldName("summaryCount");
262-
AnalysisConfig ac = builder.build();
263-
264-
assertTrue(ac.analysisFields().contains("summaryCount"));
265-
assertEquals("summaryCount", ac.getSummaryCountFieldName());
266-
267-
builder = createConfigBuilder();
268-
builder.setBucketSpan(TimeValue.timeValueSeconds(1000));
269-
builder.setMultipleBucketSpans(Arrays.asList(
270-
TimeValue.timeValueSeconds(5000), TimeValue.timeValueSeconds(10000), TimeValue.timeValueSeconds(24000)));
271-
ac = builder.build();
272-
assertTrue(ac.getMultipleBucketSpans().contains(TimeValue.timeValueSeconds(5000)));
273-
assertTrue(ac.getMultipleBucketSpans().contains(TimeValue.timeValueSeconds(10000)));
274-
assertTrue(ac.getMultipleBucketSpans().contains(TimeValue.timeValueSeconds(24000)));
275-
276-
assertEquals(1, ac.getDetectors().size());
277-
assertEquals(0, ac.getDetectors().get(0).getDetectorIndex());
278-
}
279-
280250
public void testBuild_GivenMlCategoryUsedAsByFieldButNoCategorizationFieldName() {
281251
Detector.Builder detector = new Detector.Builder();
282252
detector.setFunction("count");
@@ -693,58 +663,6 @@ public void testVerify_GivenMetricAndSummaryCountField() {
693663
assertEquals(Messages.getMessage(Messages.JOB_CONFIG_FUNCTION_INCOMPATIBLE_PRESUMMARIZED, DetectorFunction.METRIC), e.getMessage());
694664
}
695665

696-
public void testMultipleBucketsConfig() {
697-
AnalysisConfig.Builder ac = createValidConfig();
698-
ac.setMultipleBucketSpans(Arrays.asList(
699-
TimeValue.timeValueSeconds(10L),
700-
TimeValue.timeValueSeconds(15L),
701-
TimeValue.timeValueSeconds(20L),
702-
TimeValue.timeValueSeconds(25L),
703-
TimeValue.timeValueSeconds(30L),
704-
TimeValue.timeValueSeconds(35L)));
705-
List<Detector> detectors = new ArrayList<>();
706-
Detector detector = new Detector.Builder("count", null).build();
707-
detectors.add(detector);
708-
ac.setDetectors(detectors);
709-
710-
ac.setBucketSpan(TimeValue.timeValueSeconds(4L));
711-
ElasticsearchException e = ESTestCase.expectThrows(ElasticsearchException.class, ac::build);
712-
assertEquals(Messages.getMessage(Messages.JOB_CONFIG_MULTIPLE_BUCKETSPANS_MUST_BE_MULTIPLE, "10s", "4s"), e.getMessage());
713-
714-
ac.setBucketSpan(TimeValue.timeValueSeconds(5L));
715-
ac.build();
716-
717-
AnalysisConfig.Builder ac2 = createValidConfig();
718-
ac2.setBucketSpan(TimeValue.timeValueSeconds(5L));
719-
ac2.setDetectors(detectors);
720-
ac2.setMultipleBucketSpans(Arrays.asList(
721-
TimeValue.timeValueSeconds(10L),
722-
TimeValue.timeValueSeconds(15L),
723-
TimeValue.timeValueSeconds(20L),
724-
TimeValue.timeValueSeconds(25L),
725-
TimeValue.timeValueSeconds(30L)));
726-
assertFalse(ac.equals(ac2));
727-
ac2.setMultipleBucketSpans(Arrays.asList(
728-
TimeValue.timeValueSeconds(10L),
729-
TimeValue.timeValueSeconds(15L),
730-
TimeValue.timeValueSeconds(20L),
731-
TimeValue.timeValueSeconds(25L),
732-
TimeValue.timeValueSeconds(30L),
733-
TimeValue.timeValueSeconds(35L)));
734-
735-
ac.setBucketSpan(TimeValue.timeValueSeconds(222L));
736-
ac.setMultipleBucketSpans(Collections.emptyList());
737-
ac.build();
738-
739-
ac.setMultipleBucketSpans(Collections.singletonList(TimeValue.timeValueSeconds(222L)));
740-
e = ESTestCase.expectThrows(ElasticsearchException.class, ac::build);
741-
assertEquals(Messages.getMessage(Messages.JOB_CONFIG_MULTIPLE_BUCKETSPANS_MUST_BE_MULTIPLE, "3.7m", "3.7m"), e.getMessage());
742-
743-
ac.setMultipleBucketSpans(Arrays.asList(TimeValue.timeValueSeconds(-444L), TimeValue.timeValueSeconds(-888L)));
744-
e = ESTestCase.expectThrows(ElasticsearchException.class, ac::build);
745-
assertEquals(Messages.getMessage(Messages.JOB_CONFIG_MULTIPLE_BUCKETSPANS_MUST_BE_MULTIPLE, -444, "3.7m"), e.getMessage());
746-
}
747-
748666
public void testVerify_GivenCategorizationFiltersButNoCategorizationFieldName() {
749667
AnalysisConfig.Builder config = createValidConfig();
750668
config.setCategorizationFilters(Collections.singletonList("foo"));
@@ -838,7 +756,7 @@ private static AnalysisConfig.Builder createValidCategorizationConfig() {
838756
@Override
839757
protected AnalysisConfig mutateInstance(AnalysisConfig instance) {
840758
AnalysisConfig.Builder builder = new AnalysisConfig.Builder(instance);
841-
switch (between(0, 12)) {
759+
switch (between(0, 11)) {
842760
case 0:
843761
List<Detector> detectors = new ArrayList<>(instance.getDetectors());
844762
Detector.Builder detector = new Detector.Builder();
@@ -849,7 +767,6 @@ protected AnalysisConfig mutateInstance(AnalysisConfig instance) {
849767
break;
850768
case 1:
851769
builder.setBucketSpan(new TimeValue(instance.getBucketSpan().millis() + (between(1, 1000) * 1000)));
852-
builder.setMultipleBucketSpans(Collections.emptyList());
853770
break;
854771
case 2:
855772
if (instance.getLatency() == null) {
@@ -939,16 +856,6 @@ protected AnalysisConfig mutateInstance(AnalysisConfig instance) {
939856
}
940857
break;
941858
case 11:
942-
List<TimeValue> multipleBucketSpans;
943-
if (instance.getMultipleBucketSpans() == null) {
944-
multipleBucketSpans = new ArrayList<>();
945-
} else {
946-
multipleBucketSpans = new ArrayList<>(instance.getMultipleBucketSpans());
947-
}
948-
multipleBucketSpans.add(new TimeValue(between(2, 10) * instance.getBucketSpan().millis()));
949-
builder.setMultipleBucketSpans(multipleBucketSpans);
950-
break;
951-
case 12:
952859
boolean usePerPartitionNormalization = instance.getUsePerPartitionNormalization() == false;
953860
builder.setUsePerPartitionNormalization(usePerPartitionNormalization);
954861
if (usePerPartitionNormalization) {

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/ProcessCtrl.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ public class ProcessCtrl {
7474
static final String LENGTH_ENCODED_INPUT_ARG = "--lengthEncodedInput";
7575
static final String MODEL_CONFIG_ARG = "--modelconfig=";
7676
public static final String QUANTILES_STATE_PATH_ARG = "--quantilesState=";
77-
static final String MULTIPLE_BUCKET_SPANS_ARG = "--multipleBucketspans=";
7877
static final String PER_PARTITION_NORMALIZATION = "--perPartitionNormalization";
7978

8079
/*
@@ -155,8 +154,6 @@ public static List<String> buildAutodetectCommand(Environment env, Settings sett
155154
addIfNotNull(analysisConfig.getLatency(), LATENCY_ARG, command);
156155
addIfNotNull(analysisConfig.getSummaryCountFieldName(),
157156
SUMMARY_COUNT_FIELD_ARG, command);
158-
addIfNotNull(analysisConfig.getMultipleBucketSpans(),
159-
MULTIPLE_BUCKET_SPANS_ARG, command);
160157
if (Boolean.TRUE.equals(analysisConfig.getOverlappingBuckets())) {
161158
Long window = analysisConfig.getResultFinalizationWindow();
162159
if (window == null) {

0 commit comments

Comments
 (0)