Skip to content

Commit 23b7a06

Browse files
committed
update create detector page and detector detail page to add custom result index lifecycle management settings
Signed-off-by: Jackie Han <jkhanjob@gmail.com>
1 parent 0591933 commit 23b7a06

File tree

13 files changed

+776
-107
lines changed

13 files changed

+776
-107
lines changed

public/models/interfaces.ts

+3
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ export type Detector = {
187187
timeField: string;
188188
indices: string[];
189189
resultIndex?: string;
190+
resultIndexMinAge?: number;
191+
resultIndexMinSize?: number;
192+
resultIndexTtl?: number;
190193
filterQuery: { [key: string]: any };
191194
featureAttributes: FeatureAttributes[];
192195
windowDelay: { period: Schedule };

public/pages/DefineDetector/components/CustomResultIndex/CustomResultIndex.tsx

+113-106
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ function CustomResultIndex(props: CustomResultIndexProps) {
8989
<EuiFlexItem>
9090
<EuiCallOut
9191
data-test-subj="cannotEditResultIndexCallout"
92-
title="You can't change the custom result index after you create the detector. You can manage the result index with the Index Management plugin."
92+
title="You can't change the custom result index after creating the detector. You can manage the result index using the following three settings inside Anomaly Detection plugin or with the Index Management plugin."
9393
color="warning"
9494
iconType="alert"
9595
size="s"
@@ -115,117 +115,124 @@ function CustomResultIndex(props: CustomResultIndexProps) {
115115
</EuiFormRow>
116116
</EuiFlexItem>
117117
) : null}
118+
</EuiFlexGroup>
119+
)}
120+
</Field>
118121

119-
{enabled ? (
120-
<Field name="maxIndexAge" validate={validatePositiveInteger}>
121-
{({ field, form }: FieldProps) => (
122-
<EuiFlexItem style={{ maxWidth: '70%' }}>
123-
<FormattedFormRow
124-
fullWidth
125-
title="Max Index Age"
126-
hint={[
127-
`This setting would define a specific threshold for the age of an index. When this threshold is surpassed, a rollover will be triggered automatically.`,
128-
]}
129-
isInvalid={isInvalid(field.name, form)}
130-
error={getError(field.name, form)}
131-
>
132-
<EuiFlexGroup gutterSize="s" alignItems="center">
133-
<EuiFlexItem grow={false}>
134-
<EuiFieldNumber
135-
name="maxCustomResultIndexAge"
136-
id="maxCustomResultIndexAge"
137-
placeholder="Max index age"
138-
data-test-subj="maxCustomResultIndexAge"
139-
min={1}
140-
{...field}
141-
/>
142-
</EuiFlexItem>
143-
<EuiFlexItem>
144-
<EuiText>
145-
<p className="minutes">days</p>
146-
</EuiText>
147-
</EuiFlexItem>
148-
</EuiFlexGroup>
149-
</FormattedFormRow>
150-
</EuiFlexItem>
151-
)}
152-
</Field>
153-
) : null}
122+
{enabled ? (<Field
123+
name="resultIndexMinAge"
124+
validate={enabled ? validatePositiveInteger : null}
125+
>
126+
{({ field, form }: FieldProps) => (
127+
<EuiFlexGroup>
128+
<EuiFlexItem style={{ maxWidth: '70%' }}>
129+
<FormattedFormRow
130+
fullWidth
131+
title="Max Index Age"
132+
hint={[
133+
`This setting would define a specific threshold for the age of an index. When this threshold is surpassed, a rollover will be triggered automatically.`,
134+
]}
135+
isInvalid={isInvalid(field.name, form)}
136+
error={getError(field.name, form)}
137+
>
138+
<EuiFlexGroup gutterSize="s" alignItems="center">
139+
<EuiFlexItem grow={false}>
140+
<EuiFieldNumber
141+
name="resultIndexMinAge"
142+
id="resultIndexMinAge"
143+
data-test-subj="resultIndexMinAge"
144+
min={1}
145+
{...field}
146+
/>
147+
</EuiFlexItem>
148+
<EuiFlexItem>
149+
<EuiText>
150+
<p className="minutes">days</p>
151+
</EuiText>
152+
</EuiFlexItem>
153+
</EuiFlexGroup>
154+
</FormattedFormRow>
155+
</EuiFlexItem>
156+
</EuiFlexGroup>
157+
)}
158+
</Field>) : null}
154159

