Fixed query for sub alarms by metric def

This commit is contained in:
Jonathan Halterman 2013-07-13 11:36:00 -07:00
parent e977098414
commit 8f15c332b5
2 changed files with 37 additions and 34 deletions

View File

@ -32,10 +32,7 @@ public class SubAlarmDAOImpl implements SubAlarmDAO {
private static final String FIND_BY_METRIC_DEF_SQL = "select sa.* from sub_alarm sa, 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.namespace = :namespace and sa.metric_type = :metricType and sa.metric_subject %s "
+ "group by d.sub_alarm_id"; // having count(d.sub_alarm_id) = (select count(*) from
// sub_alarm_dimension where sub_alarm_id = d.sub_alarm_id) //
// Removed temporarily since we don't receive all of the expected
// dimensions for collectd metrics
+ "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.namespace = :namespace "
+ "and sa.metric_type = :metricType and sa.metric_subject %s and (select count(*) from sub_alarm_dimension where sub_alarm_id = sa.id) = 0";
@ -58,7 +55,8 @@ public class SubAlarmDAOImpl implements SubAlarmDAO {
else {
String unionAllStatement = SqlStatements.unionAllStatementFor(metricDefinition.dimensions,
"dimension_name", "value");
sql = String.format(FIND_BY_METRIC_DEF_SQL, unionAllStatement, subjectSql);
sql = String.format(FIND_BY_METRIC_DEF_SQL, unionAllStatement, subjectSql,
metricDefinition.dimensions.size());
}
Query<Map<String, Object>> query = h.createQuery(sql)
@ -77,6 +75,7 @@ public class SubAlarmDAOImpl implements SubAlarmDAO {
operator, (Double) row.get("threshold"), (Integer) row.get("period"),
(Integer) row.get("periods"));
SubAlarm subAlarm = new SubAlarm(subAlarmId, (String) row.get("alarm_id"), subExpression);
subAlarms.add(subAlarm);
}

View File

@ -4,9 +4,7 @@ import static org.testng.Assert.assertEquals;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.skife.jdbi.v2.DBI;
import org.skife.jdbi.v2.Handle;
@ -51,46 +49,52 @@ public class SubAlarmDAOImplTest {
handle.execute("insert into sub_alarm (id, alarm_id, function, namespace, metric_type, metric_subject, operator, threshold, period, periods, created_at, updated_at) "
+ "values ('111', '123', 'AVG', 'hpcs.compute', 'cpu', null, 'GT', 10, 60, 1, NOW(), NOW())");
handle.execute("insert into sub_alarm_dimension values ('111', 'flavor_id', '777')");
handle.execute("insert into sub_alarm_dimension values ('111', 'image_id', '888')");
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 (id, alarm_id, function, namespace, metric_type, metric_subject, operator, threshold, period, periods, created_at, updated_at) "
+ "values ('222', '456', 'AVG', 'hpcs.compute', 'cpu', '1', 'GTE', 20, 60, 1, NOW(), NOW())");
handle.execute("insert into sub_alarm_dimension values ('222', 'flavor_id', '777')");
handle.execute("insert into sub_alarm_dimension values ('222', 'image_id', '888')");
+ "values ('222', '234', 'AVG', 'hpcs.compute', 'cpu', null, '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 (id, alarm_id, function, namespace, metric_type, metric_subject, operator, threshold, period, periods, created_at, updated_at) "
+ "values ('333', '456', 'AVG', 'hpcs.compute', 'cpu', '1', 'LT', 10, 60, 1, NOW(), NOW())");
handle.execute("insert into sub_alarm_dimension values ('333', 'flavor_id', '333')");
handle.execute("insert into sub_alarm_dimension values ('333', 'image_id', '999999')");
+ "values ('333', '345', 'AVG', 'hpcs.compute', 'disk', 'vda', '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 (id, alarm_id, function, namespace, metric_type, metric_subject, operator, threshold, period, periods, created_at, updated_at) "
+ "values ('444', '456', 'AVG', 'hpcs.compute', 'cpu', null, 'GT', 10, 60, 1, NOW(), NOW())");
}
public void shouldFind() {
List<SubAlarm> expected = Arrays.asList(new SubAlarm("111", "123",
AlarmSubExpression.of("avg(hpcs.compute:cpu:{instance_id=555,az=1}) > 10"),
AlarmState.UNDETERMINED));
List<SubAlarm> subAlarms = dao.find(expected.get(0).getExpression().getMetricDefinition());
assertEquals(subAlarms, expected);
expected = Arrays.asList(new SubAlarm("222", "234",
AlarmSubExpression.of("avg(hpcs.compute:cpu:{instance_id=666,az=1}) > 10"),
AlarmState.UNDETERMINED));
subAlarms = dao.find(expected.get(0).getExpression().getMetricDefinition());
assertEquals(subAlarms, expected);
}
public void shouldFindWithSubject() {
List<SubAlarm> expected = Arrays.asList(new SubAlarm("333", "345",
AlarmSubExpression.of("avg(hpcs.compute:disk:vda:{instance_id=777,az=1}) > 10"),
AlarmState.UNDETERMINED));
List<SubAlarm> subAlarms = dao.find(expected.get(0).getExpression().getMetricDefinition());
assertEquals(subAlarms, expected);
}
public void shouldFindForNullDimensions() {
List<SubAlarm> expected = Arrays.asList(new SubAlarm("444", "456",
AlarmSubExpression.of("avg(hpcs.compute:cpu) > 10"), AlarmState.UNDETERMINED));
List<SubAlarm> subAlarms = dao.find(new MetricDefinition("hpcs.compute", "cpu", null, null));
assertEquals(subAlarms, expected);
}
public void shouldFind() {
List<SubAlarm> expected = Arrays.asList(new SubAlarm("111", "123",
AlarmSubExpression.of("avg(hpcs.compute:cpu:{flavor_id=777,image_id=888}) > 10"),
AlarmState.UNDETERMINED));
Map<String, String> dimensions = new HashMap<String, String>();
dimensions.put("flavor_id", "777");
dimensions.put("image_id", "888");
List<SubAlarm> subAlarms = dao.find(new MetricDefinition("hpcs.compute", "cpu", null,
dimensions));
assertEquals(subAlarms, expected);
expected = Arrays.asList(new SubAlarm("222", "456",
AlarmSubExpression.of("avg(hpcs.compute:cpu:1:{flavor_id=777,image_id=888}) >= 20"),
AlarmState.UNDETERMINED));
subAlarms = dao.find(new MetricDefinition("hpcs.compute", "cpu", "1", dimensions));
assertEquals(subAlarms, expected);
}
}