JAH-1891 Threshold Engine will not update State properly if user has changed state via the API

Set the new oldState and unchangedExpressions fields in the AlarmCreatedEvent
This commit is contained in:
Craig Bryant 2014-05-29 16:43:20 -06:00
parent 47e90183cb
commit 4a25ae2f59
2 changed files with 15 additions and 2 deletions

View File

@ -80,6 +80,8 @@ public class AlarmService {
Map<String, AlarmSubExpression> oldAlarmSubExpressions; Map<String, AlarmSubExpression> oldAlarmSubExpressions;
/** Sub expressions which have had their operator or threshold changed. */ /** Sub expressions which have had their operator or threshold changed. */
Map<String, AlarmSubExpression> changedSubExpressions; Map<String, AlarmSubExpression> changedSubExpressions;
/** Sub expressions which have not changed. */
Map<String, AlarmSubExpression> unchangedSubExpressions;
/** Sub expressions which have been added to an updated alarm expression. */ /** Sub expressions which have been added to an updated alarm expression. */
Map<String, AlarmSubExpression> newAlarmSubExpressions; Map<String, AlarmSubExpression> newAlarmSubExpressions;
} }
@ -207,8 +209,9 @@ public class AlarmService {
// Notify interested parties of updated alarm // Notify interested parties of updated alarm
String event = Serialization.toJson(new AlarmUpdatedEvent(tenantId, alarmId, name, String event = Serialization.toJson(new AlarmUpdatedEvent(tenantId, alarmId, name,
description, expression, newState, enabled, subExpressions.oldAlarmSubExpressions, description, expression, newState, oldState, enabled, subExpressions.oldAlarmSubExpressions,
subExpressions.changedSubExpressions, subExpressions.newAlarmSubExpressions)); subExpressions.changedSubExpressions, subExpressions.unchangedSubExpressions,
subExpressions.newAlarmSubExpressions));
producer.send(new KeyedMessage<>(config.eventsTopic, tenantId, event)); producer.send(new KeyedMessage<>(config.eventsTopic, tenantId, event));
// Notify interested parties of transitioned alarm state // Notify interested parties of transitioned alarm state
@ -252,6 +255,11 @@ public class AlarmService {
} }
} }
// Create the list of unchanged expressions
BiMap<String, AlarmSubExpression> unchangedExpressions = HashBiMap.create(oldExpressions);
unchangedExpressions.values().removeAll(oldOrChangedExpressions);
unchangedExpressions.keySet().removeAll(changedExpressions.keySet());
// Remove old sub expressions // Remove old sub expressions
oldExpressions.values().retainAll(oldOrChangedExpressions); oldExpressions.values().retainAll(oldOrChangedExpressions);
@ -263,6 +271,7 @@ public class AlarmService {
SubExpressions subExpressions = new SubExpressions(); SubExpressions subExpressions = new SubExpressions();
subExpressions.oldAlarmSubExpressions = oldExpressions; subExpressions.oldAlarmSubExpressions = oldExpressions;
subExpressions.changedSubExpressions = changedExpressions; subExpressions.changedSubExpressions = changedExpressions;
subExpressions.unchangedSubExpressions = unchangedExpressions;
subExpressions.newAlarmSubExpressions = newExpressions; subExpressions.newAlarmSubExpressions = newExpressions;
return subExpressions; return subExpressions;
} }

View File

@ -137,6 +137,10 @@ public class AlarmServiceTest {
assertEquals(expressions.changedSubExpressions, assertEquals(expressions.changedSubExpressions,
Collections.singletonMap("222", AlarmSubExpression.of("avg(foo{instance_id=456}) <= 22"))); Collections.singletonMap("222", AlarmSubExpression.of("avg(foo{instance_id=456}) <= 22")));
// Assert unchanged expressions
assertEquals(expressions.unchangedSubExpressions,
Collections.singletonMap("111", AlarmSubExpression.of("avg(foo{instance_id=123}) > 1")));
// Assert new expressions // Assert new expressions
assertTrue(expressions.newAlarmSubExpressions.containsValue(AlarmSubExpression.of("avg(foo{instance_id=444}) > 4"))); assertTrue(expressions.newAlarmSubExpressions.containsValue(AlarmSubExpression.of("avg(foo{instance_id=444}) > 4")));
} }