modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNode.java
| 24 +
modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeLoadComposite.java
| 23 -
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
| 150 +++++-----
3 files changed, 120 insertions(+), 77 deletions(-)
New commits:
commit 5a5a8c931a96fcd5f02a3a51c542afc2afd121b4
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Mon May 27 23:34:31 2013 +0200
Making StorageNodeManagerBean.getLoad() method more efficient using named queries.
Support for correct unit formatting of StorageNodeLoadComposite.toString().
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNode.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNode.java
index 1970349..e967549 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNode.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNode.java
@@ -40,6 +40,7 @@ import javax.persistence.PrePersist;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
+import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.resource.Resource;
/**
@@ -59,7 +60,26 @@ import org.rhq.core.domain.resource.Resource;
@NamedQuery(name = StorageNode.QUERY_FIND_ALL_NOT_INSTALLED, query = "SELECT s
FROM StorageNode s WHERE NOT s.operationMode = 'INSTALLED'"),
@NamedQuery(name = StorageNode.QUERY_FIND_ALL_NORMAL, query = "SELECT s FROM
StorageNode s WHERE s.operationMode = 'NORMAL'"),
@NamedQuery(name = StorageNode.QUERY_DELETE_BY_ID, query = "" //
- + "DELETE FROM StorageNode s WHERE s.id = :storageNodeId ") })
+ + "DELETE FROM StorageNode s WHERE s.id = :storageNodeId "),
+
+ @NamedQuery(name =
StorageNode.QUERY_FIND_SCHEDULE_IDS_BY_PARENT_RESOURCE_ID_AND_MEASUREMENT_DEFINITION_NAMES,
query = "" //
+ + " SELECT def.name, ms.id FROM MeasurementSchedule ms " //
+ + " JOIN ms.definition def " //
+ + " JOIN ms.resource res " //
+ + " WHERE ms.definition = def " //
+ + " AND res.parentResource.id = :parrentId " //
+ + " AND ms.enabled = true" //
+ + " AND def.name IN (:metricNames)"), //
+
+ @NamedQuery(name =
StorageNode.QUERY_FIND_SCHEDULE_IDS_BY_GRANDPARENT_RESOURCE_ID_AND_MEASUREMENT_DEFINITION_NAMES,
query = "" //
+ + " SELECT def.name, ms.id FROM MeasurementSchedule ms " //
+ + " JOIN ms.definition def " //
+ + " JOIN ms.resource res " //
+ + " WHERE ms.definition = def " //
+ + " AND res.parentResource.parentResource.id = :grandparrentId
" //
+ + " AND ms.enabled = true" //
+ + " AND def.name IN (:metricNames)") //
+})
@SequenceGenerator(allocationSize = org.rhq.core.domain.util.Constants.ALLOCATION_SIZE,
name = "RHQ_STORAGE_NODE_ID_SEQ", sequenceName =
"RHQ_STORAGE_NODE_ID_SEQ")
@Table(name = "RHQ_STORAGE_NODE")
public class StorageNode implements Serializable {
@@ -71,6 +91,8 @@ public class StorageNode implements Serializable {
public static final String QUERY_FIND_ALL_NOT_INSTALLED =
"StorageNode.findAllCloudMembers";
public static final String QUERY_DELETE_BY_ID = "StorageNode.deleteById";
public static final String QUERY_FIND_ALL_NORMAL =
"StorageNode.findAllNormalCloudMembers";
+ public static final String
QUERY_FIND_SCHEDULE_IDS_BY_PARENT_RESOURCE_ID_AND_MEASUREMENT_DEFINITION_NAMES =
"StorageNode.findScheduleIdsByParentResourceIdAndMeasurementDefinitionNames";
+ public static final String
QUERY_FIND_SCHEDULE_IDS_BY_GRANDPARENT_RESOURCE_ID_AND_MEASUREMENT_DEFINITION_NAMES =
"StorageNode.findScheduleIdsByGrandparentResourceIdAndMeasurementDefinitionNames";
private static final String JMX_CONNECTION_STRING =
"service:jmx:rmi:///jndi/rmi://%s:%s/jmxrmi";
diff --git
a/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeLoadComposite.java
b/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeLoadComposite.java
index b7766e9..e93670e 100644
---
a/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeLoadComposite.java
+++
b/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeLoadComposite.java
@@ -23,7 +23,6 @@
package org.rhq.core.domain.cloud;
import java.io.Serializable;
-import java.util.concurrent.TimeUnit;
import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementUnits;
@@ -38,15 +37,11 @@ public class StorageNodeLoadComposite implements Serializable {
private long beginTime;
private long endTime;
- private MeasurementAggregateWithUnits heapCommited; // cassandra server jvm / memory
subsystem resource
-
- private MeasurementAggregateWithUnits heapUsed; // cassandra server jvm / memory
subsystem resource
-
- private MeasurementAggregateWithUnits load; // database management services / storage
service resource
-
- private MeasurementAggregate tokens; // ~ jmx op - getTokens(hostname).size() or jmx
attribute (StorageService/tokens).size()
-
- private MeasurementAggregateWithUnits actuallyOwns; // up to date # of tokens for
this node (tokenToEndpointMap jmx attr.) can be taken from the associated resource's
configuration or I can provide this as a metric in C* plugin
+ private MeasurementAggregateWithUnits heapCommited;
+ private MeasurementAggregateWithUnits heapUsed;
+ private MeasurementAggregateWithUnits load;
+ private MeasurementAggregate tokens;
+ private MeasurementAggregateWithUnits actuallyOwns;
public StorageNodeLoadComposite() {
// GWT needs this
@@ -150,6 +145,7 @@ public class StorageNodeLoadComposite implements Serializable {
private final MeasurementAggregate aggregate;
private final MeasurementUnits units;
+ private String formattedValue;
public MeasurementAggregateWithUnits(MeasurementAggregate aggregate,
MeasurementUnits units) {
this.aggregate = aggregate;
@@ -164,8 +160,15 @@ public class StorageNodeLoadComposite implements Serializable {
return units;
}
+ public void setFormattedValue(String formattedValue) {
+ this.formattedValue = formattedValue;
+ }
+
@Override
public String toString() {
+ if (formattedValue != null) {
+ return formattedValue;
+ }
return aggregate.toString() + " (" + units.toString() +
")";
}
}
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
index 8b874ec..89ffe11 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java
@@ -25,12 +25,11 @@
package org.rhq.enterprise.server.cloud;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
-import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
@@ -48,13 +47,9 @@ import org.rhq.core.domain.cloud.StorageNode;
import org.rhq.core.domain.cloud.StorageNode.OperationMode;
import org.rhq.core.domain.cloud.StorageNodeLoadComposite;
import org.rhq.core.domain.configuration.Configuration;
-import org.rhq.core.domain.criteria.MeasurementDefinitionCriteria;
import org.rhq.core.domain.criteria.StorageNodeCriteria;
import org.rhq.core.domain.measurement.AvailabilityType;
-import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.MeasurementAggregate;
-import org.rhq.core.domain.measurement.MeasurementDefinition;
-import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.MeasurementUnits;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.Resource;
@@ -65,8 +60,7 @@ import org.rhq.enterprise.server.authz.RequiredPermission;
import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
-import org.rhq.enterprise.server.resource.ResourceManagerLocal;
-import org.rhq.enterprise.server.resource.ResourceTypeManagerLocal;
+import org.rhq.enterprise.server.rest.reporting.MeasurementConverter;
import org.rhq.enterprise.server.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.server.metrics.CQLException;
@@ -171,71 +165,85 @@ public class StorageNodeManagerBean implements
StorageNodeManagerLocal, StorageN
}
}
+ @RequiredPermission(Permission.MANAGE_SETTINGS)
public StorageNodeLoadComposite getLoad(Subject subject, StorageNode node, long
beginTime, long endTime) {
- //TODO: check the rights of subject
StorageNodeLoadComposite result = new StorageNodeLoadComposite(node, beginTime,
endTime);
+ final String tokensMetric = "Tokens", ownershipMetric =
"Ownership", loadMetric = "Load";
+ final String heapComittedMetric = "{HeapMemoryUsage.committed}",
heapUsedMetric = "{HeapMemoryUsage.used}";
+
+ int resourceId;
+ if (node.getResource() == null) {
+ resourceId = entityManager.merge(node).getResource().getId();
+ } else {
+ resourceId = node.getResource().getId();
+ }
- StorageNode mergedNode = entityManager.merge(node);
- Set<ResourceType> childResourceTypes =
mergedNode.getResource().getResourceType().getChildResourceTypes();
-
- // ResourceType memorySubsystemType =
typeManager.getResourceTypeByNameAndPlugin(subject, "RHQ Storage Node",
- // PLUGIN_NAME);
- // ResourceType storageServiceType =
typeManager.getResourceTypeByNameAndPlugin(subject, "RHQ Storage Node",
- // PLUGIN_NAME);
-
- Set<Resource> childResources =
mergedNode.getResource().getChildResources();
- int storageServiceResourceId = -1;
- int memorySubsystemResourceId = -1;
- for (Resource res : childResources) {
- if ("Storage Service".equals(res.getName())) {
- storageServiceResourceId = res.getId();
- } else if ("Cassandra Server JVM".equals(res.getName())) {
- Set<Resource> childJVMResources = res.getChildResources();
- for (Resource resJVM : childJVMResources) {
- if ("Memory Subsystem".equals(resJVM.getName())) {
- memorySubsystemResourceId = resJVM.getId();
- break;
- }
- }
- }
+ // get the schedule ids for Storage Service resource
+ TypedQuery<Object[]> query = entityManager.<Object[]>
createNamedQuery(
+
StorageNode.QUERY_FIND_SCHEDULE_IDS_BY_PARENT_RESOURCE_ID_AND_MEASUREMENT_DEFINITION_NAMES,
Object[].class);
+ query.setParameter("parrentId",
resourceId).setParameter("metricNames",
+ Arrays.asList(tokensMetric, ownershipMetric, loadMetric));
+ List<Object[]> scheduleIds = query.getResultList();
+ Map<String, Integer> scheduleIdsMap = new HashMap<String,
Integer>(4);
+ for (Object[] pair : scheduleIds) {
+ scheduleIdsMap.put((String) pair[0], (Integer) pair[1]);
}
- // TODO: perhaps crating a new named query will be more efficient than this
- if (storageServiceResourceId != -1) {
- MeasurementDefinitionCriteria criteria = new
MeasurementDefinitionCriteria();
- criteria.addFilterName("Tokens");
- criteria.addFilterResourceTypeName("StorageService");
- PageList<MeasurementDefinition> measDefinition1 =
measurementDefinitionManager
- .findMeasurementDefinitionsByCriteria(subject, criteria);
-
- criteria = new MeasurementDefinitionCriteria();
- criteria.addFilterName("Ownership");
- criteria.addFilterResourceTypeName("StorageService");
- PageList<MeasurementDefinition> measDefinition2 =
measurementDefinitionManager
- .findMeasurementDefinitionsByCriteria(subject, criteria);
-
- if (!measDefinition1.isEmpty() && !measDefinition2.isEmpty()) {
- List<MeasurementSchedule> schedules =
scheduleManager.findSchedulesByResourceIdsAndDefinitionIds(
- new int[] { storageServiceResourceId }, new int[] {
measDefinition1.get(1).getId(),
- measDefinition2.get(1).getId() });
- if (!schedules.isEmpty()) {
- MeasurementAggregate tokensAggregate =
measurementManager.getAggregate(subject, schedules.get(0)
- .getId(), beginTime, endTime);
- result.setTokens(tokensAggregate);
- MeasurementAggregate ovnershipAggregate =
measurementManager.getAggregate(subject, schedules.get(1)
- .getId(), beginTime, endTime);
- StorageNodeLoadComposite.MeasurementAggregateWithUnits
ovnershipAggregateWithUnits = new StorageNodeLoadComposite.MeasurementAggregateWithUnits(
- ovnershipAggregate, MeasurementUnits.PERCENTAGE);
- result.setActuallyOwns(ovnershipAggregateWithUnits);
- }
- }
+ // get the schedule ids for Memory Subsystem resource
+ query = entityManager.<Object[]> createNamedQuery(
+
StorageNode.QUERY_FIND_SCHEDULE_IDS_BY_GRANDPARENT_RESOURCE_ID_AND_MEASUREMENT_DEFINITION_NAMES,
+ Object[].class);
+ query.setParameter("grandparrentId",
resourceId).setParameter("metricNames",
+ Arrays.asList(heapComittedMetric, heapUsedMetric));
+ scheduleIds = query.getResultList();
+ for (Object[] pair : scheduleIds) {
+ scheduleIdsMap.put((String) pair[0], (Integer) pair[1]);
}
- // private MeasurementAggregateWithUnits heapCommited; // cassandra server
jvm / memory subsystem resource
- // private MeasurementAggregateWithUnits heapUsed; // cassandra server jvm
/ memory subsystem resource
- // private MeasurementAggregateWithUnits load; // database management
services / storage service
- // DONE -- private MeasurementAggregate tokens; // ~ jmx op -
getTokens(hostname).size() or jmx attribute (StorageService/tokens).size()
- // DONE --private MeasurementAggregate actuallyOwns; // up to date value
(tokenToEndpointMap) can be taken from the associated resource's configuration
+ // find the aggregates and enrich the result instance
+ if (!scheduleIdsMap.isEmpty()) {
+ if (scheduleIdsMap.get(tokensMetric) != null) {
+ MeasurementAggregate tokensAggregate =
measurementManager.getAggregate(subject,
+ scheduleIdsMap.get(tokensMetric), beginTime, endTime);
+ result.setTokens(tokensAggregate);
+ }
+ if (scheduleIdsMap.get(ownershipMetric) != null) {
+ MeasurementAggregate ownershipAggregate =
measurementManager.getAggregate(subject,
+ scheduleIdsMap.get(ownershipMetric), beginTime, endTime);
+ StorageNodeLoadComposite.MeasurementAggregateWithUnits
ovnershipAggregateWithUnits = new StorageNodeLoadComposite.MeasurementAggregateWithUnits(
+ ownershipAggregate, MeasurementUnits.PERCENTAGE);
+
ovnershipAggregateWithUnits.setFormattedValue(getSummaryString(ownershipAggregate,
+ MeasurementUnits.PERCENTAGE));
+ result.setActuallyOwns(ovnershipAggregateWithUnits);
+ }
+ if (scheduleIdsMap.get(loadMetric) != null) {
+ MeasurementAggregate loadAggregate =
measurementManager.getAggregate(subject,
+ scheduleIdsMap.get(loadMetric), beginTime, endTime);
+ StorageNodeLoadComposite.MeasurementAggregateWithUnits
loadAggregateWithUnits = new StorageNodeLoadComposite.MeasurementAggregateWithUnits(
+ loadAggregate, MeasurementUnits.BYTES);
+ loadAggregateWithUnits.setFormattedValue(getSummaryString(loadAggregate,
MeasurementUnits.BYTES));
+ result.setLoad(loadAggregateWithUnits);
+ }
+
+ if (scheduleIdsMap.get(heapComittedMetric) != null) {
+ MeasurementAggregate heapCommitedAggregate =
measurementManager.getAggregate(subject,
+ scheduleIdsMap.get(heapComittedMetric), beginTime, endTime);
+ StorageNodeLoadComposite.MeasurementAggregateWithUnits
heapCommitedAggregateWithUnits = new
StorageNodeLoadComposite.MeasurementAggregateWithUnits(
+ heapCommitedAggregate, MeasurementUnits.BYTES);
+
heapCommitedAggregateWithUnits.setFormattedValue(getSummaryString(heapCommitedAggregate,
+ MeasurementUnits.BYTES));
+ result.setHeapCommited(heapCommitedAggregateWithUnits);
+ }
+ if (scheduleIdsMap.get(heapUsedMetric) != null) {
+ MeasurementAggregate heapUsedAggregate =
measurementManager.getAggregate(subject,
+ scheduleIdsMap.get(heapUsedMetric), beginTime, endTime);
+ StorageNodeLoadComposite.MeasurementAggregateWithUnits
heapUsedAggregateWithUnits = new StorageNodeLoadComposite.MeasurementAggregateWithUnits(
+ heapUsedAggregate, MeasurementUnits.BYTES);
+ heapUsedAggregateWithUnits
+ .setFormattedValue(getSummaryString(heapUsedAggregate,
MeasurementUnits.BYTES));
+ result.setHeapUsed(heapUsedAggregateWithUnits);
+ }
+ }
return result;
}
@@ -261,4 +269,14 @@ public class StorageNodeManagerBean implements
StorageNodeManagerLocal, StorageN
entityManager);
return runner.execute();
}
+
+ private String getSummaryString(MeasurementAggregate aggregate, MeasurementUnits
units) {
+ String formattedValue = "Min: "
+ + MeasurementConverter.format(aggregate.getMin(), units, true)
+ + ", Max: "
+ + MeasurementConverter.format(aggregate.getMax(), units, true)
+ + ", Avg: "
+ + MeasurementConverter.format(aggregate.getAvg(), units, true);
+ return formattedValue;
+ }
}