155-
{enabled ? (
156-
<Field name="maxIndexSize" validate={validatePositiveInteger}>
157-
{({ field, form }: FieldProps) => (
158-
<EuiFlexItem style={{ maxWidth: '70%' }}>
159-
<FormattedFormRow
160-
fullWidth
161-
title="Max Index Size"
162-
hint={[
163-
`This setting would define a specific threshold for the size of an index. When this threshold is surpassed, a rollover will be triggered automatically.`,
164-
]}
165-
isInvalid={isInvalid(field.name, form)}
166-
error={getError(field.name, form)}
167-
>
168-
<EuiFlexGroup gutterSize="s" alignItems="center">
169-
<EuiFlexItem grow={false}>
170-
<EuiFieldNumber
171-
name="maxCustomResultIndexSize"
172-
id="maxCustomResultIndexSize"
173-
placeholder="Max index size"
174-
data-test-subj="maxCustomResultIndexSize"
175-
min={1}
176-
{...field}
177-
/>
178-
</EuiFlexItem>
179-
<EuiFlexItem>
180-
<EuiText>
181-
<p className="minutes">MB</p>
182-
</EuiText>
183-
</EuiFlexItem>
184-
</EuiFlexGroup>
185-
</FormattedFormRow>
160+
{enabled ? (<Field
161+
name="resultIndexMinSize"
162+
validate={enabled ? validatePositiveInteger : null}
163+
>
164+
{({ field, form }: FieldProps) => (
165+
<EuiFlexGroup>
166+
<EuiFlexItem style={{ maxWidth: '70%' }}>
167+
<FormattedFormRow
168+
fullWidth
169+
title="Max Index Size"
170+
hint={[
171+
`This setting would define a specific threshold for the size of an index. When this threshold is surpassed, a rollover will be triggered automatically.`,
172+
]}
173+
isInvalid={isInvalid(field.name, form)}
174+
error={getError(field.name, form)}
175+
>
176+
<EuiFlexGroup gutterSize="s" alignItems="center">
177+
<EuiFlexItem grow={false}>
178+
<EuiFieldNumber
179+
name="resultIndexMinSize"
180+
id="resultIndexMinSize"
181+
placeholder="Max index size"
182+
data-test-subj="resultIndexMinSize"
183+
min={1}
184+
{...field}
185+
/>
186+
</EuiFlexItem>
187+
<EuiFlexItem>
188+
<EuiText>
189+
<p className="minutes">MB</p>
190+
</EuiText>
186191
</EuiFlexItem>
187-
)}
188-
</Field>
189-
) : null}
192+
</EuiFlexGroup>
193+
</FormattedFormRow>
194+
</EuiFlexItem>
195+
</EuiFlexGroup>
196+
)}
197+
</Field>) : null}
190198

191-
{enabled ? (
192-
<Field name="indexExpiryThreshold" validate={validatePositiveInteger}>
193-
{({ field, form }: FieldProps) => (
194-
<EuiFlexItem style={{ maxWidth: '70%' }}>
195-
<FormattedFormRow
196-
fullWidth
197-
title="Index Expiry Threshold"
198-
hint={[
199-
`This setting would define the duration after which an index is considered expired and eligible for deletion.`,
200-
]}
201-
isInvalid={isInvalid(field.name, form)}
202-
error={getError(field.name, form)}
203-
>
204-
<EuiFlexGroup gutterSize="s" alignItems="center">
205-
<EuiFlexItem grow={false}>
206-
<EuiFieldNumber
207-
name="maxIndexExpiryThreshold"
208-
id="maxIndexExpiryThreshold"
209-
placeholder="Expiry Threshold"
210-
data-test-subj="maxIndexExpiryThreshold"
211-
min={1}
212-
{...field}
213-
/>
214-
</EuiFlexItem>
215-
<EuiFlexItem>
216-
<EuiText>
217-
<p className="minutes">days</p>
218-
</EuiText>
219-
</EuiFlexItem>
220-
</EuiFlexGroup>
221-
</FormattedFormRow>
222-
</EuiFlexItem>
223-
)}
224-
</Field>
225-
) : null}
199+
{enabled ? (<Field
200+
name="resultIndexTtl"
201+
validate={enabled ? validatePositiveInteger : null}
202+
>
203+
{({ field, form }: FieldProps) => (
204+
<EuiFlexGroup>
205+
<EuiFlexItem style={{ maxWidth: '70%' }}>
206+
<FormattedFormRow
207+
fullWidth
208+
title="Index TTL"
209+
hint={[
210+
`This setting would define the duration after which an index is considered expired and eligible for deletion.`,
211+
]}
212+
isInvalid={isInvalid(field.name, form)}
213+
error={getError(field.name, form)}
214+
>
215+
<EuiFlexGroup gutterSize="s" alignItems="center">
216+
<EuiFlexItem grow={false}>
217+
<EuiFieldNumber
218+
name="resultIndexTtl"
219+
id="resultIndexTtl"
220+
data-test-subj="resultIndexTtl"
221+
min={1}
222+
{...field}
223+
/>
224+
</EuiFlexItem>
225+
<EuiFlexItem>
226+
<EuiText>
227+
<p className="minutes">days</p>
228+
</EuiText>
229+
</EuiFlexItem>
230+
</EuiFlexGroup>
231+
</FormattedFormRow>
232+
</EuiFlexItem>
226233
</EuiFlexGroup>
227234
)}
228-
</Field>
235+
</Field>) : null}
229236
</ContentPanel>
230237
);
231238
}

