@@ -75,13 +75,22 @@ export default function Expressions(props: Props) {
75
75
} ,
76
76
} = useKibana ( ) . services ;
77
77
78
+ const hasGroupBy = useMemo < boolean > (
79
+ ( ) => ! ! ruleParams . groupBy && ruleParams . groupBy . length > 0 ,
80
+ [ ruleParams . groupBy ]
81
+ ) ;
82
+
78
83
const [ timeSize , setTimeSize ] = useState < number | undefined > ( 1 ) ;
79
84
const [ timeUnit , setTimeUnit ] = useState < TimeUnitChar | undefined > ( 'm' ) ;
80
85
const [ dataView , setDataView ] = useState < DataView > ( ) ;
81
86
const [ dataViewTimeFieldError , setDataViewTimeFieldError ] = useState < string > ( ) ;
82
87
const [ searchSource , setSearchSource ] = useState < ISearchSource > ( ) ;
83
88
const [ paramsError , setParamsError ] = useState < Error > ( ) ;
84
89
const [ paramsWarning , setParamsWarning ] = useState < string > ( ) ;
90
+ const [ isNoDataChecked , setIsNoDataChecked ] = useState < boolean > (
91
+ ( hasGroupBy && ! ! ruleParams . alertOnGroupDisappear ) ||
92
+ ( ! hasGroupBy && ! ! ruleParams . alertOnNoData )
93
+ ) ;
85
94
const derivedIndexPattern = useMemo < DataViewBase > (
86
95
( ) => ( {
87
96
fields : dataView ?. fields || [ ] ,
@@ -177,11 +186,15 @@ export default function Expressions(props: Props) {
177
186
}
178
187
179
188
if ( typeof ruleParams . alertOnNoData === 'undefined' ) {
180
- setRuleParams ( 'alertOnNoData' , true ) ;
189
+ preFillAlertOnNoData ( ) ;
181
190
}
182
191
if ( typeof ruleParams . alertOnGroupDisappear === 'undefined' ) {
183
192
preFillAlertOnGroupDisappear ( ) ;
184
193
}
194
+ setIsNoDataChecked (
195
+ ( hasGroupBy && ! ! ruleParams . alertOnGroupDisappear ) ||
196
+ ( ! hasGroupBy && ! ! ruleParams . alertOnNoData )
197
+ ) ;
185
198
} , [ metadata ] ) ; // eslint-disable-line react-hooks/exhaustive-deps
186
199
187
200
const onSelectDataView = useCallback (
@@ -250,9 +263,12 @@ export default function Expressions(props: Props) {
250
263
251
264
const onGroupByChange = useCallback (
252
265
( group : string | null | string [ ] ) => {
266
+ const hasGroup = ! ! group && group . length > 0 ;
253
267
setRuleParams ( 'groupBy' , group && group . length ? group : '' ) ;
268
+ setRuleParams ( 'alertOnGroupDisappear' , hasGroup && isNoDataChecked ) ;
269
+ setRuleParams ( 'alertOnNoData' , ! hasGroup && isNoDataChecked ) ;
254
270
} ,
255
- [ setRuleParams ]
271
+ [ setRuleParams , isNoDataChecked ]
256
272
) ;
257
273
258
274
const emptyError = useMemo ( ( ) => {
@@ -314,20 +330,24 @@ export default function Expressions(props: Props) {
314
330
}
315
331
} , [ metadata , setRuleParams ] ) ;
316
332
333
+ const preFillAlertOnNoData = useCallback ( ( ) => {
334
+ const md = metadata ;
335
+ if ( md && typeof md . currentOptions ?. alertOnNoData !== 'undefined' ) {
336
+ setRuleParams ( 'alertOnNoData' , md . currentOptions . alertOnNoData ) ;
337
+ } else {
338
+ setRuleParams ( 'alertOnNoData' , false ) ;
339
+ }
340
+ } , [ metadata , setRuleParams ] ) ;
341
+
317
342
const preFillAlertOnGroupDisappear = useCallback ( ( ) => {
318
343
const md = metadata ;
319
344
if ( md && typeof md . currentOptions ?. alertOnGroupDisappear !== 'undefined' ) {
320
345
setRuleParams ( 'alertOnGroupDisappear' , md . currentOptions . alertOnGroupDisappear ) ;
321
346
} else {
322
- setRuleParams ( 'alertOnGroupDisappear' , true ) ;
347
+ setRuleParams ( 'alertOnGroupDisappear' , false ) ;
323
348
}
324
349
} , [ metadata , setRuleParams ] ) ;
325
350
326
- const hasGroupBy = useMemo (
327
- ( ) => ruleParams . groupBy && ruleParams . groupBy . length > 0 ,
328
- [ ruleParams . groupBy ]
329
- ) ;
330
-
331
351
if ( paramsError ) {
332
352
return (
333
353
< >
@@ -540,30 +560,55 @@ export default function Expressions(props: Props) {
540
560
< EuiSpacer size = "s" />
541
561
< EuiCheckbox
542
562
id = "metrics-alert-group-disappear-toggle"
563
+ data-test-subj = "thresholdRuleAlertOnNoDataCheckbox"
543
564
label = {
544
565
< >
545
566
{ i18n . translate (
546
567
'xpack.observability.customThreshold.rule.alertFlyout.alertOnGroupDisappear' ,
547
568
{
548
- defaultMessage : ' Alert me if a group stops reporting data' ,
569
+ defaultMessage : " Alert me if there's no data" ,
549
570
}
550
571
) } { ' ' }
551
572
< EuiIconTip
552
573
type = "questionInCircle"
553
574
color = "subdued"
554
- content = { i18n . translate (
555
- 'xpack.observability.customThreshold.rule.alertFlyout.groupDisappearHelpText' ,
556
- {
557
- defaultMessage :
558
- 'Enable this to trigger the action if a previously detected group begins to report no results. This is not recommended for dynamically scaling infrastructures that may rapidly start and stop nodes automatically.' ,
559
- }
560
- ) }
575
+ content = {
576
+ hasGroupBy
577
+ ? i18n . translate (
578
+ 'xpack.observability.customThreshold.rule.alertFlyout.groupDisappearHelpText' ,
579
+ {
580
+ defaultMessage :
581
+ 'Enable this to trigger a no data alert if a previously detected group begins to report no results. This is not recommended for dynamically scaling infrastructures that may rapidly start and stop nodes automatically.' ,
582
+ }
583
+ )
584
+ : i18n . translate (
585
+ 'xpack.observability.customThreshold.rule.alertFlyout.noDataHelpText' ,
586
+ {
587
+ defaultMessage :
588
+ 'Enable this to trigger a no data alert if the condition(s) do not report any data over the expected time period, or if the alert fails to query Elasticsearch' ,
589
+ }
590
+ )
591
+ }
561
592
/>
562
593
</ >
563
594
}
564
- disabled = { ! hasGroupBy }
565
- checked = { Boolean ( hasGroupBy && ruleParams . alertOnGroupDisappear ) }
566
- onChange = { ( e ) => setRuleParams ( 'alertOnGroupDisappear' , e . target . checked ) }
595
+ checked = { isNoDataChecked }
596
+ onChange = { ( e ) => {
597
+ const checked = e . target . checked ;
598
+ setIsNoDataChecked ( checked ) ;
599
+ if ( ! checked ) {
600
+ setRuleParams ( 'alertOnGroupDisappear' , false ) ;
601
+ setRuleParams ( 'alertOnNoData' , false ) ;
602
+ } else {
603
+ if ( hasGroupBy ) {
604
+ setRuleParams ( 'alertOnGroupDisappear' , true ) ;
605
+ setRuleParams ( 'alertOnNoData' , false ) ;
606
+ } else {
607
+ setRuleParams ( 'alertOnGroupDisappear' , false ) ;
608
+ setRuleParams ( 'alertOnNoData' , true ) ;
609
+ }
610
+ }
611
+ } }
567
612
/>
568
613
< EuiSpacer size = "m" />
569
614
</ >
0 commit comments