modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java | 40 ++++++++++ modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java | 35 ++++++++ 2 files changed, 75 insertions(+)
New commits: commit 1806c68325b77f7d6f396fa40eb999c0911414f5 Author: John Sanda jsanda@redhat.com Date: Tue Dec 4 12:33:25 2012 -0500
add method to fetch raw metrics for multiple schedule ids
This is needed for fetching data for a resource group.
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java index c6a5d40..0b64f94 100644 --- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java +++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java @@ -29,6 +29,7 @@ import static com.datastax.driver.core.utils.querybuilder.Clause.eq; import static com.datastax.driver.core.utils.querybuilder.Clause.gte; import static com.datastax.driver.core.utils.querybuilder.Clause.lt; import static com.datastax.driver.core.utils.querybuilder.QueryBuilder.select; +import static org.rhq.core.util.StringUtil.listToString;
import java.util.ArrayList; import java.util.Date; @@ -195,6 +196,45 @@ public class MetricsDAO { } }
+ public List<RawNumericMetric> findRawMetrics(List<Integer> scheduleIds, DateTime startTime, DateTime endTime) { + try { + // TODO investigate possible bug in datastax driver for binding lists as parameters + // I was not able to get the below query working by directly binding the List + // object. From a quick glance at the driver code, it looks like it might not + // yet be properly supported in which case we need to report a bug. + // + // jsanda + +// String cql = "SELECT schedule_id, time, value FROM " + RAW_METRICS_TABLE + +// " WHERE schedule_id IN (?) AND time >= ? AND time < ? ORDER BY time"; +// PreparedStatement statement = session.prepare(cql); +// BoundStatement boundStatement = statement.bind(scheduleIds, startTime.toDate(), endTime.toDate()); +// ResultSet resultSet = session.execute(boundStatement); +// String cql = +// select("schedule_id", "time", "value") +// .from(RAW_METRICS_TABLE) +// .where( +// in("schedule_id", listToString(scheduleIds)), +// gte("time", startTime.toDate()), +// lt("time", endTime.toDate())) +// .getQueryString(); + + String cql = "SELECT schedule_id, time, value FROM " + RAW_METRICS_TABLE + " WHERE schedule_id IN (" + + listToString(scheduleIds) + ") AND time >= " + startTime.getMillis() + " AND time <= " + + endTime.getMillis(); + ResultSet resultSet = session.execute(cql); + + List<RawNumericMetric> metrics = new ArrayList<RawNumericMetric>(); + ResultSetMapper<RawNumericMetric> resultSetMapper = new RawNumericMetricMapper(false); + for (Row row : resultSet) { + metrics.add(resultSetMapper.map(row)); + } + return metrics; + } catch (NoHostAvailableException e) { + throw new CQLException(e); + } + } + public List<AggregatedNumericMetric> findAggregateMetrics(String bucket, int scheduleId) { try { String cql = diff --git a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java index d5ed264..7bbea11 100644 --- a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java +++ b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java @@ -113,6 +113,41 @@ public class MetricsDAOTest extends CassandraIntegrationTest { }
@Test + public void findRawMetricsForMultipleSchedules() throws Exception { + DateTime currentTime = hour0().plusHours(4).plusMinutes(44); + DateTime currentHour = currentTime.hourOfDay().roundFloorCopy(); + DateTime threeMinutesAgo = currentTime.minusMinutes(3); + DateTime twoMinutesAgo = currentTime.minusMinutes(2); + DateTime oneMinuteAgo = currentTime.minusMinutes(1); + + int scheduleId1 = 1; + int scheduleId2 = 2; + + Set<MeasurementDataNumeric> data = new HashSet<MeasurementDataNumeric>(); + data.add(new MeasurementDataNumeric(threeMinutesAgo.getMillis(), scheduleId1, 1.1)); + data.add(new MeasurementDataNumeric(threeMinutesAgo.getMillis(), scheduleId2, 1.2)); + data.add(new MeasurementDataNumeric(twoMinutesAgo.getMillis(), scheduleId1, 2.1)); + data.add(new MeasurementDataNumeric(twoMinutesAgo.getMillis(), scheduleId2, 2.2)); + data.add(new MeasurementDataNumeric(oneMinuteAgo.getMillis(), scheduleId1, 3.1)); + data.add(new MeasurementDataNumeric(oneMinuteAgo.getMillis(), scheduleId2, 3.2)); + + int ttl = Hours.ONE.toStandardSeconds().getSeconds(); + Set<MeasurementDataNumeric> actualUpdates = dao.insertRawMetrics(data, ttl); + + List<RawNumericMetric> actualMetrics = dao.findRawMetrics(asList(scheduleId1, scheduleId2), currentHour, + currentHour.plusHours(1)); + List<RawNumericMetric> expectedMetrics = asList( + new RawNumericMetric(scheduleId1, threeMinutesAgo.getMillis(), 1.1), + new RawNumericMetric(scheduleId1, twoMinutesAgo.getMillis(), 2.1), + new RawNumericMetric(scheduleId1, oneMinuteAgo.getMillis(), 3.1), + new RawNumericMetric(scheduleId2, threeMinutesAgo.getMillis(), 1.2), + new RawNumericMetric(scheduleId2, twoMinutesAgo.getMillis(), 2.2), + new RawNumericMetric(scheduleId2, oneMinuteAgo.getMillis(), 3.2) + ); + assertEquals(actualMetrics, expectedMetrics, "Failed to find raw metrics for multiple schedules"); + } + + @Test public void insertAndFindAllOneHourMetrics() { int scheduleId = 1; DateTime hour0 = hour0();
rhq-commits@lists.fedorahosted.org