public/pages/DefineDetector/containers/DefineDetector.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,9 @@ export const DefineDetector = (props: DefineDetectorProps) => {
225225
formikProps.setFieldTouched('timeField');
226226
formikProps.setFieldTouched('interval');
227227
formikProps.setFieldTouched('windowDelay');
228+
formikProps.setFieldTouched('resultIndexMinAge');
229+
formikProps.setFieldTouched('resultIndexMinSize');
230+
formikProps.setFieldTouched('resultIndexTtl');
228231
formikProps.validateForm().then((errors) => {
229232
if (isEmpty(errors)) {
230233
if (props.isEdit) {

public/pages/DefineDetector/models/interfaces.ts

+3
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,7 @@ export interface DetectorDefinitionFormikValues {
2222
timeField: string;
2323
interval: number;
2424
windowDelay: number;
25+
resultIndexMinAge?: number;
26+
resultIndexMinSize?: number;
27+
resultIndexTtl?:number;
2528
}

public/pages/DefineDetector/utils/__tests__/helpers.test.tsx

+8
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ describe('detectorDefinitionToFormik', () => {
4040
timeField: randomDetector.timeField,
4141
interval: randomDetector.detectionInterval.period.interval,
4242
windowDelay: randomDetector.windowDelay.period.interval,
43+
resultIndex: randomDetector.resultIndex,
44+
resultIndexMinAge: randomDetector.resultIndexMinAge,
45+
resultIndexMinSize: randomDetector.resultIndexMinSize,
46+
resultIndexTtl: randomDetector.resultIndexTtl,
4347
});
4448
});
4549
test('should return if detector does not have metadata', () => {
@@ -56,6 +60,10 @@ describe('detectorDefinitionToFormik', () => {
5660
timeField: randomDetector.timeField,
5761
interval: randomDetector.detectionInterval.period.interval,
5862
windowDelay: randomDetector.windowDelay.period.interval,
63+
resultIndex: randomDetector.resultIndex,
64+
resultIndexMinAge: randomDetector.resultIndexMinAge,
65+
resultIndexMinSize: randomDetector.resultIndexMinSize,
66+
resultIndexTtl: randomDetector.resultIndexTtl,
5967
});
6068
});
6169
test("upgrade old detector's filters to include filter type", () => {

public/pages/DefineDetector/utils/constants.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,7 @@ export const INITIAL_DETECTOR_DEFINITION_VALUES: DetectorDefinitionFormikValues
4444
interval: 10,
4545
windowDelay: 1,
4646
resultIndex: undefined,
47+
resultIndexMinAge: 7,
48+
resultIndexMinSize: 51200,
49+
resultIndexTtl: 60,
4750
};

public/pages/DefineDetector/utils/helpers.ts

+6
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ export function detectorDefinitionToFormik(
4545
timeField: ad.timeField,
4646
interval: get(ad, 'detectionInterval.period.interval', 10),
4747
windowDelay: get(ad, 'windowDelay.period.interval', 0),
48+
resultIndexMinAge: get(ad, 'resultIndexMinAge', 7),
49+
resultIndexMinSize:get(ad, 'resultIndexMinSize', 51200),
50+
resultIndexTtl: get(ad, 'resultIndexTtl', 60),
4851
};
4952
}
5053

@@ -119,6 +122,9 @@ export function formikToDetectorDefinition(
119122
windowDelay: {
120123
period: { interval: values.windowDelay, unit: UNITS.MINUTES },
121124
},
125+
resultIndexMinAge: values.resultIndexMinAge,
126+
resultIndexMinSize: values.resultIndexMinSize,
127+
resultIndexTtl: values.resultIndexTtl,
122128
} as Detector;
123129

124130
return detectorBody;

0 commit comments

Comments
 (0)