modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregateMetricMapper.java
| 67 ++++++++--
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregatedNumericMetric.java
| 35 ++++-
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsDAO.java
| 31 ++++
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
| 5
modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsDAOTest.java
| 37 ++++-
modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
| 8 -
6 files changed, 151 insertions(+), 32 deletions(-)
New commits:
commit 12f40390c71ad5138194fd2d5487668be5eaffe1
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu Nov 29 22:41:28 2012 -0500
set the TTL for 1hr, 6hr, and 24hr data
diff --git
a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregateMetricMapper.java
b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregateMetricMapper.java
index c95ed3f..58642ed 100644
---
a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregateMetricMapper.java
+++
b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregateMetricMapper.java
@@ -35,6 +35,62 @@ import com.datastax.driver.core.Row;
*/
public class AggregateMetricMapper implements
ResultSetMapper<AggregatedNumericMetric> {
+ private ResultSetMapper<AggregatedNumericMetric> resultSetMapper;
+
+ public AggregateMetricMapper() {
+ this(false);
+ }
+
+ public AggregateMetricMapper(boolean includeMetadata) {
+ if (includeMetadata) {
+ resultSetMapper = new ResultSetMapper<AggregatedNumericMetric>() {
+ @Override
+ public AggregatedNumericMetric map(ResultSet resultSet) throws
SQLException {
+ return null;
+ }
+
+ @Override
+ public AggregatedNumericMetric map(Row... row) {
+ AggregatedNumericMetric metric = new AggregatedNumericMetric();
+ metric.setScheduleId(row[0].getInt(0));
+ metric.setTimestamp(row[0].getDate(1).getTime());
+ metric.setMax(row[0].getDouble(3));
+ metric.setMin(row[1].getDouble(3));
+ metric.setAvg(row[2].getDouble(3));
+
+ ColumnMetadata maxMetadata = new ColumnMetadata(row[0].getInt(4),
row[0].getLong(5));
+ ColumnMetadata minMetadata = new ColumnMetadata(row[1].getInt(4),
row[1].getLong(5));
+ ColumnMetadata avgMetadata = new ColumnMetadata(row[2].getInt(4),
row[2].getLong(5));
+
+ metric.setAvgColumnMetadata(avgMetadata);
+ metric.setMaxColumnMetadata(maxMetadata);
+ metric.setMinColumnMetadata(minMetadata);
+
+ return metric;
+ }
+ };
+ } else {
+ resultSetMapper = new ResultSetMapper<AggregatedNumericMetric>() {
+ @Override
+ public AggregatedNumericMetric map(ResultSet resultSet) throws
SQLException {
+ return null;
+ }
+
+ @Override
+ public AggregatedNumericMetric map(Row... row) {
+ AggregatedNumericMetric metric = new AggregatedNumericMetric();
+ metric.setScheduleId(row[0].getInt(0));
+ metric.setTimestamp(row[0].getDate(1).getTime());
+ metric.setMax(row[0].getDouble(3));
+ metric.setMin(row[1].getDouble(3));
+ metric.setAvg(row[2].getDouble(3));
+
+ return metric;
+ }
+ };
+ }
+ }
+
@Override
public AggregatedNumericMetric map(ResultSet resultSet) throws SQLException {
AggregatedNumericMetric metric = new AggregatedNumericMetric();
@@ -52,14 +108,7 @@ public class AggregateMetricMapper implements
ResultSetMapper<AggregatedNumericM
}
@Override
- public AggregatedNumericMetric map(Row... row) {
- AggregatedNumericMetric metric = new AggregatedNumericMetric();
- metric.setScheduleId(row[0].getInt(0));
- metric.setTimestamp(row[0].getDate(1).getTime());
- metric.setMax(row[0].getDouble(3));
- metric.setMin(row[1].getDouble(3));
- metric.setAvg(row[2].getDouble(3));
-
- return metric;
+ public AggregatedNumericMetric map(Row... rows) {
+ return resultSetMapper.map(rows);
}
}
diff --git
a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregatedNumericMetric.java
b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregatedNumericMetric.java
index 9406cb5..dbbeb4f 100644
---
a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregatedNumericMetric.java
+++
b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/AggregatedNumericMetric.java
@@ -40,7 +40,11 @@ public class AggregatedNumericMetric {
private long timestamp;
- private ColumnMetadata columnMetadata;
+ private ColumnMetadata avgColumnMetadata;
+
+ private ColumnMetadata minColumnMetadata;
+
+ private ColumnMetadata maxColumnMetadata;
public AggregatedNumericMetric() {
}
@@ -93,22 +97,39 @@ public class AggregatedNumericMetric {
this.timestamp = timestamp;
}
- public ColumnMetadata getColumnMetadata() {
- return columnMetadata;
+ public ColumnMetadata getAvgColumnMetadata() {
+ return avgColumnMetadata;
+ }
+
+ public void setAvgColumnMetadata(ColumnMetadata avgColumnMetadata) {
+ this.avgColumnMetadata = avgColumnMetadata;
+ }
+
+ public ColumnMetadata getMinColumnMetadata() {
+ return minColumnMetadata;
+ }
+
+ public void setMinColumnMetadata(ColumnMetadata minColumnMetadata) {
+ this.minColumnMetadata = minColumnMetadata;
+ }
+
+ public ColumnMetadata getMaxColumnMetadata() {
+ return maxColumnMetadata;
}
- public void setColumnMetadata(ColumnMetadata metadata) {
- columnMetadata = metadata;
+ public void setMaxColumnMetadata(ColumnMetadata maxColumnMetadata) {
+ this.maxColumnMetadata = maxColumnMetadata;
}
@Override
public String toString() {
- if (columnMetadata == null) {
+ if (avgColumnMetadata == null && minColumnMetadata == null &&
maxColumnMetadata == null) {
return "AggregatedNumericMetric[scheduleId=" + scheduleId + ",
avg=" + avg + ", min=" + min + ", max="
+ max + ", timestamp=" + timestamp + "]";
}
return "AggregatedNumericMetric[scheduleId=" + scheduleId + ",
avg=" + avg + ", min=" + min + ", max="
- + max + " timestamp=" + timestamp + ", columnMetadata=" +
columnMetadata + "]";
+ + max + " timestamp=" + timestamp + ",
avgColumnMetadata=" + avgColumnMetadata + ", minColumnMetadata=" +
+ minColumnMetadata + ", maxColumnMetadata=" + maxColumnMetadata +
"]";
}
@Override
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 ec0a6ad..c6a5d40 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
@@ -120,10 +120,12 @@ public class MetricsDAO {
}
}
- public List<AggregatedNumericMetric> insertAggregates(String bucket,
List<AggregatedNumericMetric> metrics) {
+ public List<AggregatedNumericMetric> insertAggregates(String bucket,
List<AggregatedNumericMetric> metrics,
+ int ttl) {
List<AggregatedNumericMetric> updates = new
ArrayList<AggregatedNumericMetric>();
try {
- String cql = "INSERT INTO " + bucket + " (schedule_id, time,
type, value) VALUES (?, ?, ?, ?)";
+ String cql = "INSERT INTO " + bucket + " (schedule_id, time,
type, value) VALUES (?, ?, ?, ?) USING TTL " +
+ ttl;
PreparedStatement statement = session.prepare(cql);
for (AggregatedNumericMetric metric : metrics) {
@@ -196,7 +198,7 @@ public class MetricsDAO {
public List<AggregatedNumericMetric> findAggregateMetrics(String bucket, int
scheduleId) {
try {
String cql =
- "SELECT schedule_id, time, type, value, ttl(value), writetime(value)
" +
+ "SELECT schedule_id, time, type, value " +
"FROM " + bucket + " " +
"WHERE schedule_id = " + scheduleId + " " +
"ORDER BY time, type";
@@ -237,6 +239,29 @@ public class MetricsDAO {
}
}
+ List<AggregatedNumericMetric> findAggregateMetricsWithMetadata(String bucket,
int scheduleId, DateTime startTime,
+ DateTime endTime) {
+
+ try {
+ String cql =
+ "SELECT schedule_id, time, type, value, ttl(value), writetime(value)
" +
+ "FROM " + bucket + " " +
+ "WHERE schedule_id = " + scheduleId + " AND time >=
" + startTime.getMillis() +
+ " AND time < " + endTime.getMillis();
+ List<AggregatedNumericMetric> metrics = new
ArrayList<AggregatedNumericMetric>();
+ ResultSetMapper<AggregatedNumericMetric> resultSetMapper = new
AggregateMetricMapper(true);
+ ResultSet resultSet = session.execute(cql);
+
+ while (!resultSet.isExhausted()) {
+ metrics.add(resultSetMapper.map(resultSet.fetchOne(),
resultSet.fetchOne(), resultSet.fetchOne()));
+ }
+
+ return metrics;
+ } catch (NoHostAvailableException e) {
+ throw new CQLException(e);
+ }
+ }
+
public List<MetricsIndexEntry> findMetricsIndexEntries(String bucket) {
try {
PreparedStatement statement = session.prepare(METRICS_INDEX_QUERY);
diff --git
a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
index de622a7..7231b3a 100644
---
a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
+++
b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java
@@ -25,6 +25,7 @@
package org.rhq.server.metrics;
+import static org.rhq.server.metrics.DateTimeService.TWO_WEEKS;
import static org.rhq.server.metrics.MetricsDAO.ONE_HOUR_METRICS_TABLE;
import static org.rhq.server.metrics.MetricsDAO.SIX_HOUR_METRICS_TABLE;
import static org.rhq.server.metrics.MetricsDAO.TWENTY_FOUR_HOUR_METRICS_TABLE;
@@ -237,7 +238,7 @@ public class MetricsServer {
}
List<AggregatedNumericMetric> updatedSchedules =
dao.insertAggregates(ONE_HOUR_METRICS_TABLE,
- oneHourMetrics);
+ oneHourMetrics, TWO_WEEKS);
return updatedSchedules;
}
@@ -284,7 +285,7 @@ public class MetricsServer {
startTime.getMillis()));
}
- List<AggregatedNumericMetric> updatedSchedules =
dao.insertAggregates(toColumnFamily, toMetrics);
+ List<AggregatedNumericMetric> updatedSchedules =
dao.insertAggregates(toColumnFamily, toMetrics, ttl);
return updatedSchedules;
}
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 6fa2c4b..7a9e669 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
@@ -117,7 +117,7 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
// that the TTL is set.
List<RawNumericMetric> actualMetricsWithMetadata =
dao.findRawMetrics(scheduleId, currentHour,
currentHour.plusHours(1), true) ;
- assertTTLSet(actualMetricsWithMetadata);
+ assertRawTTLSet(actualMetricsWithMetadata);
}
@Test
@@ -130,8 +130,8 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
new AggregatedNumericMetric(scheduleId, 4.0, 2.0, 10.0,
hour0.plusHours(1).getMillis()),
new AggregatedNumericMetric(456, 2.0, 2.0, 2.0, hour0.getMillis())
);
-
- List<AggregatedNumericMetric> actualUpdates =
dao.insertAggregates(ONE_HOUR_METRICS_TABLE, metrics);
+ int ttl = Hours.ONE.getHours();
+ List<AggregatedNumericMetric> actualUpdates =
dao.insertAggregates(ONE_HOUR_METRICS_TABLE, metrics, ttl);
List<AggregatedNumericMetric> expectedUpdates = metrics;
assertEquals(actualUpdates, expectedUpdates, "The updates do not match the
expected values");
@@ -142,6 +142,11 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
);
List<AggregatedNumericMetric> actual =
dao.findAggregateMetrics(ONE_HOUR_METRICS_TABLE, scheduleId);
assertEquals(actual, expected, "Failed to find one hour metrics");
+
+ // verify that the TTL is set
+ List<AggregatedNumericMetric> actualMetricsWithMetadata =
dao.findAggregateMetricsWithMetadata(
+ ONE_HOUR_METRICS_TABLE, scheduleId, hour0,
hour0().plusHours(1).plusSeconds(1));
+ assertAggrgateTTLSet(actualMetricsWithMetadata);
}
@Test
@@ -149,14 +154,15 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
int scheduledId = 1;
int nextScheduleId = 2;
DateTime hour0 = hour0();
-
- dao.insertAggregates(ONE_HOUR_METRICS_TABLE, asList(
+ int ttl = Hours.ONE.getHours();
+ List<AggregatedNumericMetric> metrics = asList(
new AggregatedNumericMetric(scheduledId, 2.0, 2.0, 2.0, hour0.getMillis()),
new AggregatedNumericMetric(scheduledId, 3.0, 3.0, 3.0,
hour0.plusHours(1).getMillis()),
new AggregatedNumericMetric(scheduledId, 4.0, 4.0, 4.0,
hour0.plusHours(2).getMillis()),
new AggregatedNumericMetric(scheduledId, 5.0, 5.0, 5.0,
hour0.plusHours(3).getMillis()),
new AggregatedNumericMetric(nextScheduleId, 1.0, 1.0, 1.0,
hour0.plusHours(1).getMillis())
- ));
+ );
+ dao.insertAggregates(ONE_HOUR_METRICS_TABLE, metrics, ttl);
DateTime startTime = hour0.plusHours(1);
DateTime endTime = hour0.plusHours(3);
@@ -207,7 +213,7 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
index);
}
- private void assertTTLSet(List<RawNumericMetric> metrics) {
+ private void assertRawTTLSet(List<RawNumericMetric> metrics) {
for (RawNumericMetric metric : metrics) {
assertNotNull(metric.getColumnMetadata(), metric + " does not contain
column meta data. The meta data " +
" must be loaded in order to verify that the TTL is set
correctly.");
@@ -215,4 +221,21 @@ public class MetricsDAOTest extends CassandraIntegrationTest {
}
}
+ private void assertAggrgateTTLSet(List<AggregatedNumericMetric> metrics) {
+ for (AggregatedNumericMetric metric : metrics) {
+ assertNotNull(metric.getAvgColumnMetadata(), metric + " does not contain
column meta data for its " +
+ " average value. The meta data must be loaded in order to verify
that the TTL is set correctly.");
+ assertNotNull(metric.getAvgColumnMetadata().getTtl(), "The TTL for
average column of " + metric +
+ " is not set.");
+ assertNotNull(metric.getMinColumnMetadata(), metric + " does not contain
column meta data for its " +
+ " minimum value. The meta data must be loaded in order to verify
that the TTL is set correctly.");
+ assertNotNull(metric.getMinColumnMetadata().getTtl(), "The TTL for
minimum column of " + metric +
+ " is not set.");
+ assertNotNull(metric.getMaxColumnMetadata(), metric + " does not contain
column meta data for its " +
+ " maximum value. The meta data must be loaded in order to verify
that the TTL is set correctly.");
+ assertNotNull(metric.getMaxColumnMetadata().getTtl(), "The TTL for
maximum column of " + metric +
+ " is not set.");
+ }
+ }
+
}
diff --git
a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
index 551e137..5e443b6 100644
---
a/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
+++
b/modules/enterprise/server/server-metrics/src/test/java/org/rhq/server/metrics/MetricsServerTest.java
@@ -266,7 +266,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
new AggregatedNumericMetric(scheduleId, avg1, min1, max1,
hour7.getMillis()),
new AggregatedNumericMetric(scheduleId, avg2, min2, max2, hour8.getMillis())
);
- dao.insertAggregates(ONE_HOUR_METRICS_TABLE, oneHourMetrics);
+ dao.insertAggregates(ONE_HOUR_METRICS_TABLE, oneHourMetrics,
DateTimeService.TWO_WEEKS);
// update the 6 hour queue
Map<Integer, DateTime> indexUpdates = new HashMap<Integer,
DateTime>();
@@ -317,7 +317,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
new AggregatedNumericMetric(scheduleId, avg1, min1, max1,
hour6.getMillis()),
new AggregatedNumericMetric(scheduleId, avg2, min2, max2,
hour12.getMillis())
);
- dao.insertAggregates(SIX_HOUR_METRICS_TABLE, sixHourMetrics);
+ dao.insertAggregates(SIX_HOUR_METRICS_TABLE, sixHourMetrics,
DateTimeService.ONE_MONTH);
// update the 24 queue
Map<Integer, DateTime> indexUpdates = new HashMap<Integer,
DateTime>();
@@ -396,7 +396,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
new AggregatedNumericMetric(scheduleId, 5.0, 4.0, 6.0,
bucket59Time.plusHours(1).getMillis()),
new AggregatedNumericMetric(scheduleId, 3.0, 3.0, 3.0,
bucket59Time.plusHours(2).getMillis())
);
- dao.insertAggregates(ONE_HOUR_METRICS_TABLE, metrics);
+ dao.insertAggregates(ONE_HOUR_METRICS_TABLE, metrics,
DateTimeService.TWO_WEEKS);
List<MeasurementDataNumericHighLowComposite> actualData =
metricsServer.findDataForResource(scheduleId,
beginTime.getMillis(), endTime.getMillis());
@@ -436,7 +436,7 @@ public class MetricsServerTest extends CassandraIntegrationTest {
new AggregatedNumericMetric(scheduleId, 5.0, 4.0, 6.0,
bucket59Time.plusHours(1).getMillis()),
new AggregatedNumericMetric(scheduleId, 3.0, 3.0, 3.0,
bucket59Time.plusHours(2).getMillis())
);
- dao.insertAggregates(SIX_HOUR_METRICS_TABLE, metrics);
+ dao.insertAggregates(SIX_HOUR_METRICS_TABLE, metrics,
DateTimeService.ONE_MONTH);
List<MeasurementDataNumericHighLowComposite> actualData =
metricsServer.findDataForResource(scheduleId,
beginTime.getMillis(), endTime.getMillis());