Add handling of the enabled flags for Alarms. This commit just handles Alarms that are disabled on startup. An additional field needs to be added to AlarmUpdatedEvent to handle events being disabled or enabled while it is running.
Get the MetricDefinitionDAOImplTest to run although it doesn't run automatically because it depends on the mini-mon mysql
This commit is contained in:
parent
3b1deee576
commit
b8872f0632
@ -23,13 +23,14 @@ public class Alarm extends AbstractEntity {
|
||||
private AlarmExpression expression;
|
||||
private Map<String, SubAlarm> subAlarms;
|
||||
private AlarmState state;
|
||||
private boolean enabled = true;
|
||||
private String stateChangeReason;
|
||||
|
||||
public Alarm() {
|
||||
}
|
||||
|
||||
public Alarm(String id, String tenantId, String name, String description, AlarmExpression expression,
|
||||
List<SubAlarm> subAlarms, AlarmState state) {
|
||||
List<SubAlarm> subAlarms, AlarmState state, boolean enabled) {
|
||||
this.id = id;
|
||||
this.tenantId = tenantId;
|
||||
this.name = name;
|
||||
@ -37,6 +38,7 @@ public class Alarm extends AbstractEntity {
|
||||
this.expression = expression;
|
||||
setSubAlarms(subAlarms);
|
||||
this.state = state;
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
static String buildStateChangeReason(AlarmState alarmState, List<String> subAlarmExpressions) {
|
||||
@ -151,6 +153,10 @@ public class Alarm extends AbstractEntity {
|
||||
return state;
|
||||
}
|
||||
|
||||
public boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
public String getStateChangeReason() {
|
||||
return stateChangeReason;
|
||||
}
|
||||
@ -195,6 +201,10 @@ public class Alarm extends AbstractEntity {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public void setEnabled(boolean enabled) {
|
||||
this.enabled = enabled;
|
||||
}
|
||||
|
||||
public void setSubAlarms(List<SubAlarm> subAlarms) {
|
||||
this.subAlarms = new HashMap<String, SubAlarm>();
|
||||
for (SubAlarm subAlarm : subAlarms)
|
||||
|
@ -31,6 +31,8 @@ public class MetricDefinitionAndTenantId implements Serializable {
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
final MetricDefinitionAndTenantId other = (MetricDefinitionAndTenantId) obj;
|
||||
|
@ -157,6 +157,8 @@ public class MetricDefinitionAndTenantIdMatcher {
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
final DimensionSet other = (DimensionSet) obj;
|
||||
@ -207,6 +209,8 @@ public class MetricDefinitionAndTenantIdMatcher {
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
DimensionPair other = (DimensionPair) obj;
|
||||
|
@ -19,4 +19,40 @@ public class SubAlarmMetricDefinition {
|
||||
public MetricDefinitionAndTenantId getMetricDefinitionAndTenantId() {
|
||||
return metricDefinitionAndTenantId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + ((subAlarmId == null) ? 0 : subAlarmId.hashCode());
|
||||
result = prime * result + ((metricDefinitionAndTenantId == null) ? 0 : metricDefinitionAndTenantId.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (obj == null)
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
SubAlarmMetricDefinition other = (SubAlarmMetricDefinition) obj;
|
||||
return compareObjects(subAlarmId, other.subAlarmId) &&
|
||||
compareObjects(metricDefinitionAndTenantId, other.metricDefinitionAndTenantId);
|
||||
}
|
||||
|
||||
private boolean compareObjects(final Object o1, final Object o2) {
|
||||
if (o1 == o2)
|
||||
return true;
|
||||
if (o1 == null)
|
||||
return false;
|
||||
return o1.equals(o2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("SubAlarmMetricDefinition subAlarmId=%s metricDefinitionAndTenantId=%s", subAlarmId,
|
||||
metricDefinitionAndTenantId);
|
||||
}
|
||||
}
|
||||
|
@ -23,7 +23,7 @@ import com.hpcloud.mon.domain.service.SubAlarmMetricDefinition;
|
||||
public class MetricDefinitionDAOImpl implements MetricDefinitionDAO {
|
||||
private static final String METRIC_DEF_SQL = "select sa.id, a.tenant_id, sa.metric_name, sad.dimensions from alarm as a, sub_alarm as sa "
|
||||
+ "left join (select sub_alarm_id, group_concat(dimension_name, '=', value) as dimensions from sub_alarm_dimension group by sub_alarm_id) as sad on sa.id = sad.sub_alarm_id "
|
||||
+ "where a.id = sa.alarm_id and a.deleted_at is null";
|
||||
+ "where a.id = sa.alarm_id and a.enabled=1 and a.deleted_at is null";
|
||||
|
||||
private final DBI db;
|
||||
|
||||
|
@ -32,10 +32,10 @@ public class SubAlarmDAOImpl implements SubAlarmDAO {
|
||||
*/
|
||||
private static final String FIND_BY_METRIC_DEF_SQL = "select sa.* from sub_alarm sa, alarm a, sub_alarm_dimension d "
|
||||
+ "join (%s) v on d.dimension_name = v.dimension_name and d.value = v.value "
|
||||
+ "where sa.id = d.sub_alarm_id and sa.metric_name = :metric_name and a.tenant_id = :tenant_id and a.id = sa.alarm_id and a.deleted_at is null "
|
||||
+ "where sa.id = d.sub_alarm_id and sa.metric_name = :metric_name and a.tenant_id = :tenant_id and a.id = sa.alarm_id and a.enabled=1 and a.deleted_at is null "
|
||||
+ "group by d.sub_alarm_id having count(d.sub_alarm_id) = %s";
|
||||
private static final String FIND_BY_METRIC_DEF_NO_DIMS_SQL = "select * from sub_alarm sa where sa.metric_name = :metric_name "
|
||||
+ "and a.tenant_id = :tenant_id and a.id = sa.alarm_id and a.deleted_at is null and (select count(*) from sub_alarm_dimension where sub_alarm_id = sa.id) = 0";
|
||||
private static final String FIND_BY_METRIC_DEF_NO_DIMS_SQL = "select sa.* from sub_alarm sa, alarm a where sa.metric_name = :metric_name "
|
||||
+ "and a.tenant_id = :tenant_id and a.id = sa.alarm_id and a.enabled=1 and a.deleted_at is null and (select count(*) from sub_alarm_dimension where sub_alarm_id = sa.id) = 0";
|
||||
|
||||
private final DBI db;
|
||||
|
||||
|
@ -184,6 +184,10 @@ public class AlarmThresholdingBolt extends BaseRichBolt {
|
||||
alarm = alarmDAO.findById(alarmId);
|
||||
if (alarm == null)
|
||||
LOG.error("Failed to locate alarm for id {}", alarmId);
|
||||
else if (!alarm.isEnabled()) {
|
||||
LOG.warn("Ignoring Alarm {} named '{}' because it is disabled", alarmId, alarm.getName());
|
||||
return null;
|
||||
}
|
||||
else {
|
||||
for (final SubAlarm subAlarm : alarm.getSubAlarms()) {
|
||||
subAlarm.setNoState(true);
|
||||
|
@ -84,7 +84,7 @@ public class ThresholdingEngineTest extends TopologyTestCase {
|
||||
@Override
|
||||
public Alarm answer(InvocationOnMock invocation) throws Throwable {
|
||||
return new Alarm(TEST_ALARM_ID, TEST_ALARM_TENANT_ID, TEST_ALARM_NAME,
|
||||
TEST_ALARM_DESCRIPTION, expression, subAlarmsFor(expression), AlarmState.OK);
|
||||
TEST_ALARM_DESCRIPTION, expression, subAlarmsFor(expression), AlarmState.OK, Boolean.TRUE);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -81,10 +81,10 @@ public class ThresholdingEngineTest1 extends TopologyTestCase {
|
||||
public Alarm answer(InvocationOnMock invocation) throws Throwable {
|
||||
if (invocation.getArguments()[0].equals("1"))
|
||||
return new Alarm("1", BOB_TENANT_ID, "test-alarm", "Descr of test-alarm", expression, Arrays.asList(createCpuSubAlarm(),
|
||||
createMemSubAlarm()), AlarmState.OK);
|
||||
createMemSubAlarm()), AlarmState.OK, Boolean.TRUE);
|
||||
else if (invocation.getArguments()[0].equals("2"))
|
||||
return new Alarm("2", JOE_TENANT_ID, "joes-alarm", "Descr of joes-alarm", customExpression,
|
||||
Arrays.asList(createCustomSubAlarm()), AlarmState.OK);
|
||||
Arrays.asList(createCustomSubAlarm()), AlarmState.OK, Boolean.TRUE);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
@ -21,6 +21,7 @@ public class AlarmTest {
|
||||
private static final String TEST_ALARM_TENANT_ID = "joe";
|
||||
private static final String TEST_ALARM_NAME = "test alarm";
|
||||
private static final String TEST_ALARM_DESCRIPTION = "Description of test alarm";
|
||||
private static Boolean ALARM_ENABLED = Boolean.FALSE;
|
||||
|
||||
public void shouldBeUndeterminedIfAnySubAlarmIsUndetermined() {
|
||||
AlarmExpression expr = new AlarmExpression(
|
||||
@ -29,7 +30,7 @@ public class AlarmTest {
|
||||
AlarmState.UNDETERMINED);
|
||||
SubAlarm subAlarm2 = new SubAlarm("456", TEST_ALARM_ID, expr.getSubExpressions().get(1), AlarmState.ALARM);
|
||||
Alarm alarm = new Alarm(TEST_ALARM_ID, TEST_ALARM_TENANT_ID, TEST_ALARM_NAME, TEST_ALARM_DESCRIPTION, expr,
|
||||
Arrays.asList(subAlarm1, subAlarm2), AlarmState.UNDETERMINED);
|
||||
Arrays.asList(subAlarm1, subAlarm2), AlarmState.UNDETERMINED, ALARM_ENABLED);
|
||||
|
||||
assertFalse(alarm.evaluate());
|
||||
assertEquals(alarm.getState(), AlarmState.UNDETERMINED);
|
||||
@ -42,7 +43,7 @@ public class AlarmTest {
|
||||
SubAlarm subAlarm2 = new SubAlarm("456", TEST_ALARM_ID, expr.getSubExpressions().get(1));
|
||||
|
||||
Alarm alarm = new Alarm(TEST_ALARM_ID, TEST_ALARM_TENANT_ID, TEST_ALARM_NAME, TEST_ALARM_DESCRIPTION,
|
||||
expr, Arrays.asList(subAlarm1, subAlarm2), AlarmState.UNDETERMINED);
|
||||
expr, Arrays.asList(subAlarm1, subAlarm2), AlarmState.UNDETERMINED, ALARM_ENABLED);
|
||||
|
||||
assertFalse(alarm.evaluate());
|
||||
assertEquals(alarm.getState(), AlarmState.UNDETERMINED);
|
||||
@ -76,7 +77,7 @@ public class AlarmTest {
|
||||
SubAlarm subAlarm2 = new SubAlarm("456", TEST_ALARM_ID, expr.getSubExpressions().get(1));
|
||||
|
||||
Alarm alarm = new Alarm(TEST_ALARM_ID, TEST_ALARM_TENANT_ID, TEST_ALARM_NAME, TEST_ALARM_DESCRIPTION,
|
||||
expr, Arrays.asList(subAlarm1, subAlarm2), AlarmState.UNDETERMINED);
|
||||
expr, Arrays.asList(subAlarm1, subAlarm2), AlarmState.UNDETERMINED, ALARM_ENABLED);
|
||||
|
||||
assertFalse(alarm.evaluate());
|
||||
assertEquals(alarm.getState(), AlarmState.UNDETERMINED);
|
||||
|
@ -29,6 +29,7 @@ public class AlarmDAOImplTest {
|
||||
private static final String ALARM_ID = "123";
|
||||
private static String ALARM_NAME = "90% CPU";
|
||||
private static String ALARM_DESCR = "Description for " + ALARM_NAME;
|
||||
private static Boolean ALARM_ENABLED = Boolean.FALSE;
|
||||
|
||||
private DBI db;
|
||||
private Handle handle;
|
||||
@ -54,9 +55,9 @@ public class AlarmDAOImplTest {
|
||||
handle.execute("truncate table sub_alarm_dimension");
|
||||
handle.execute("truncate table alarm_action");
|
||||
|
||||
String sql = String.format("insert into alarm (id, tenant_id, name, description, expression, state, created_at, updated_at) "
|
||||
+ "values ('%s', '%s', '%s', '%s', 'avg(hpcs.compute{disk=vda, instance_id=123, metric_name=cpu}) > 10', 'UNDETERMINED', NOW(), NOW())",
|
||||
ALARM_ID, TENANT_ID, ALARM_NAME, ALARM_DESCR);
|
||||
String sql = String.format("insert into alarm (id, tenant_id, name, description, expression, state, enabled, created_at, updated_at) "
|
||||
+ "values ('%s', '%s', '%s', '%s', 'avg(hpcs.compute{disk=vda, instance_id=123, metric_name=cpu}) > 10', 'UNDETERMINED', %d, NOW(), NOW())",
|
||||
ALARM_ID, TENANT_ID, ALARM_NAME, ALARM_DESCR, ALARM_ENABLED ? 1 : 0);
|
||||
handle.execute(sql);
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, metric_name, operator, threshold, period, periods, created_at, updated_at) "
|
||||
+ "values ('111', '123', 'AVG', 'hpcs.compute', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
@ -71,7 +72,7 @@ public class AlarmDAOImplTest {
|
||||
String expr = "avg(hpcs.compute{disk=vda, instance_id=123, metric_name=cpu}) > 10";
|
||||
Alarm expected = new Alarm(ALARM_ID, TENANT_ID, ALARM_NAME, ALARM_DESCR, AlarmExpression.of(expr),
|
||||
Arrays.asList(new SubAlarm("111", ALARM_ID, AlarmSubExpression.of(expr))),
|
||||
AlarmState.UNDETERMINED);
|
||||
AlarmState.UNDETERMINED, Boolean.FALSE);
|
||||
|
||||
Alarm alarm = dao.findById(ALARM_ID);
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.hpcloud.mon.infrastructure.persistence;
|
||||
|
||||
import static org.testng.Assert.assertTrue;
|
||||
import static org.testng.Assert.assertFalse;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@ -14,71 +15,103 @@ import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.hpcloud.mon.common.model.metric.MetricDefinition;
|
||||
import com.hpcloud.mon.domain.model.MetricDefinitionAndTenantId;
|
||||
import com.hpcloud.mon.domain.service.MetricDefinitionDAO;
|
||||
import com.hpcloud.mon.domain.service.SubAlarmMetricDefinition;
|
||||
|
||||
/**
|
||||
* Note: MySQL dependent test.
|
||||
* Note: MySQL dependent test because of the group_concat() used in the SQL in MetricDefinitionDAOImpl.
|
||||
* Depends on the MySQL in mini-mon.
|
||||
*
|
||||
* @author Jonathan Halterman
|
||||
*/
|
||||
@Test(groups = "database")
|
||||
public class MetricDefinitionDAOImplTest {
|
||||
private static final String TENANT_ID = "42";
|
||||
private DBI db;
|
||||
private Handle handle;
|
||||
private MetricDefinitionDAO dao;
|
||||
private List<SubAlarmMetricDefinition> expected;
|
||||
|
||||
@BeforeClass
|
||||
protected void setupClass() throws Exception {
|
||||
db = new DBI("jdbc:mysql://localhost/maas", "root", "password");
|
||||
db = new DBI("jdbc:mysql://192.168.10.6/mon", "thresh", "password");
|
||||
handle = db.open();
|
||||
dao = new MetricDefinitionDAOImpl(db);
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
protected void afterClass() {
|
||||
cleanUp();
|
||||
handle.close();
|
||||
}
|
||||
|
||||
@BeforeMethod
|
||||
protected void beforeMethod() {
|
||||
handle.execute("delete from sub_alarm where id in (111, 222, 333)");
|
||||
handle.execute("delete from sub_alarm_dimension where sub_alarm_id in (111, 222, 333)");
|
||||
cleanUp();
|
||||
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, namespace, operator, threshold, period, periods, state, created_at, updated_at) "
|
||||
+ "values ('111', '123', 'AVG', 'hpcs.compute', 'GT', 10, 60, 1, 'OK', NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('111', 'metric_name', 'cpu')");
|
||||
handle.execute("insert into alarm (id, tenant_id, name, description, expression, state, enabled, created_at, updated_at) "
|
||||
+ "values ('123', '" + TENANT_ID + "', 'Test Alarm', 'Test Alarm Description', 'Not real expr', 'OK', '1', NOW(), NOW())");
|
||||
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, metric_name, operator, threshold, period, periods, state, created_at, updated_at) "
|
||||
+ "values ('111', '123', 'AVG', 'cpu', 'GT', 10, 60, 1, 'OK', NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('111', 'device', '1')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('111', 'instance_id', '777')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('111', 'image_id', '888')");
|
||||
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, namespace, operator, threshold, period, periods, state, created_at, updated_at) "
|
||||
+ "values ('222', '123', 'AVG', 'hpcs.compute', 'GT', 10, 60, 1, 'OK', NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('222', 'metric_name', 'mem')");
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, metric_name, operator, threshold, period, periods, state, created_at, updated_at) "
|
||||
+ "values ('222', '123', 'AVG', 'mem', 'GT', 10, 60, 1, 'OK', NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('222', 'instance_id', '123')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('222', 'az', '2')");
|
||||
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, namespace, operator, threshold, period, periods, state, created_at, updated_at) "
|
||||
+ "values ('333', '123', 'AVG', 'foo', 'GT', 10, 60, 1, 'OK', NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('333', 'metric_name', 'bar')");
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, metric_name, operator, threshold, period, periods, state, created_at, updated_at) "
|
||||
+ "values ('333', '123', 'AVG', 'bar', 'GT', 10, 60, 1, 'OK', NOW(), NOW())");
|
||||
SubAlarmMetricDefinition metricDef1 = new SubAlarmMetricDefinition("111",
|
||||
new MetricDefinitionAndTenantId(new MetricDefinition("cpu",
|
||||
ImmutableMap.<String, String>builder()
|
||||
.put("device", "1")
|
||||
.put("instance_id", "777")
|
||||
.put("image_id", "888")
|
||||
.build()), TENANT_ID));
|
||||
SubAlarmMetricDefinition metricDef2 = new SubAlarmMetricDefinition("222",
|
||||
new MetricDefinitionAndTenantId(new MetricDefinition("mem",
|
||||
ImmutableMap.<String, String>builder()
|
||||
.put("az", "2")
|
||||
.put("instance_id", "123")
|
||||
.build()), TENANT_ID));
|
||||
SubAlarmMetricDefinition metricDef3 = new SubAlarmMetricDefinition("333",
|
||||
new MetricDefinitionAndTenantId(new MetricDefinition("bar",
|
||||
null), TENANT_ID));
|
||||
expected = Arrays.asList(metricDef1, metricDef2, metricDef3);
|
||||
}
|
||||
|
||||
private void cleanUp() {
|
||||
handle.execute("delete from sub_alarm where id in (111, 222, 333)");
|
||||
handle.execute("delete from sub_alarm_dimension where sub_alarm_id in (111, 222, 333)");
|
||||
handle.execute("delete from alarm where id in (123)");
|
||||
}
|
||||
|
||||
public void shouldFindForAlarms() {
|
||||
MetricDefinition metricDef1 = new MetricDefinition("hpcs.compute",
|
||||
ImmutableMap.<String, String>builder()
|
||||
.put("metric_name", "cpu")
|
||||
.put("device", "1")
|
||||
.put("instance_id", "777")
|
||||
.build());
|
||||
MetricDefinition metricDef2 = new MetricDefinition("hpcs.compute",
|
||||
ImmutableMap.<String, String>builder()
|
||||
.put("metric_name", "mem")
|
||||
.put("az", "2")
|
||||
.put("instance_id", "123")
|
||||
.build());
|
||||
MetricDefinition metricDef3 = new MetricDefinition("foo",
|
||||
ImmutableMap.<String, String>builder().put("metric_name", "bar").build());
|
||||
List<MetricDefinition> expected = Arrays.asList(metricDef1, metricDef2, metricDef3);
|
||||
|
||||
assertTrue(dao.findForAlarms().containsAll(expected));
|
||||
|
||||
List<SubAlarmMetricDefinition> found = dao.findForAlarms();
|
||||
for (final SubAlarmMetricDefinition toFind : expected)
|
||||
assertTrue(found.contains(toFind), "Did not find " + toFind);
|
||||
}
|
||||
|
||||
public void shouldNotFindDisabledAlarms() {
|
||||
handle.execute("update alarm set enabled=0 where id in ('123')");
|
||||
|
||||
List<SubAlarmMetricDefinition> found = dao.findForAlarms();
|
||||
for (final SubAlarmMetricDefinition toFind : expected)
|
||||
assertFalse(found.contains(toFind), "Should not have found " + toFind);
|
||||
}
|
||||
|
||||
public void shouldNotFindDeletedAlarms() {
|
||||
handle.execute("update alarm set deleted_at=NOW() where id in ('123')");
|
||||
|
||||
List<SubAlarmMetricDefinition> found = dao.findForAlarms();
|
||||
for (final SubAlarmMetricDefinition toFind : expected)
|
||||
assertFalse(found.contains(toFind), "Should not have found " + toFind);
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,6 @@
|
||||
package com.hpcloud.mon.infrastructure.persistence;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
import static org.testng.Assert.assertNotEquals;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Arrays;
|
||||
@ -14,7 +13,6 @@ import org.testng.annotations.BeforeClass;
|
||||
import org.testng.annotations.BeforeMethod;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.io.Resources;
|
||||
import com.hpcloud.mon.common.model.alarm.AlarmState;
|
||||
import com.hpcloud.mon.common.model.alarm.AlarmSubExpression;
|
||||
@ -63,41 +61,37 @@ public class SubAlarmDAOImplTest {
|
||||
+ "values ('456', '" + TENANT_ID + "', 'Test Alarm4', 'Test Alarm4 Description', 'Not real expr', 'OK', '1', NOW(), NOW())");
|
||||
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, metric_name, operator, threshold, period, periods, created_at, updated_at) "
|
||||
+ "values ('111', '123', 'AVG', 'hpcs.compute', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
+ "values ('111', '123', 'AVG', 'cpu', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('111', 'instance_id', '555')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('111', 'az', '1')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('111', 'instance_uuid', '555')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('111', 'metric_name', 'cpu')");
|
||||
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, metric_name, operator, threshold, period, periods, created_at, updated_at) "
|
||||
+ "values ('222', '234', 'AVG', 'hpcs.compute', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
+ "values ('222', '234', 'AVG', 'cpu', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('222', 'instance_id', '666')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('222', 'az', '1')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('222', 'instance_uuid', '666')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('222', 'metric_name', 'cpu')");
|
||||
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, metric_name, operator, threshold, period, periods, created_at, updated_at) "
|
||||
+ "values ('333', '345', 'AVG', 'hpcs.compute', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
+ "values ('333', '345', 'AVG', 'disk', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('333', 'instance_id', '777')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('333', 'az', '1')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('333', 'instance_uuid', '777')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('333', 'metric_name', 'disk')");
|
||||
handle.execute("insert into sub_alarm_dimension values ('333', 'device', 'vda')");
|
||||
|
||||
handle.execute("insert into sub_alarm (id, alarm_id, function, metric_name, operator, threshold, period, periods, created_at, updated_at) "
|
||||
+ "values ('444', '456', 'AVG', 'hpcs.compute', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
handle.execute("insert into sub_alarm_dimension values ('444', 'metric_name', 'cpu')");
|
||||
+ "values ('444', '456', 'AVG', 'cpu', 'GT', 10, 60, 1, NOW(), NOW())");
|
||||
}
|
||||
|
||||
public void shouldFind() {
|
||||
List<SubAlarm> expected = Arrays.asList(new SubAlarm("111", "123",
|
||||
AlarmSubExpression.of("avg(hpcs.compute{instance_id=555,az=1,metric_name=cpu}) > 10"),
|
||||
AlarmSubExpression.of("avg(cpu{instance_id=555,az=1}) > 10"),
|
||||
AlarmState.UNDETERMINED));
|
||||
List<SubAlarm> subAlarms = dao.find(new MetricDefinitionAndTenantId(expected.get(0).getExpression().getMetricDefinition(), TENANT_ID));
|
||||
assertEquals(subAlarms, expected);
|
||||
|
||||
expected = Arrays.asList(new SubAlarm("222", "234",
|
||||
AlarmSubExpression.of("avg(hpcs.compute{instance_id=666,az=1,metric_name=cpu}) > 10"),
|
||||
AlarmSubExpression.of("avg(cpu{instance_id=666,az=1}) > 10"),
|
||||
AlarmState.UNDETERMINED));
|
||||
subAlarms = dao.find(new MetricDefinitionAndTenantId(expected.get(0).getExpression().getMetricDefinition(), TENANT_ID));
|
||||
assertEquals(subAlarms, expected);
|
||||
@ -105,28 +99,38 @@ public class SubAlarmDAOImplTest {
|
||||
|
||||
public void shouldNotFind() {
|
||||
final String badTenantId = TENANT_ID + "42";
|
||||
List<SubAlarm> subAlarms = dao.find(new MetricDefinitionAndTenantId(AlarmSubExpression.of("avg(hpcs.compute{instance_id=555,az=1,metric_name=cpu}) > 10").getMetricDefinition(), badTenantId));
|
||||
List<SubAlarm> subAlarms = dao.find(new MetricDefinitionAndTenantId(AlarmSubExpression.of("avg(cpu{instance_id=555,az=1}) > 10").getMetricDefinition(), badTenantId));
|
||||
assertEquals(subAlarms.size(), 0);
|
||||
|
||||
subAlarms = dao.find(new MetricDefinitionAndTenantId(AlarmSubExpression.of("avg(hpcs.compute{instance_id=666,az=1,metric_name=cpu}) > 10").getMetricDefinition(), badTenantId));
|
||||
subAlarms = dao.find(new MetricDefinitionAndTenantId(AlarmSubExpression.of("avg(cpu{instance_id=666,az=1}) > 10").getMetricDefinition(), badTenantId));
|
||||
assertEquals(subAlarms.size(), 0);
|
||||
}
|
||||
|
||||
public void shouldNotFindDisabledAlarm() {
|
||||
handle.execute("update alarm set enabled=0 where id='123' or id='456'");
|
||||
|
||||
final String badTenantId = TENANT_ID;
|
||||
List<SubAlarm> subAlarms = dao.find(new MetricDefinitionAndTenantId(AlarmSubExpression.of("avg(cpu{instance_id=555,az=1}) > 10").getMetricDefinition(), badTenantId));
|
||||
assertEquals(subAlarms.size(), 0);
|
||||
|
||||
subAlarms = dao.find(new MetricDefinitionAndTenantId(new MetricDefinition("cpu", null), TENANT_ID));
|
||||
assertEquals(subAlarms.size(), 0);
|
||||
}
|
||||
|
||||
public void shouldFindWithSubject() {
|
||||
List<SubAlarm> expected = Arrays.asList(new SubAlarm(
|
||||
"333",
|
||||
"345",
|
||||
AlarmSubExpression.of("avg(hpcs.compute{instance_id=777,az=1,metric_name=disk,device=vda}) > 10"),
|
||||
AlarmSubExpression.of("avg(disk{instance_id=777,az=1,device=vda}) > 10"),
|
||||
AlarmState.UNDETERMINED));
|
||||
List<SubAlarm> subAlarms = dao.find(new MetricDefinitionAndTenantId(expected.get(0).getExpression().getMetricDefinition(), TENANT_ID));
|
||||
assertEquals(subAlarms, expected);
|
||||
}
|
||||
|
||||
public void shouldFailFindForNullDimensions() {
|
||||
public void shouldFindForNullDimensions() {
|
||||
List<SubAlarm> expected = Arrays.asList(new SubAlarm("444", "456",
|
||||
AlarmSubExpression.of("avg(hpcs.compute{metric_name=cpu}) > 10"), AlarmState.UNDETERMINED));
|
||||
List<SubAlarm> subAlarms = dao.find(new MetricDefinitionAndTenantId(new MetricDefinition("hpcs.compute",
|
||||
new ImmutableMap.Builder<String, String>().put("metric_name", "cpu").build()), TENANT_ID));
|
||||
assertNotEquals(subAlarms, expected);
|
||||
AlarmSubExpression.of("avg(cpu{}) > 10"), AlarmState.UNDETERMINED));
|
||||
List<SubAlarm> subAlarms = dao.find(new MetricDefinitionAndTenantId(new MetricDefinition("cpu", null), TENANT_ID));
|
||||
assertEquals(subAlarms, expected);
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,8 @@ public class EventProcessingBoltTest {
|
||||
"and max(hpcs.compute.load{instance_id=123,device=42}) > 5";
|
||||
alarmExpression = new AlarmExpression(expression);
|
||||
subAlarms = createSubAlarms(alarmId, alarmExpression);
|
||||
alarm = new Alarm(alarmId, TENANT_ID, name, description, alarmExpression, subAlarms, AlarmState.UNDETERMINED);
|
||||
alarm = new Alarm(alarmId, TENANT_ID, name, description, alarmExpression, subAlarms,
|
||||
AlarmState.UNDETERMINED, Boolean.TRUE);
|
||||
}
|
||||
|
||||
private List<SubAlarm> createSubAlarms(final String alarmId,
|
||||
|
@ -22,6 +22,7 @@ CREATE TABLE `sub_alarm` (
|
||||
`period` int(11) NOT NULL,
|
||||
`periods` int(11) NOT NULL,
|
||||
`state` varchar(20) NOT NULL,
|
||||
`enabled` tinyint(1) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
|
Loading…
x
Reference in New Issue
Block a user