[rhq] Branch 'feature/cassandra-backend' - 3 commits - modules/core modules/enterprise
by Jay Shaughnessy
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java | 47 +++++++++-
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftChangeSetCriteria.java | 9 -
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java | 9 -
modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDataTraitCriteria.java | 12 +-
modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java | 34 ++++++-
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MultiplePluginExtensionMetadataTest.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/DelegatingLoginModule.java | 10 +-
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java | 15 ---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java | 10 ++
modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/util/CriteriaQueryTest.java | 22 ++++
10 files changed, 127 insertions(+), 43 deletions(-)
New commits:
commit 39ad031bd791f600b148972c6c03e000a17e386d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri May 24 19:45:41 2013 -0400
Bug 966665
- Criteria queries with paging and sorting on non unique fields may return same item on different pages
All paged criteria queries now apply ID as the least significant
ordering field (see exceptions below). Since ID is unique, this ensures
that queries for pages always return the same ordering of rows.
ID will not be automatically appended as an ordering field if:
- the paging is unlimited (i.e. no pagesize, all rows returned)
- the Criteria class does not support an ID sort
- the caller has set the Criteria class instance to not support the ID sort
- ID is already specified as an ordering field
- the max number of ordering fields has already been set (3)
Note that CriteriaQuery has had its support for implicit ID sorting removed,
as the new mechanism, which moves support to the CriteriaQueryGenerator,
replaces it.
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
index 2dde3a4..d8552de 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/Criteria.java
@@ -109,6 +109,7 @@ public abstract class Criteria implements Serializable, BaseCriteria {
private List<Permission> requiredPermissions;
private boolean strict;
private Restriction restriction = null;
+ private boolean supportsAddSortId = true;
protected Map<String, String> filterOverrides;
protected Map<String, String> sortOverrides;
@@ -173,16 +174,54 @@ public abstract class Criteria implements Serializable, BaseCriteria {
}
public void addSortId(PageOrdering sortId) {
- addSortField("id");
- this.sortId = sortId;
+ if (isSupportsAddSortId()) {
+ addSortField("id");
+ this.sortId = sortId;
+
+ } else {
+ throw new UnsupportedOperationException("ID sort is not supported by " + this.getClass().getSimpleName());
+ }
}
public void addFilterId(Integer filterId) {
- this.filterId = filterId;
+ if (isSupportsAddFilterId()) {
+ this.filterId = filterId;
+
+ } else {
+ throw new UnsupportedOperationException("ID filter is not supported by " + this.getClass().getSimpleName());
+ }
}
public void addFilterIds(Integer... filterIds) {
- this.filterIds = CriteriaUtils.getListIgnoringNulls(filterIds);
+ if (isSupportsAddFilterIds()) {
+ this.filterIds = CriteriaUtils.getListIgnoringNulls(filterIds);
+
+ } else {
+ throw new UnsupportedOperationException("IDS filter is not supported by " + this.getClass().getSimpleName());
+ }
+ }
+
+ /**
+ * By default all Criteria support sort on ID. And this sort is applied implicitly to criteria
+ * queries involving paging, to ensure consistent ordering of query results. If for some unlikely reason
+ * the caller needs to disable the implicit ID sort then call this, setting the value to false.
+ *
+ * @param supportsAddSortId
+ */
+ public void setSupportsAddSortId(boolean supportsAddSortId) {
+ this.supportsAddSortId = supportsAddSortId;
+ }
+
+ public boolean isSupportsAddSortId() {
+ return supportsAddSortId;
+ }
+
+ public boolean isSupportsAddFilterId() {
+ return true;
+ }
+
+ public boolean isSupportsAddFilterIds() {
+ return true;
}
protected void addSortField(String fieldName) {
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftChangeSetCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftChangeSetCriteria.java
index af888ea..2b03228 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftChangeSetCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftChangeSetCriteria.java
@@ -292,13 +292,12 @@ public class JPADriftChangeSetCriteria extends Criteria implements DriftChangeSe
}
@Override
- public void addSortId(PageOrdering pageOrdering) {
- throw new UnsupportedOperationException("The sort is not supported by DriftChangeSetCriteria.");
+ public boolean isSupportsAddSortId() {
+ return false;
}
@Override
- public void addFilterIds(Integer... filterIds) {
- throw new UnsupportedOperationException("The filter is not supported by DriftChangeSetCriteria.");
+ public boolean isSupportsAddFilterIds() {
+ return false;
}
-
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java
index 56f0ddf..b13ca90 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/JPADriftCriteria.java
@@ -245,13 +245,12 @@ public class JPADriftCriteria extends Criteria implements DriftCriteria {
}
@Override
- public void addFilterIds(Integer... filterIds) {
- throw new UnsupportedOperationException("The filter is not supported by DriftCriteria.");
+ public boolean isSupportsAddSortId() {
+ return false;
}
@Override
- public void addSortId(PageOrdering pageOrdering) {
- throw new UnsupportedOperationException("The sort is not supported by DriftCriteria.");
+ public boolean isSupportsAddFilterIds() {
+ return false;
}
-
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDataTraitCriteria.java b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDataTraitCriteria.java
index a27e58d..3a2a2c1 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDataTraitCriteria.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/criteria/MeasurementDataTraitCriteria.java
@@ -135,17 +135,17 @@ public class MeasurementDataTraitCriteria extends Criteria {
}
@Override
- public void addSortId(PageOrdering sortId) {
- throw new UnsupportedOperationException("The id column is not defined on this entity.");
+ public boolean isSupportsAddSortId() {
+ return false;
}
@Override
- public void addFilterId(Integer filterId) {
- throw new UnsupportedOperationException("The id column is not defined on this entity.");
+ public boolean isSupportsAddFilterId() {
+ return false;
}
@Override
- public void addFilterIds(Integer... filterIds) {
- throw new UnsupportedOperationException("The id column is not defined on this entity.");
+ public boolean isSupportsAddFilterIds() {
+ return false;
}
}
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
index f87a814..888c821 100644
--- a/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/util/PageControl.java
@@ -82,14 +82,22 @@ public class PageControl implements Serializable, Cloneable {
return new PageControl(0, 1);
}
+ /**
+ * Equivalent to initDefaultOrderingField(defaultField, PageOrdering.ASC).
+ *
+ * @param defaultField
+ * @see #initDefaultOrderingField(String, PageOrdering)
+ */
public void initDefaultOrderingField(String defaultField) {
initDefaultOrderingField(defaultField, PageOrdering.ASC);
}
- public void addDefaultOrderingField(String defaultField) {
- addDefaultOrderingField(defaultField, PageOrdering.ASC);
- }
-
+ /**
+ * Sets initial sort. If sorting is already defined this call will have no effect.
+ *
+ * @param defaultField
+ * @param defaultPageOrdering
+ */
public void initDefaultOrderingField(String defaultField, PageOrdering defaultPageOrdering) {
if (orderingFields.size() > 0) {
return;
@@ -98,6 +106,24 @@ public class PageControl implements Serializable, Cloneable {
addDefaultOrderingField(defaultField, defaultPageOrdering);
}
+ /**
+ * Equivalent to addDefaultOrderingField(defaultField, PageOrdering.ASC).
+ *
+ * @param defaultField
+ * @see #addDefaultOrderingField(String, PageOrdering)
+ */
+ public void addDefaultOrderingField(String defaultField) {
+ addDefaultOrderingField(defaultField, PageOrdering.ASC);
+ }
+
+ /**
+ * Add a default ordering field. If the maximum number of sort fields (currently 3) are already
+ * defined this call will have no effect. If the field is already a sort field this call will have no
+ * effect. Otherwise, the ordering field will be appended to the existing ordering fields.
+ *
+ * @param defaultField
+ * @param defaultPageOrdering
+ */
public void addDefaultOrderingField(String defaultField, PageOrdering defaultPageOrdering) {
if (orderingFields.size() >= MAX_ORDERING_FIELD_COUNT) {
return; // only need to add defaults if there are less than 3 sort orders
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java
index 2d40388..a2bbfee 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQuery.java
@@ -27,7 +27,6 @@ import java.util.NoSuchElementException;
import org.rhq.core.domain.criteria.BaseCriteria;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
-import org.rhq.core.domain.util.PageOrdering;
/** This class provides a way to make PageList results easily iterable with 'for each','while',etc. loops
* and importantly automatically handles iteration through all PageControl results. This
@@ -62,17 +61,6 @@ public class CriteriaQuery<T, C extends BaseCriteria> implements Iterable<T> {
public CriteriaQuery(C criteria, CriteriaQueryExecutor<T, C> queryExecutor) {
this.criteria = criteria;
this.queryExecutor = queryExecutor;
-
- // make sure we have at least a default sort, otherwise chunking doesn't work
- PageControl pageControlOverrides = this.criteria.getPageControlOverrides();
- if (null != pageControlOverrides) {
- if (pageControlOverrides.getOrderingFields().isEmpty()) {
- pageControlOverrides.addDefaultOrderingField("id");
- }
-
- } else if (this.criteria.getOrderingFieldNames().isEmpty()) {
- this.criteria.addSortId(PageOrdering.ASC);
- }
}
/** Returns iterator for a single page of results as defined by
@@ -110,7 +98,8 @@ public class CriteriaQuery<T, C extends BaseCriteria> implements Iterable<T> {
public QueryResultsIterator(PageList<T> firstPage) {
currentPage = firstPage;
iterator = currentPage.iterator();
- count = firstPage == null || firstPage.getPageControl() == null ? 0 : firstPage.getPageControl().getStartRow();
+ count = firstPage == null || firstPage.getPageControl() == null ? 0 : firstPage.getPageControl()
+ .getStartRow();
}
@Override
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index d7cc470..4bb7e33 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -921,6 +921,7 @@ public final class CriteriaQueryGenerator {
} else {
pc = new PageControl(criteria.getPageNumber(), criteria.getPageSize());
}
+
for (String fieldName : criteria.getOrderingFieldNames()) {
for (Field sortField : getFields(criteria, Criteria.Type.SORT)) {
if (sortField.getName().equals(fieldName) == false) {
@@ -939,6 +940,15 @@ public final class CriteriaQueryGenerator {
}
}
}
+
+ // Unless paging is unlimited or it's not supported, add a sort on ID. This ensures that when paging
+ // we always have a consistent ordering. In other words, if the data set is unchanged between pages, there
+ // will no overlap/repetition of rows. Note that this applies even if other sort fields have been
+ // set, because they may still not have unique values. See https://bugzilla.redhat.com/show_bug.cgi?id=966665.
+ if (!pc.isUnlimited() && criteria.isSupportsAddSortId()) {
+ pc.addDefaultOrderingField("id");
+ }
+
return pc;
}
diff --git a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/util/CriteriaQueryTest.java b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/util/CriteriaQueryTest.java
index 2e1c897..b1f5272 100644
--- a/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/util/CriteriaQueryTest.java
+++ b/modules/enterprise/server/jar/src/test/java/org/rhq/enterprise/server/util/CriteriaQueryTest.java
@@ -24,11 +24,15 @@ import static org.testng.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
+import org.testng.AssertJUnit;
import org.testng.annotations.Test;
import org.rhq.core.domain.criteria.Criteria;
+import org.rhq.core.domain.criteria.JPADriftCriteria;
+import org.rhq.core.domain.criteria.ResourceCriteria;
import org.rhq.core.domain.util.PageControl;
import org.rhq.core.domain.util.PageList;
+import org.rhq.core.domain.util.PageOrdering;
public class CriteriaQueryTest {
@@ -229,4 +233,22 @@ public class CriteriaQueryTest {
assert e.getMessage().contains("NonUniqueResultException");
}
}
+
+ @Test
+ public void testAddSort() {
+ try {
+ JPADriftCriteria c = new JPADriftCriteria();
+ c.addSortId(PageOrdering.ASC);
+ AssertJUnit.fail("Should have thrown exception");
+ } catch (UnsupportedOperationException e) {
+ //expected
+ }
+
+ ResourceCriteria c = new ResourceCriteria();
+ c.addSortName(PageOrdering.ASC);
+
+ assertEquals(2, CriteriaQueryGenerator.getPageControl(c).getOrderingFields().size());
+ assertEquals("name", CriteriaQueryGenerator.getPageControl(c).getOrderingFields().get(0).getField());
+ assertEquals("id", CriteriaQueryGenerator.getPageControl(c).getOrderingFields().get(1).getField());
+ }
}
commit 5a344768f0d00e75d9dc60618b0e641a639aae53
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Fri May 24 15:40:51 2013 -0400
Use only apache logger and not the jboss logger from the base class.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/DelegatingLoginModule.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/DelegatingLoginModule.java
index d89c04b..b83a037 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/DelegatingLoginModule.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/core/jaas/DelegatingLoginModule.java
@@ -84,7 +84,7 @@ public class DelegatingLoginModule extends UsernamePasswordLoginModule {
public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
Map<String, ?> options) {
- debugEnabled = log.isDebugEnabled();
+ debugEnabled = LOG.isDebugEnabled();
super.initialize(subject, callbackHandler, sharedState, options);
@@ -101,14 +101,14 @@ public class DelegatingLoginModule extends UsernamePasswordLoginModule {
}
if (debugEnabled) {
- log.debug("Delegating to " + delegateTo + " with roles " + additionalRoles);
+ LOG.debug("Delegating to " + delegateTo + " with roles " + additionalRoles);
}
// Now create the context for later use
try {
loginContext = new LoginContext(delegateTo, new DelegateCallbackHandler());
} catch (LoginException e) {
- log.warn("Initialize failed : " + e.getMessage());
+ LOG.warn("Initialize failed : " + e.getMessage());
}
}
@@ -123,7 +123,7 @@ public class DelegatingLoginModule extends UsernamePasswordLoginModule {
@Override
public boolean login() throws LoginException {
try {
- // Get the username / password the user entred and save if for later use
+ // Get the username / password the user entered and save if for later use
usernamePassword = super.getUsernameAndPassword();
// Try to log in via the delegate
@@ -141,7 +141,7 @@ public class DelegatingLoginModule extends UsernamePasswordLoginModule {
loginOk = true;
if (debugEnabled) {
- log.debug("Login ok for " + usernamePassword[0]);
+ LOG.debug("Login ok for " + usernamePassword[0]);
}
return true;
commit ff61f1e1a25e752801b903338faf60a8342d827d
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu May 23 18:16:58 2013 -0400
Change helper method from public to private. For classes annotated with
@Test all public methods are treated as tests so you have to be careful.
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MultiplePluginExtensionMetadataTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MultiplePluginExtensionMetadataTest.java
index fda9f31..b62565c 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MultiplePluginExtensionMetadataTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/resource/metadata/MultiplePluginExtensionMetadataTest.java
@@ -52,7 +52,7 @@ public class MultiplePluginExtensionMetadataTest extends MetadataBeanTest {
doTheTest(true);
}
- public void doTheTest(boolean ignoreTypes) throws Exception {
+ private void doTheTest(boolean ignoreTypes) throws Exception {
subjectMgr = LookupUtil.getSubjectManager();
resourceTypeMgr = LookupUtil.getResourceTypeManager();
10 years, 12 months
[rhq] modules/plugins
by Thomas Segismont
modules/plugins/jboss-as-7/pom.xml | 1
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseServerComponent.java | 51 ++++++++--
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASComponent.java | 43 +++++++-
modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/helper/ServerPluginConfiguration.java | 19 +++
modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml | 22 ++++
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractJBossAS7PluginTest.java | 33 +++++-
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/DomainServerComponentTest.java | 17 ++-
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ManagedServerTest.java | 19 ++-
modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/StandaloneServerComponentTest.java | 24 ++--
9 files changed, 190 insertions(+), 39 deletions(-)
New commits:
commit dfa94acdf6e92526bf35f08ebd2199c3c4c4db87
Author: Thomas Segismont <tsegismo(a)redhat.com>
Date: Fri May 24 23:56:54 2013 +0200
Bug 920214 - [as7] add async avail check support to AS7 plugin
Only applies to server level resource (Standalone, Domain and Managed servers)
diff --git a/modules/plugins/jboss-as-7/pom.xml b/modules/plugins/jboss-as-7/pom.xml
index 5f538b7..d85e7e3 100644
--- a/modules/plugins/jboss-as-7/pom.xml
+++ b/modules/plugins/jboss-as-7/pom.xml
@@ -617,6 +617,7 @@
<!--<include>org/rhq/modules/plugins/jbossas7/itest/standalone/InterruptibleOperationsTest.java</include>-->
<!--<include>org/rhq/modules/plugins/jbossas7/itest/standalone/DeploymentTest.java</include>-->
<!--<include>org/rhq/modules/plugins/jbossas7/itest/domain/DomainServerComponentTest.java</include>-->
+ <!--<include>org/rhq/modules/plugins/jbossas7/itest/domain/ManagedServerTest.java</include>-->
<!--<include>org/rhq/modules/plugins/jbossas7/itest/domain/SecurityModuleOptionsTest.java</include>-->
<!--<include>org/rhq/modules/plugins/jbossas7/itest/nonpc/ManagementConnectionPersistenceTest.java</include>-->
</includes>
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseServerComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseServerComponent.java
index b80a39a..5d540fd 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseServerComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/BaseServerComponent.java
@@ -16,6 +16,7 @@
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
+
package org.rhq.modules.plugins.jbossas7;
import java.io.File;
@@ -40,6 +41,8 @@ import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.pluginapi.availability.AvailabilityCollectorRunnable;
+import org.rhq.core.pluginapi.availability.AvailabilityFacet;
import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceComponent;
@@ -81,7 +84,8 @@ public abstract class BaseServerComponent<T extends ResourceComponent<?>> extend
private LogFileEventResourceComponentHelper logFileEventDelegate;
private StartScriptConfiguration startScriptConfig;
private ServerPluginConfiguration serverPluginConfig;
- private AvailabilityType lastAvail;
+ private AvailabilityType previousAvailabilityType;
+ private AvailabilityCollectorRunnable availabilityCollector;
@Override
public void start(ResourceContext<T> resourceContext) throws InvalidPluginConfigurationException, Exception {
@@ -89,38 +93,69 @@ public abstract class BaseServerComponent<T extends ResourceComponent<?>> extend
serverPluginConfig = new ServerPluginConfiguration(pluginConfiguration);
connection = ASConnection.newInstanceForServerPluginConfiguration(serverPluginConfig);
+ // The availabilityCollector is still null at this point. So this call will always perform a real availability
+ // check and throw InvalidPluginConfigurationException as needed.
getAvailability();
logFileEventDelegate = new LogFileEventResourceComponentHelper(context);
logFileEventDelegate.startLogFileEventPollers();
startScriptConfig = new StartScriptConfiguration(pluginConfiguration);
+
+ Integer availabilityCheckPeriod = null;
+ try {
+ availabilityCheckPeriod = serverPluginConfig.getAvailabilityCheckPeriod();
+ } catch (NumberFormatException e) {
+ log.error("Avail check period config prop was not a valid number. Cause: " + e);
+ }
+ if (availabilityCheckPeriod != null) {
+ long availCheckMillis = availabilityCheckPeriod * 1000L;
+ this.availabilityCollector = resourceContext.getAvailabilityContext().createAvailabilityCollectorRunnable(
+ new AvailabilityFacet() {
+ public AvailabilityType getAvailability() {
+ return getAvailabilityNow();
+ }
+ }, availCheckMillis);
+ this.availabilityCollector.start();
+ }
}
@Override
public void stop() {
logFileEventDelegate.stopLogFileEventPollers();
- lastAvail = null;
+ previousAvailabilityType = null;
+ if (this.availabilityCollector != null) {
+ this.availabilityCollector.stop();
+ this.availabilityCollector = null;
+ }
}
@Override
public AvailabilityType getAvailability() {
- AvailabilityType avail;
+ if (this.availabilityCollector != null) {
+ return this.availabilityCollector.getLastKnownAvailability();
+ } else {
+ return getAvailabilityNow();
+ }
+ }
+
+ private AvailabilityType getAvailabilityNow() {
+ AvailabilityType availabilityType;
try {
readAttribute("launch-type");
- avail = AvailabilityType.UP;
+ availabilityType = AvailabilityType.UP;
} catch (Exception e) {
- avail = AvailabilityType.DOWN;
+ availabilityType = AvailabilityType.DOWN;
}
try {
- if ((avail == AvailabilityType.UP) && (lastAvail != AvailabilityType.UP)) {
+ if ((availabilityType == AvailabilityType.UP) && (previousAvailabilityType != AvailabilityType.UP)) {
validateServerAttributes();
log.info(getResourceDescription() + " has just come UP.");
}
} finally {
- lastAvail = avail;
+ previousAvailabilityType = availabilityType;
}
- return avail;
+ return availabilityType;
}
private void validateServerAttributes() throws InvalidPluginConfigurationException {
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASComponent.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASComponent.java
index e7fcd5b..4f0ea36 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASComponent.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/ManagedASComponent.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2011 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,11 +13,14 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
+
package org.rhq.modules.plugins.jbossas7;
+import static org.rhq.modules.plugins.jbossas7.helper.ServerPluginConfiguration.Property.AVAIL_CHECK_PERIOD_CONFIG_PROP;
+
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
@@ -30,6 +33,8 @@ import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementReport;
import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
+import org.rhq.core.pluginapi.availability.AvailabilityCollectorRunnable;
+import org.rhq.core.pluginapi.availability.AvailabilityFacet;
import org.rhq.core.pluginapi.event.log.LogFileEventResourceComponentHelper;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
@@ -51,6 +56,7 @@ public class ManagedASComponent extends BaseComponent<HostControllerComponent<?>
private static final String MANAGED_SERVER_TYPE_NAME = "Managed Server";
private LogFileEventResourceComponentHelper logFileEventDelegate;
+ private AvailabilityCollectorRunnable availabilityCollector;
@Override
public void start(ResourceContext<HostControllerComponent<?>> hostControllerComponentResourceContext)
@@ -59,13 +65,34 @@ public class ManagedASComponent extends BaseComponent<HostControllerComponent<?>
logFileEventDelegate = new LogFileEventResourceComponentHelper(context);
logFileEventDelegate.startLogFileEventPollers();
+
+ Integer availabilityCheckPeriod = null;
+ try {
+ availabilityCheckPeriod = pluginConfiguration.getSimple(AVAIL_CHECK_PERIOD_CONFIG_PROP).getIntegerValue();
+ } catch (NumberFormatException e) {
+ log.error("Avail check period config prop was not a valid number. Cause: " + e);
+ }
+ if (availabilityCheckPeriod != null) {
+ long availCheckMillis = availabilityCheckPeriod * 1000L;
+ this.availabilityCollector = hostControllerComponentResourceContext.getAvailabilityContext()
+ .createAvailabilityCollectorRunnable(new AvailabilityFacet() {
+ public AvailabilityType getAvailability() {
+ return getAvailabilityNow();
+ }
+ }, availCheckMillis);
+ this.availabilityCollector.start();
+ }
+
}
@Override
public void stop() {
super.stop();
-
logFileEventDelegate.stopLogFileEventPollers();
+ if (this.availabilityCollector != null) {
+ this.availabilityCollector.stop();
+ this.availabilityCollector = null;
+ }
}
/**
@@ -76,6 +103,14 @@ public class ManagedASComponent extends BaseComponent<HostControllerComponent<?>
*/
@Override
public AvailabilityType getAvailability() {
+ if (this.availabilityCollector != null) {
+ return this.availabilityCollector.getLastKnownAvailability();
+ } else {
+ return getAvailabilityNow();
+ }
+ }
+
+ private AvailabilityType getAvailabilityNow() {
if (context.getResourceType().getName().equals(MANAGED_SERVER_TYPE_NAME)) {
Address theAddress = new Address();
String host = pluginConfiguration.getSimpleValue("domainHost", "local");
diff --git a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/helper/ServerPluginConfiguration.java b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/helper/ServerPluginConfiguration.java
index 1433c17..3832ed2 100644
--- a/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/helper/ServerPluginConfiguration.java
+++ b/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/helper/ServerPluginConfiguration.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,14 +13,16 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
+
package org.rhq.modules.plugins.jbossas7.helper;
import java.io.File;
import org.rhq.core.domain.configuration.Configuration;
+import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.modules.plugins.jbossas7.JBossProductType;
/**
@@ -43,6 +45,7 @@ public class ServerPluginConfiguration {
public static final String LOG_DIR = "logDir";
public static final String PRODUCT_TYPE = "productType";
public static final String HOST_CONFIG_FILE = "hostConfigFile";
+ public static final String AVAIL_CHECK_PERIOD_CONFIG_PROP = "availabilityCheckPeriod";
}
private Configuration pluginConfig;
@@ -143,4 +146,14 @@ public class ServerPluginConfiguration {
hostConfigFile.toString() : null);
}
+ public Integer getAvailabilityCheckPeriod() {
+ PropertySimple propertySimple = this.pluginConfig.getSimple(Property.AVAIL_CHECK_PERIOD_CONFIG_PROP);
+ return propertySimple == null ? null : propertySimple.getIntegerValue();
+ }
+
+ public void setAvailabilityCheckPeriod(Integer availabilityCheckPeriod) {
+ this.pluginConfig.setSimpleValue(Property.AVAIL_CHECK_PERIOD_CONFIG_PROP,
+ availabilityCheckPeriod == null ? null : availabilityCheckPeriod.toString());
+ }
+
}
diff --git a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
index ad22370..7213acd 100644
--- a/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/jboss-as-7/src/main/resources/META-INF/rhq-plugin.xml
@@ -82,6 +82,17 @@
</c:list-property>
</c:group>
'>
+
+ <!ENTITY availabilityCheckPeriod '
+ <c:simple-property name="availabilityCheckPeriod"
+ description="The amount of time, in seconds, that must elapse between availability checks to see if the server is up. If set, the availability checks will be performed asynchronously thus allowing slow-responding servers to avoid being falsely reported as down. Minimum value is 60 seconds."
+ units="seconds" required="false" type="integer">
+ <c:constraint>
+ <c:integer-constraint minimum="60"/>
+ </c:constraint>
+ </c:simple-property>
+'>
+
<!ENTITY serverKindMetrics '
<metric property="_skm:release-codename" dataType="trait" displayName="Server Code Name"/>
<metric property="_skm:release-version" dataType="trait" displayName="Server Version"/>
@@ -862,6 +873,10 @@
&startScriptPluginConfigGroup;
&logSources;
+
+ <c:group name="advanced" displayName="Advanced" hiddenByDefault="true">
+ &availabilityCheckPeriod;
+ </c:group>
</plugin-configuration>
<process-scan name="HostController" query="process|basename|match=^java.*,arg|org.jboss.as.host-controller|match=.*"/>
@@ -1173,6 +1188,10 @@
&startScriptPluginConfigGroup;
&logSources;
+
+ <c:group name="advanced" displayName="Advanced" hiddenByDefault="true">
+ &availabilityCheckPeriod;
+ </c:group>
</plugin-configuration>
<process-scan name="StandaloneAS" query="process|basename|match=^java.*,arg|org.jboss.as.standalone|match=.*"/>
@@ -1621,6 +1640,9 @@
<plugin-configuration>
<c:simple-property name="path" readOnly="true"/>
&logSources;
+ <c:group name="advanced" displayName="Advanced" hiddenByDefault="true">
+ &availabilityCheckPeriod;
+ </c:group>
</plugin-configuration>
<operation name="start" description="Start this server instance." displayName="Start">
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractJBossAS7PluginTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractJBossAS7PluginTest.java
index 43e6e06..8c61c8e 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractJBossAS7PluginTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/AbstractJBossAS7PluginTest.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,11 +13,14 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
+
package org.rhq.modules.plugins.jbossas7.itest;
+import static org.rhq.core.domain.measurement.AvailabilityType.UP;
+import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import java.util.Set;
@@ -31,8 +34,10 @@ import org.rhq.core.domain.util.ResourceFilter;
import org.rhq.core.domain.util.ResourceUtility;
import org.rhq.core.domain.util.TypeAndKeyResourceFilter;
import org.rhq.core.pc.inventory.InventoryManager;
+import org.rhq.core.pc.inventory.ResourceContainer;
import org.rhq.core.plugin.testutil.AbstractAgentPluginTest;
import org.rhq.core.pluginapi.operation.OperationResult;
+import org.rhq.modules.plugins.jbossas7.helper.ServerPluginConfiguration;
import org.rhq.modules.plugins.jbossas7.itest.domain.DomainServerComponentTest;
import org.rhq.modules.plugins.jbossas7.itest.standalone.StandaloneServerComponentTest;
import org.rhq.test.arquillian.AfterDiscovery;
@@ -152,4 +157,26 @@ public abstract class AbstractJBossAS7PluginTest extends AbstractAgentPluginTest
return serverResource;
}
+ protected void testAsynchronousAvailabilityCheck(Resource resource) throws Exception {
+ // Activate asynchronous availability checking
+ ServerPluginConfiguration serverPluginConfig = new ServerPluginConfiguration(resource.getPluginConfiguration());
+ int availabilityCheckPeriod = 65;
+ serverPluginConfig.setAvailabilityCheckPeriod(availabilityCheckPeriod);
+ restartResourceComponent(resource);
+
+ Thread.sleep((3 * availabilityCheckPeriod * 1000L) / 2);
+ assertEquals(getAvailability(resource), UP);
+
+ // Deactivate asynchronous availability checking as subsequent tests may rely on immediate availabilty checking
+ serverPluginConfig.setAvailabilityCheckPeriod(null);
+ restartResourceComponent(resource);
+ }
+
+ private void restartResourceComponent(Resource resource) throws PluginContainerException {
+ InventoryManager inventoryManager = this.pluginContainer.getInventoryManager();
+ inventoryManager.deactivateResource(resource);
+ ResourceContainer serverContainer = inventoryManager.getResourceContainer(resource);
+ inventoryManager.activateResource(resource, serverContainer, true);
+ }
+
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/DomainServerComponentTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/DomainServerComponentTest.java
index 4effd50..91ece92 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/DomainServerComponentTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/DomainServerComponentTest.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,9 +13,10 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
+
package org.rhq.modules.plugins.jbossas7.itest.domain;
import java.io.File;
@@ -76,14 +77,20 @@ public class DomainServerComponentTest extends AbstractServerComponentTest {
testServerAttributeValidation();
}
+ @Test(priority = 1002)
+ public void testDomainServerAsynchronousAvailabilityCheck() throws Exception {
+ testAsynchronousAvailabilityCheck(getServerResource());
+ }
+
+
// ******************************* METRICS ******************************* //
- @Test(priority = 1002, enabled = true)
+ @Test(priority = 1003, enabled = true)
public void testDomainReleaseVersionTrait() throws Exception {
super.testReleaseVersionTrait();
}
// ******************************* OPERATIONS ******************************* //
- @Test(priority = 1003, enabled = true)
+ @Test(priority = 1004, enabled = true)
public void testDomainServerShutdownAndStartOperations() throws Exception {
super.testShutdownAndStartOperations();
}
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ManagedServerTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ManagedServerTest.java
index 3f9f101..42bab08 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ManagedServerTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/domain/ManagedServerTest.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,11 +13,14 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.modules.plugins.jbossas7.itest.domain;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
import org.testng.annotations.Test;
import org.rhq.core.clientapi.agent.PluginContainerException;
@@ -32,9 +35,6 @@ import org.rhq.core.pc.inventory.InventoryManager;
import org.rhq.modules.plugins.jbossas7.itest.AbstractJBossAS7PluginTest;
import org.rhq.test.arquillian.RunDiscovery;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
/**
* Test dealing with managed servers
* @author Heiko W. Rupp
@@ -45,7 +45,7 @@ public class ManagedServerTest extends AbstractJBossAS7PluginTest {
public static final ResourceType RESOURCE_TYPE = new ResourceType("Managed Server", PLUGIN_NAME, ResourceCategory.SERVER, null);
private static final String RESOURCE_KEY = "master/server-one";
- @Test(priority = 1020, groups = "discovery", enabled = false)
+ @Test(priority = 1020, groups = "discovery", enabled = true)
@RunDiscovery(discoverServices = true, discoverServers = true)
public void runDiscovery() throws Exception {
Resource platform = this.pluginContainer.getInventoryManager().getPlatform();
@@ -93,6 +93,11 @@ public class ManagedServerTest extends AbstractJBossAS7PluginTest {
assertEquals(avail, AvailabilityType.UP);
}
+ @Test(priority = 1022)
+ public void testManagedServerAsynchronousAvailabilityCheck() throws Exception {
+ testAsynchronousAvailabilityCheck(getResource());
+ }
+
private Resource getResource() {
InventoryManager im = pluginContainer.getInventoryManager();
diff --git a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/StandaloneServerComponentTest.java b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/StandaloneServerComponentTest.java
index 9845b03..8446345 100644
--- a/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/StandaloneServerComponentTest.java
+++ b/modules/plugins/jboss-as-7/src/test/java/org/rhq/modules/plugins/jbossas7/itest/standalone/StandaloneServerComponentTest.java
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2012 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
@@ -13,11 +13,14 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * along with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package org.rhq.modules.plugins.jbossas7.itest.standalone;
+import static org.rhq.core.domain.measurement.AvailabilityType.UP;
+import static org.testng.Assert.assertEquals;
+
import java.io.File;
import java.util.Arrays;
import java.util.List;
@@ -38,8 +41,6 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.modules.plugins.jbossas7.itest.AbstractServerComponentTest;
import org.rhq.test.arquillian.RunDiscovery;
-import static org.testng.Assert.assertEquals;
-
/**
* Test discovery and facets of the "JBossAS7 Standalone Server" Resource type.
*
@@ -105,20 +106,20 @@ public class StandaloneServerComponentTest extends AbstractServerComponentTest {
}
// TODO: Re-enable once fixed.
- @Test(priority = 5, dependsOnMethods = "testStandaloneServerShutdownAndStartOperations", enabled = false)
+ @Test(priority = 6, dependsOnMethods = "testStandaloneServerShutdownAndStartOperations", enabled = false)
public void testRestartOperation() throws Exception {
// First make sure the server is up.
AvailabilityType avail = getAvailability(getServerResource());
- assertEquals(avail, AvailabilityType.UP);
+ assertEquals(avail, UP);
// Make sure the server is back up.
// TODO (ips): Check that the server is a different process now.
invokeOperationAndAssertSuccess(getServerResource(), RESTART_OPERATION_NAME, null);
avail = getAvailability(getServerResource());
- assertEquals(avail, AvailabilityType.UP);
+ assertEquals(avail, UP);
}
- @Test(priority = 6, enabled = true)
+ @Test(priority = 7, enabled = true)
public void testSystemPropertiesSettings() throws Exception {
Configuration config = loadResourceConfiguration(getServerResource());
@@ -152,6 +153,11 @@ public class StandaloneServerComponentTest extends AbstractServerComponentTest {
}
+ @Test(priority = 8)
+ public void testStandaloneServerAsynchronousAvailabilityCheck() throws Exception {
+ testAsynchronousAvailabilityCheck(getServerResource());
+ }
+
protected String getExpectedStartScriptFileName() {
return (File.separatorChar == '/') ? "standalone.sh" : "standalone.bat";
}
10 years, 12 months
[rhq] 3 commits - etc/rhq-ircBot
by Jiri Kremser
etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java | 17 +++++++---
1 file changed, 13 insertions(+), 4 deletions(-)
New commits:
commit 64c225a14337769a1f6ce1df40a9e025ee3258e0
Merge: 078a2da e87ea03
Author: Jirka Kremser <jiri.kremser(a)gmail.com>
Date: Fri May 24 14:40:00 2013 -0700
Merge pull request #1 from lzoubek/master
Merging the rhq bot improvements
commit e87ea0381518ffda4a42be7a119ce0ab764cd551
Author: Libor Zoubek <lzoubek(a)jezzovo.net>
Date: Fri May 24 16:45:08 2013 +0200
rhq-Bot: only devs can send private echo command to bot
diff --git a/etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java b/etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java
index 1960f1d..a7b3e78 100644
--- a/etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java
+++ b/etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java
@@ -209,8 +209,12 @@ public class RhqIrcBotListener extends ListenerAdapter<RhqIrcBot> {
String message = privateMessageEvent.getMessage();
Matcher echoMatcher = ECHO_PATTERN.matcher(message);
if (echoMatcher.matches()) {
- String echoMessage = echoMatcher.group(1);
- bot.sendMessage(this.channel, echoMessage);
+ if (!JON_DEVS.contains(privateMessageEvent.getUser().getNick())) {
+ privateMessageEvent.respond("You're not my master, I am your master, go away");
+ } else {
+ String echoMessage = echoMatcher.group(1);
+ bot.sendMessage(this.channel, echoMessage);
+ }
} else if (message.equalsIgnoreCase(Command.PREFIX + "listrenames")) {
//Generate a list of renames in the form of old1 changed to new1, old2 changed to new2, etc
StringBuilder users = new StringBuilder();
commit 66c47dde1721632eca6990d389195708e8deeefe
Author: Libor Zoubek <lzoubek(a)jezzovo.net>
Date: Fri May 24 16:40:57 2013 +0200
ircBot: improved recognition of commands
Bot now recognizes commands only when in the beginning of message or if you
highlight bot's nick and command is the very first word (like rhq-bot:
!help)
diff --git a/etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java b/etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java
index cd6d43a..1960f1d 100644
--- a/etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java
+++ b/etc/rhq-ircBot/src/main/java/org/rhq/etc/ircbot/RhqIrcBotListener.java
@@ -61,7 +61,7 @@ public class RhqIrcBotListener extends ListenerAdapter<RhqIrcBot> {
SUPPORT,
WIKI("Our wiki is available from https://docs.jboss.org/author/display/RHQ/Home", true);
- public static final char PREFIX = '!';
+ public static final String PREFIX = "!";
private final String staticRespond;
private final boolean includeInHelp;
@@ -106,7 +106,7 @@ public class RhqIrcBotListener extends ListenerAdapter<RhqIrcBot> {
this.channel = channel;
isRedHatChannel = "irc.devel.redhat.com".equals(channel);
StringBuilder commandRegExp = new StringBuilder();
- commandRegExp.append("(?i)\\").append(Command.PREFIX).append("[ ]*(");
+ commandRegExp.append("^(?i)[ ]*").append(Command.PREFIX).append("(");
for (Command command : Command.values()) {
commandRegExp.append(command.name()).append('|');
}
@@ -173,6 +173,11 @@ public class RhqIrcBotListener extends ListenerAdapter<RhqIrcBot> {
bot.sendMessage(event.getChannel(), event.getUser().getNick() + ": " + response);
}
+ if (message.startsWith(event.getBot().getNick())) {
+ // someone asked bot directly, we have to remove that from message
+ message = message.substring(event.getBot().getNick().length());
+ message = message.replaceFirst("[^ ]*", "");
+ }
// react to commands included in the messages
Matcher commandMatcher = commandPattern.matcher(message);
while (commandMatcher.find()) {
10 years, 12 months
[rhq] modules/enterprise
by lkrejci
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java | 70 +++++++---
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryRunner.java | 4
2 files changed, 51 insertions(+), 23 deletions(-)
New commits:
commit 078a2da4e488645284359940e3df7a61a0299109
Author: Lukas Krejci <lkrejci(a)redhat.com>
Date: Fri May 24 16:43:50 2013 +0200
[BZ 965833 - Potential bug in join/fetch/avoidance code]
It is now possible to lazily fetch fields defined in super classes.
The avoidance of the join-fetch with limits exposed a missing feature that
was present in the code from the day one. It would be failing if the
criteria query was used to fetch a custom object (i.e. not the primary
persistent class of the criteria object) using an "altered projection" and
a fetch would be set on a field defined in a super class of the persistent
class of the criteria object. Only by chance this has never happened
before, because we don't use the altered projections on the criteria
queries that often.
Now that we lazily fetch fields much more often (to avoid join fetch
with limits) this is a problem even in cases without an altered projection.
The fix is fortunately very simple - we need to also search the
superclasses of the criteria's persistent class when looking for a field
to lazily fetch.
The possibility of fields being present in super-classes was taken into
account on other places in the CriteriaQueryGenerator class, too.
Documentation on the getJoinFetchFields() and alterProjection() was
enhanced to hopefully better explain the conditions underwhich you can
combine fetching and altered projection together.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
index 867ea16..d1d2f73 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryGenerator.java
@@ -343,7 +343,7 @@ public final class CriteriaQueryGenerator {
} else {
if (this.projection == null) {
/*
- * if not altering the projection, join fetching can be using
+ * if not altering the projection, join fetching can be used
* to retrieve the associated instance in the same SELECT
*
* We further avoid a JOIN FETCH when executing queries with limits.
@@ -664,14 +664,9 @@ public final class CriteriaQueryGenerator {
}
private boolean isPersistentBag(String fieldName) {
- try {
- Class<?> persistentClass = criteria.getPersistentClass();
- Field field = persistentClass.getDeclaredField(fieldName);
+ Field field = findField(fieldName);
- return isAList(field) && !field.isAnnotationPresent(IndexColumn.class);
- } catch (NoSuchFieldException e) {
- return false;
- }
+ return field != null && isAList(field) && !field.isAnnotationPresent(IndexColumn.class);
}
private boolean isAList(Field field) {
@@ -690,23 +685,40 @@ public final class CriteriaQueryGenerator {
}
private void addPersistentBag(String fieldName) {
- try {
- Field field = criteria.getPersistentClass().getDeclaredField(fieldName);
- persistentBagFields.add(field);
- } catch (NoSuchFieldException e) {
- LOG.warn("Failed to add persistent bag collection on class [" + criteria.getPersistentClass().getName() +"]: ", e);
+ Field f = findField(fieldName);
+ if (f == null) {
+ LOG.warn(
+ "Failed to add persistent bag collection [" + fieldName + "] on class [" + criteria.getPersistentClass().getName() +
+ "]. There doesn't seem to be a field of that name on the class or any of its superclasses.");
+ } else {
+ persistentBagFields.add(f);
}
}
private void addJoinFetch(String fieldName) {
- try {
- Field field = criteria.getPersistentClass().getDeclaredField(fieldName);
- joinFetchFields.add(field);
- } catch (NoSuchFieldException e) {
- LOG.warn("Failed to add join fetch field on class [" + criteria.getPersistentClass().getName() + "]: ", e);
+ Field f = findField(fieldName);
+ if (f == null) {
+ LOG.warn(
+ "Failed to add join fetch field [" + fieldName + "] on class [" + criteria.getPersistentClass().getName() +
+ "]. There doesn't seem to be a field of that name on the class or any of its superclasses.");
+ } else {
+ joinFetchFields.add(f);
}
}
+ private Field findField(String fieldName) {
+ Class<?> cls = criteria.getPersistentClass();
+ while (cls != null) {
+ try {
+ return cls.getDeclaredField(fieldName);
+ } catch (NoSuchFieldException e) {
+ cls = cls.getSuperclass();
+ }
+ }
+
+ return null;
+ }
+
/**
* <strong>Note:</strong> This method should only be called after {@link #getQueryString(boolean)}} because it is
* that method where the persistentBagFields property is initialized.
@@ -718,6 +730,21 @@ public final class CriteriaQueryGenerator {
return persistentBagFields;
}
+ /**
+ * <strong>Note:</strong> This method should only be called after {@link #getQueryString(boolean)}} because it is
+ * that method where the persistentBagFields property is initialized.
+ * <p/>
+ * The elements of the returned list are a (sub)set of the fields that the criteria object specified to be fetched
+ * (using the fetchXXX() methods). If the {@link CriteriaQueryRunner} is not set to automatically fetch all the
+ * fields, you need to manually initialize these fields by for example using
+ * {@link CriteriaQueryRunner#initFetchFields(Object)} method on each of the results.
+ *
+ * @see #alterProjection(String) <code>alterProjection(String)</code> for special attention you need to make when
+ * mixing fetching fields and altered projection.
+ *
+ * @return Returns a list of fields from the persistent class to which the criteria class corresponds. The fields in
+ * the list are fields specified by the criteria to be fetched (using the fetchXXX() methods).
+ */
public List<Field> getJoinFetchFields() {
return joinFetchFields;
}
@@ -728,8 +755,11 @@ public final class CriteriaQueryGenerator {
* only affect the ResultSet for the data query, not the count query.
* <p/>
* If you are projecting a composite object that does not directly extend the entity your Criteria object
- * represents, then you will need to manually initialize the persistent bags using the methods exposed on
- * {@link CriteriaQueryRunner}
+ * represents, then you will need to manually initialize the persistent bags and fetch fields using the
+ * {@link CriteriaQueryRunner#initFetchFields(Object)} method for each object in the results (for which you need
+ * to instantiate the {@link CriteriaQueryRunner} with automatic fetching switched OFF). <b>Note</b> that this will
+ * NOT work on the composite object itself. You need to pass an instance of the entity class to the
+ *{@link CriteriaQueryRunner#initFetchFields(Object)} method.
*/
public void alterProjection(String projection) {
this.projection = projection;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryRunner.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryRunner.java
index a788fb0..73292be 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryRunner.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/util/CriteriaQueryRunner.java
@@ -129,9 +129,7 @@ public class CriteriaQueryRunner<T> {
public void initFetchFields(Object entity) {
initPersistentBags(entity);
- if (queryGenerator.isProjectionAltered()) {
- initJoinFetchFields(entity);
- }
+ initJoinFetchFields(entity);
}
private void initPersistentBags(Object entity) {
10 years, 12 months
[rhq] Branch 'feature/cassandra-backend' - modules/core modules/enterprise
by Jiri Kremser
modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeLoadComposite.java | 172 ++++++++++
modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java | 4
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerBean.java | 97 +++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java | 3
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java | 50 ++
5 files changed, 321 insertions(+), 5 deletions(-)
New commits:
commit 710fb376fff5175dd0d81995312d0e73450536c1
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri May 24 16:57:26 2013 +0200
Adding the getLoad() method to the StorageNodeManagerBean. It is half-way don, few aggregate metrics still needs to be added. Also exposing the StorageNodeManagerBean in CLI interface.
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
new file mode 100644
index 0000000..b7766e9
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNodeLoadComposite.java
@@ -0,0 +1,172 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2, as
+ * published by the Free Software Foundation, and/or the GNU Lesser
+ * General Public License, version 2.1, also as published by the Free
+ * Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License and the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the GNU Lesser General Public License along with this program;
+ * if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+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;
+
+/**
+ * @author Jiri Kremser
+ */
+public class StorageNodeLoadComposite implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private StorageNode storageNode;
+ 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
+
+ public StorageNodeLoadComposite() {
+ // GWT needs this
+ }
+
+ public StorageNodeLoadComposite(StorageNode storageNode, long beginTime, long endTime) {
+ this.storageNode = storageNode;
+ this.beginTime = beginTime;
+ this.endTime = endTime;
+ }
+
+ public StorageNode getStorageNode() {
+ return storageNode;
+ }
+
+ public void setStorageNode(StorageNode storageNode) {
+ this.storageNode = storageNode;
+ }
+
+ public long getBeginTime() {
+ return beginTime;
+ }
+
+ public void setBeginTime(long beginTime) {
+ this.beginTime = beginTime;
+ }
+
+ public long getEndTime() {
+ return endTime;
+ }
+
+ public void setEndTime(long endTime) {
+ this.endTime = endTime;
+ }
+
+ public MeasurementAggregateWithUnits getHeapCommited() {
+ return heapCommited;
+ }
+
+ public void setHeapCommited(MeasurementAggregateWithUnits heapCommited) {
+ this.heapCommited = heapCommited;
+ }
+
+ public MeasurementAggregateWithUnits getHeapUsed() {
+ return heapUsed;
+ }
+
+ public void setHeapUsed(MeasurementAggregateWithUnits heapUsed) {
+ this.heapUsed = heapUsed;
+ }
+
+ public MeasurementAggregateWithUnits getLoad() {
+ return load;
+ }
+
+ public void setLoad(MeasurementAggregateWithUnits load) {
+ this.load = load;
+ }
+
+ public MeasurementAggregate getTokens() {
+ return tokens;
+ }
+
+ public void setTokens(MeasurementAggregate tokens) {
+ this.tokens = tokens;
+ }
+
+ public MeasurementAggregateWithUnits getActuallyOwns() {
+ return actuallyOwns;
+ }
+
+ public void setActuallyOwns(MeasurementAggregateWithUnits actuallyOwns) {
+ this.actuallyOwns = actuallyOwns;
+ }
+
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ // gwt doesn't support String.format
+// builder.append("average values for last ");
+// builder.append((endtime - begintime) / (1000 * 60 * 60));
+// builder.append(" hours");
+// builder.append("\naddress load tokens owns (effective)\n");
+// builder.append(string.format("%15s", storagenode.getaddress()));
+// builder.append(string.format("%11s", load.getaggregate().getavg())).append(" ").append(load.getunits().getname());
+// builder.append(string.format("%8s", tokens.getavg()));
+// builder.append(string.format("%16s", actuallyowns.getavg()));
+
+ builder.append("storageNode.addresss=").append(storageNode.getAddress()).append(", ");
+ builder.append("beginTime=").append(beginTime).append(", ");
+ builder.append("heapCommited=").append(heapCommited).append(", ");
+ builder.append("heapUsed=").append(heapUsed).append(", ");
+ builder.append("load=").append(load).append(", ");
+ builder.append("tokens=").append(tokens).append(", ");
+ builder.append("actuallyOwns=").append(actuallyOwns);
+ return builder.toString();
+ }
+
+
+ public static class MeasurementAggregateWithUnits implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private final MeasurementAggregate aggregate;
+ private final MeasurementUnits units;
+
+ public MeasurementAggregateWithUnits(MeasurementAggregate aggregate, MeasurementUnits units) {
+ this.aggregate = aggregate;
+ this.units = units;
+ }
+
+ public MeasurementAggregate getAggregate() {
+ return aggregate;
+ }
+
+ public MeasurementUnits getUnits() {
+ return units;
+ }
+
+ @Override
+ public String toString() {
+ return aggregate.toString() + " (" + units.toString() + ")";
+ }
+ }
+}
diff --git a/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java b/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java
index 2c781a1..a23534b 100644
--- a/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java
+++ b/modules/enterprise/binding/src/main/java/org/rhq/bindings/client/RhqManager.java
@@ -24,6 +24,7 @@ import org.rhq.enterprise.server.alert.AlertManagerRemote;
import org.rhq.enterprise.server.auth.SubjectManagerRemote;
import org.rhq.enterprise.server.authz.RoleManagerRemote;
import org.rhq.enterprise.server.bundle.BundleManagerRemote;
+import org.rhq.enterprise.server.cloud.StorageNodeManagerRemote;
import org.rhq.enterprise.server.configuration.ConfigurationManagerRemote;
import org.rhq.enterprise.server.content.ContentManagerRemote;
import org.rhq.enterprise.server.content.RepoManagerRemote;
@@ -40,11 +41,11 @@ import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerRemote;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerRemote;
import org.rhq.enterprise.server.operation.OperationManagerRemote;
import org.rhq.enterprise.server.report.DataAccessManagerRemote;
-import org.rhq.enterprise.server.resource.group.definition.GroupDefinitionManagerRemote;
import org.rhq.enterprise.server.resource.ResourceFactoryManagerRemote;
import org.rhq.enterprise.server.resource.ResourceManagerRemote;
import org.rhq.enterprise.server.resource.ResourceTypeManagerRemote;
import org.rhq.enterprise.server.resource.group.ResourceGroupManagerRemote;
+import org.rhq.enterprise.server.resource.group.definition.GroupDefinitionManagerRemote;
import org.rhq.enterprise.server.search.SavedSearchManagerRemote;
import org.rhq.enterprise.server.support.SupportManagerRemote;
import org.rhq.enterprise.server.sync.SynchronizationManagerRemote;
@@ -83,6 +84,7 @@ public enum RhqManager {
ResourceTypeManager(ResourceTypeManagerRemote.class, "${ResourceTypeManager}"), //
RoleManager(RoleManagerRemote.class, "${RoleManager}"), //
SavedSearchManager(SavedSearchManagerRemote.class, "${SavedSearchManager}"), //
+ StorageNodeManager(StorageNodeManagerRemote.class, "${StorageNodeManager}"), //
SubjectManager(SubjectManagerRemote.class, "${SubjectManager}"), //
SupportManager(SupportManagerRemote.class, "${SupportManager}"), //
SystemManager(SystemManagerRemote.class, "${SystemManager}"), //
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 49f8dde..8b874ec 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
@@ -26,9 +26,11 @@ package org.rhq.enterprise.server.cloud;
import java.util.ArrayList;
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;
@@ -44,22 +46,33 @@ import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
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;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.RHQConstants;
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.util.CriteriaQueryGenerator;
import org.rhq.enterprise.server.util.CriteriaQueryRunner;
import org.rhq.server.metrics.CQLException;
@Stateless
-public class StorageNodeManagerBean implements StorageNodeManagerLocal {
+public class StorageNodeManagerBean implements StorageNodeManagerLocal, StorageNodeManagerRemote {
private static final String RESOURCE_TYPE_NAME = "RHQ Storage Node";
private static final String PLUGIN_NAME = "RHQStorage";
@@ -68,7 +81,13 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal {
private EntityManager entityManager;
@EJB
- ResourceManagerLocal resourceManager;
+ private MeasurementDataManagerLocal measurementManager;
+
+ @EJB
+ private MeasurementScheduleManagerLocal scheduleManager;
+
+ @EJB
+ private MeasurementDefinitionManagerLocal measurementDefinitionManager;
@PostConstruct
@Override
@@ -142,7 +161,7 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal {
StorageNode storageNode = storageNodeMap.get(host);
storageNode.setResource(resource);
- if(resource.getInventoryStatus() == InventoryStatus.NEW){
+ if (resource.getInventoryStatus() == InventoryStatus.NEW) {
storageNode.setOperationMode(OperationMode.INSTALLED);
} else if (resource.getInventoryStatus() == InventoryStatus.COMMITTED
&& resource.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP) {
@@ -152,9 +171,79 @@ public class StorageNodeManagerBean implements StorageNodeManagerLocal {
}
}
+ public StorageNodeLoadComposite getLoad(Subject subject, StorageNode node, long beginTime, long endTime) {
+ //TODO: check the rights of subject
+ StorageNodeLoadComposite result = new StorageNodeLoadComposite(node, beginTime, endTime);
+
+ 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;
+ }
+ }
+ }
+ }
+
+ // 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);
+ }
+ }
+ }
+
+ // 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
+
+ return result;
+ }
+
@Nullable
public List<StorageNode> getStorageNodes() {
- TypedQuery<StorageNode> query = entityManager.<StorageNode>createNamedQuery(StorageNode.QUERY_FIND_ALL, StorageNode.class);
+ TypedQuery<StorageNode> query = entityManager.<StorageNode> createNamedQuery(StorageNode.QUERY_FIND_ALL,
+ StorageNode.class);
return query.getResultList();
}
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java
index dc615ed..4ec421c 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerLocal.java
@@ -25,6 +25,7 @@ import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.cloud.StorageNode;
+import org.rhq.core.domain.cloud.StorageNodeLoadComposite;
import org.rhq.core.domain.criteria.StorageNodeCriteria;
import org.rhq.core.domain.util.PageList;
@@ -36,6 +37,8 @@ public interface StorageNodeManagerLocal {
List<StorageNode> getStorageNodes();
void updateStorageNodeList(Collection<StorageNode> storageNodes);
+
+ StorageNodeLoadComposite getLoad(Subject subject, StorageNode node, long beginTime, long endTime);
/**
* Fetches the list of StorageNode entities based on provided criteria.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java
new file mode 100644
index 0000000..1904242
--- /dev/null
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/cloud/StorageNodeManagerRemote.java
@@ -0,0 +1,50 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2013 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.enterprise.server.cloud;
+
+import javax.ejb.Remote;
+
+import org.rhq.core.domain.auth.Subject;
+import org.rhq.core.domain.cloud.StorageNode;
+import org.rhq.core.domain.cloud.StorageNodeLoadComposite;
+import org.rhq.core.domain.criteria.StorageNodeCriteria;
+import org.rhq.core.domain.util.PageList;
+
+/**
+ * Remote interface to the manager responsible for creating and managing storage nodes.
+ *
+ * @author Jirka Kremser
+ */
+@Remote
+public interface StorageNodeManagerRemote {
+
+ StorageNodeLoadComposite getLoad(Subject subject, StorageNode node, long beginTime, long endTime);
+
+ /**
+ * Fetches the list of StorageNode entities based on provided criteria.
+ *
+ * the subject needs to have MANAGE_SETTINGS permissions.
+ *
+ * @param subject user that must have proper permissions
+ * @param criteria the criteria
+ * @return list of nodes
+ */
+ PageList<StorageNode> findStorageNodesByCriteria(Subject subject, StorageNodeCriteria criteria);
+
+}
10 years, 12 months
[rhq] Branch 'feature/cassandra-backend' - modules/enterprise
by Jiri Kremser
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java | 1 +
1 file changed, 1 insertion(+)
New commits:
commit f4be227421e9440d1e0ba7e3891da0282699fed0
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri May 24 13:56:10 2013 +0200
Fixing the build (missing import)
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java
index ed7f495..163a61b 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBeanTest.java
@@ -49,6 +49,7 @@ import org.testng.annotations.Test;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.criteria.ResourceCriteria;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDefinition;
import org.rhq.core.domain.measurement.MeasurementReport;
10 years, 12 months
[rhq] Branch 'feature/cassandra-backend' - 4 commits - modules/core modules/enterprise modules/plugins
by Jiri Kremser
modules/core/domain/src/main/java/org/rhq/core/domain/cloud/StorageNode.java | 2
modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementAggregate.java | 82 ++++++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java | 82 ----------
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerLocal.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerBean.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerLocal.java | 1
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java | 2
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java | 2
modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java | 7
modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java | 61 +++++++
modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml | 3
modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java | 9 -
16 files changed, 167 insertions(+), 90 deletions(-)
New commits:
commit 2f6e74080e22995807d8a820369e65a938998304
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri May 24 11:29:19 2013 +0200
Refactoring: moving the MeasurementAggregate from server/jar to core/domain in order to be able to reuse it from other modules
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 8672966..1970349 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
@@ -1,6 +1,6 @@
/*
* RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
+ * Copyright (C) 2005-2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
diff --git a/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementAggregate.java b/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementAggregate.java
new file mode 100644
index 0000000..cadf0fd
--- /dev/null
+++ b/modules/core/domain/src/main/java/org/rhq/core/domain/measurement/MeasurementAggregate.java
@@ -0,0 +1,82 @@
+/*
+ * RHQ Management Platform
+ * Copyright (C) 2005-2008 Red Hat, Inc.
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.rhq.core.domain.measurement;
+
+import java.io.Serializable;
+
+/**
+ * Simple Java Bean to hold aggregate values
+ *
+ * @author <a href="mailto:heiko.rupp@redhat.com">Heiko W. Rupp</a>
+ */
+public class MeasurementAggregate implements Serializable {
+
+ static final long serialVersionUID = 5673395371271765240L;
+
+ Double min;
+ Double avg;
+ Double max;
+
+ public MeasurementAggregate() {
+ }
+
+ public MeasurementAggregate(Double min, Double avg, Double max) {
+ this.min = (min != null) ? min : Double.NaN;
+ this.avg = (avg != null) ? avg : Double.NaN;
+ this.max = (max != null) ? max : Double.NaN;
+ }
+
+ public Double getMin() {
+ return min;
+ }
+
+ public void setMin(Double min) {
+ this.min = min;
+ }
+
+ public Double getAvg() {
+ return avg;
+ }
+
+ public void setAvg(Double avg) {
+ this.avg = avg;
+ }
+
+ public Double getMax() {
+ return max;
+ }
+
+ public void setMax(Double max) {
+ this.max = max;
+ }
+
+ @Override
+ public String toString() {
+ return "Min: " + min + ", Max: " + max + ", Avg: " + avg;
+ }
+
+ /**
+ * Return true if the aggregate has "no real data" I.e. when all values are Not A Number.
+ *
+ * @return
+ */
+ public boolean isEmpty() {
+ return min.isNaN() && avg.isNaN() && max.isNaN();
+ }
+}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java
deleted file mode 100644
index 8f93d75..0000000
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementAggregate.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * RHQ Management Platform
- * Copyright (C) 2005-2008 Red Hat, Inc.
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.rhq.enterprise.server.measurement;
-
-import java.io.Serializable;
-
-/**
- * Simple Java Bean to hold aggregate values
- *
- * @author <a href="mailto:heiko.rupp@redhat.com">Heiko W. Rupp</a>
- */
-public class MeasurementAggregate implements Serializable {
-
- static final long serialVersionUID = 5673395371271765240L;
-
- Double min;
- Double avg;
- Double max;
-
- public MeasurementAggregate() {
- }
-
- public MeasurementAggregate(Double min, Double avg, Double max) {
- this.min = (min != null) ? min : Double.NaN;
- this.avg = (avg != null) ? avg : Double.NaN;
- this.max = (max != null) ? max : Double.NaN;
- }
-
- public Double getMin() {
- return min;
- }
-
- public void setMin(Double min) {
- this.min = min;
- }
-
- public Double getAvg() {
- return avg;
- }
-
- public void setAvg(Double avg) {
- this.avg = avg;
- }
-
- public Double getMax() {
- return max;
- }
-
- public void setMax(Double max) {
- this.max = max;
- }
-
- @Override
- public String toString() {
- return "Min: " + min + ", Max: " + max + ", Avg: " + avg;
- }
-
- /**
- * Return true if the aggregate has "no real data" I.e. when all values are Not A Number.
- *
- * @return
- */
- public boolean isEmpty() {
- return min.isNaN() && avg.isNaN() && max.isNaN();
- }
-}
\ No newline at end of file
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
index 37af9de..22ebb71 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
@@ -38,6 +38,7 @@ import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.authz.Permission;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementBaseline;
import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.measurement.NumericType;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
index be87485..c481c6e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementChartsManagerBean.java
@@ -39,6 +39,7 @@ import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.DisplayType;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementDefinition;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
index 2f300c3..454004e 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
@@ -58,6 +58,7 @@ import org.rhq.core.domain.criteria.MeasurementDataTraitCriteria;
import org.rhq.core.domain.criteria.MeasurementScheduleCriteria;
import org.rhq.core.domain.measurement.DataType;
import org.rhq.core.domain.measurement.DisplayType;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementData;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerLocal.java
index 644107d..667d3a4 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerLocal.java
@@ -27,6 +27,7 @@ import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementData;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java
index 5edb84c..fb50541 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote.java
@@ -26,6 +26,7 @@ import javax.ejb.Remote;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.criteria.MeasurementDataTraitCriteria;
import org.rhq.core.domain.measurement.DisplayType;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementData;
import org.rhq.core.domain.measurement.MeasurementDataTrait;
import org.rhq.core.domain.measurement.MeasurementDefinition;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerBean.java
index 26d580b..a94cdc7 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerBean.java
@@ -33,6 +33,7 @@ import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
import org.rhq.enterprise.server.cassandra.SessionManagerBean;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerLocal.java
index 9880d1f..083076d 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MetricsManagerLocal.java
@@ -30,6 +30,7 @@ import java.util.Set;
import javax.ejb.Local;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
import org.rhq.server.metrics.domain.AggregateNumericMetric;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java
index 7a60953..a7676ae 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/util/MeasurementDataManagerUtility.java
@@ -38,13 +38,13 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.common.EntityContext;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataPK;
import org.rhq.core.domain.measurement.composite.MeasurementDataNumericHighLowComposite;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.util.jdbc.JDBCUtil;
import org.rhq.enterprise.server.RHQConstants;
-import org.rhq.enterprise.server.measurement.MeasurementAggregate;
import org.rhq.enterprise.server.measurement.MeasurementNotFoundException;
import org.rhq.enterprise.server.util.LookupUtil;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java
index d7ddb92..eb21bcc 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/rest/MetricHandlerBean.java
@@ -69,6 +69,7 @@ import org.jboss.resteasy.annotations.GZIP;
import org.rhq.core.domain.common.EntityContext;
import org.rhq.core.domain.measurement.DataType;
+import org.rhq.core.domain.measurement.MeasurementAggregate;
import org.rhq.core.domain.measurement.MeasurementBaseline;
import org.rhq.core.domain.measurement.MeasurementDataNumeric;
import org.rhq.core.domain.measurement.MeasurementDataPK;
@@ -81,7 +82,6 @@ import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.resource.group.ResourceGroup;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.cassandra.SessionManagerBean;
-import org.rhq.enterprise.server.measurement.MeasurementAggregate;
import org.rhq.enterprise.server.measurement.MeasurementDataManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerLocal;
import org.rhq.enterprise.server.measurement.MeasurementScheduleManagerLocal;
commit f79b774f09b47a758537ea9ac13b4495badfb518
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri May 24 11:26:27 2013 +0200
Exposing new metric for Cassandra plugin - Ownership. Forgot to add one method.
diff --git a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java
index cbbdcf6..a1636e7 100644
--- a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java
+++ b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/CassandraNodeComponent.java
@@ -63,13 +63,14 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
private Log log = LogFactory.getLog(CassandraNodeComponent.class);
private Session cassandraSession;
+ private String host;
@SuppressWarnings("rawtypes")
@Override
public void start(ResourceContext context) throws Exception {
super.start(context);
- String host = context.getPluginConfiguration().getSimpleValue("host", "localhost");
+ host = context.getPluginConfiguration().getSimpleValue("host", "localhost");
String clusterName = context.getPluginConfiguration().getSimpleValue("clusterName", "unknown");
String username = context.getPluginConfiguration().getSimpleValue("username", "cassandra");
String password = context.getPluginConfiguration().getSimpleValue("password", "cassandra");
@@ -228,4 +229,8 @@ public class CassandraNodeComponent extends JMXServerComponent<ResourceComponent
public Session getCassandraSession() {
return this.cassandraSession;
}
+
+ public String getHost() {
+ return host;
+ }
}
commit dd72c1bafe999d765dcdf18629d8e07d2a51389f
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Fri May 24 11:22:48 2013 +0200
Exposing new metric for Cassandra plugin - Ownership. This has to be calculated manually in the getValues() method on StorageServiceComponent.
diff --git a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java
index 861464b..aa20464 100644
--- a/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java
+++ b/modules/plugins/cassandra/src/main/java/org/rhq/plugins/cassandra/StorageServiceComponent.java
@@ -29,6 +29,11 @@ import static org.rhq.core.domain.measurement.AvailabilityType.DOWN;
import static org.rhq.core.domain.measurement.AvailabilityType.UNKNOWN;
import static org.rhq.core.domain.measurement.AvailabilityType.UP;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Map;
+import java.util.Set;
+
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.mc4j.ems.connection.bean.EmsBean;
@@ -37,16 +42,35 @@ import org.mc4j.ems.connection.bean.operation.EmsOperation;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.measurement.AvailabilityType;
+import org.rhq.core.domain.measurement.MeasurementDataNumeric;
+import org.rhq.core.domain.measurement.MeasurementReport;
+import org.rhq.core.domain.measurement.MeasurementScheduleRequest;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.pluginapi.operation.OperationResult;
+import org.rhq.plugins.jmx.JMXComponent;
/**
* @author John Sanda
*/
public class StorageServiceComponent extends ComplexConfigurationResourceComponent {
-
+
+ private static final String OWNERSHIP_METRIC_NAME = "Ownership";
private Log log = LogFactory.getLog(StorageServiceComponent.class);
-
+ private InetAddress host;
+
+ @Override
+ public void start(ResourceContext<JMXComponent<?>> context) {
+ super.start(context);
+ CassandraNodeComponent parrent = (CassandraNodeComponent) context.getParentResourceComponent();
+ try {
+ host = InetAddress.getByName(parrent.getHost());
+ } catch (UnknownHostException e) {
+ log.error(
+ "Unable to convert hostname[" + parrent.getHost() + "] into IP address for " + context.getResourceKey(),
+ e);
+ }
+ }
+
@Override
public AvailabilityType getAvailability() {
ResourceContext<?> context = getResourceContext();
@@ -121,4 +145,37 @@ public class StorageServiceComponent extends ComplexConfigurationResourceCompone
return new OperationResult();
}
+
+ @Override
+ protected void getValues(MeasurementReport report, Set<MeasurementScheduleRequest> requests, EmsBean bean) {
+ super.getValues(report, requests, bean);
+ for (MeasurementScheduleRequest request : requests) {
+ if (OWNERSHIP_METRIC_NAME.equals(request.getName()) && host != null) {
+ EmsAttribute attribute = bean.getAttribute(OWNERSHIP_METRIC_NAME);
+ Object valueObject = attribute.refresh();
+ if (valueObject instanceof Map<?, ?>) {
+ Map<InetAddress, Float> ownership = (Map<InetAddress, Float>) valueObject;
+ Float value = ownership.get(host);
+ if (value == null) {
+ // the inet address wasn't probably resolved, scan the map
+ for (Map.Entry<InetAddress, Float> entry : ownership.entrySet()) {
+ if (entry.getKey().getHostAddress().equals(host.getHostAddress())) {
+ value = entry.getValue();
+ break;
+ }
+ }
+ }
+ if (value > 1) {
+ value = 1f;
+ }
+ report.addData(new MeasurementDataNumeric(request, value.doubleValue()));
+ }
+ break;
+ }
+ }
+ }
+
+ public static boolean kindOfIP(final String addr) {
+ return addr.matches("^\\d{1,3}\\.\\d{1,3\\.\\d{1,3\\.\\d{1,3$"); // || addr.indexOf(":") >= 0) or IPv6
+ }
}
diff --git a/modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml
index e035ae1..752c72a 100644
--- a/modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml
@@ -178,6 +178,7 @@
<metric property="LocalHostId" dataType="trait" displayType="summary" description="Local Host Id"/>
<metric property="Load" dataType="measurement" units="bytes" displayType="summary" description="Amount of load in disk usage on the node being queried"/>
<metric property="OperationMode" dataType="trait" displayType="summary" description="Current operation mode"/>
+ <metric property="Ownership" displayName="Owns" dataType="measurement" units="percentage" displayType="summary" description="Token range ownership (percentual amount of the whole keyspace)"/>
<metric property="NativeTransportRunning" dataType="trait" displayType="summary" description="Native Transport Running"/>
<metric property="ReleaseVersion" dataType="trait" displayType="summary" description="Cassandra version"/>
<metric property="RPCServerRunning" dataType="trait" displayType="summary" displayName="RPC Service Running" description="RPC Service Running"/>
@@ -186,7 +187,7 @@
in the system.schema_* column families. This value is used in an algorithm to compare schema versions
between nodes and apply updates as necessary. This value should be the same for all fully initialized
nodes in the cluster."/>
- <metric property="Tokens" dataType="measurement" displayType="summary" description="Number of Tokens"/>
+ <metric property="Tokens" dataType="measurement" displayType="summary" description="Number of tokens belonging to this node"/>
<resource-configuration>
commit 17cbff1dc4d70d895301b4599f661ace635e089d
Author: Jirka Kremser <jkremser(a)redhat.com>
Date: Thu May 23 18:15:58 2013 +0200
Exposing new metric for Cassandra plugin - Tokens. Also improving the jmx plugin to be able to interpret the measurements when the List is returned from attribute.getValue(). The meassurement value is then calculated as the number of elements in the obtained list.
diff --git a/modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml b/modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml
index edc3950..e035ae1 100644
--- a/modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml
+++ b/modules/plugins/cassandra/src/main/resources/META-INF/rhq-plugin.xml
@@ -186,6 +186,8 @@
in the system.schema_* column families. This value is used in an algorithm to compare schema versions
between nodes and apply updates as necessary. This value should be the same for all fully initialized
nodes in the cluster."/>
+ <metric property="Tokens" dataType="measurement" displayType="summary" description="Number of Tokens"/>
+
<resource-configuration>
<c:group name="DataStorage">
diff --git a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java
index 0758a39..5637c2d 100644
--- a/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java
+++ b/modules/plugins/jmx/src/main/java/org/rhq/plugins/jmx/MBeanResourceComponent.java
@@ -356,8 +356,13 @@ public class MBeanResourceComponent<T extends JMXComponent<?>> implements Measur
value = lookupAttributeProperty(value, fullProperty);
}
- if ((request.getDataType() == DataType.MEASUREMENT) && (value instanceof Number)) {
- report.addData(new MeasurementDataNumeric(request, ((Number) value).doubleValue()));
+ if (request.getDataType() == DataType.MEASUREMENT) {
+ if (value instanceof Number) {
+ report.addData(new MeasurementDataNumeric(request, ((Number) value).doubleValue()));
+ } else if ((value instanceof List<?>)) {
+ // add the number of elements
+ report.addData(new MeasurementDataNumeric(request, Double.valueOf(((List<?>) value).size())));
+ }
} else if (request.getDataType() == DataType.TRAIT) {
String displayValue = null;
if ((value != null) && value.getClass().isArray()) {
10 years, 12 months
[rhq] modules/enterprise
by Heiko W. Rupp
modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties | 86 +++++-----
1 file changed, 43 insertions(+), 43 deletions(-)
New commits:
commit adac13e48ddd26aa55b6a6cbc6f3c3bcff5f802e
Author: Heiko W. Rupp <hwr(a)redhat.com>
Date: Fri May 24 11:14:44 2013 +0200
Add some translations
diff --git a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
index 057785a..d158243 100644
--- a/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
+++ b/modules/enterprise/gui/coregui/src/main/resources/org/rhq/enterprise/gui/coregui/client/Messages_de.properties
@@ -10,25 +10,25 @@
#
###################################
##avail_chart_down_label = DOWN
-##avail_chart_title_label = Availability
+avail_chart_title_label = Verfügbarkeit
##avail_chart_up_label = UP
-##chart_date_label = Date
+chart_date_label = Datum
##chart_down_label = Down
##chart_time_label = Start
-##chart_unknown_label = Unknown
-##chart_no_data_label = No Data
-##chart_title_avg_label = Avg
-##chart_title_min_label = Min
-##chart_title_peak_label = Max
-##chart_hover_availability_label = Availability
-##chart_hover_availability_type_warn = MIXED
-##chart_hover_date_format = %m/%d/%y
+chart_unknown_label = Unbekannt
+chart_no_data_label = Keine Daten vorhanden
+chart_title_avg_label = Durchschn.
+chart_title_min_label = Min
+chart_title_peak_label = Max
+chart_hover_availability_label = Verfügbarkeit
+chart_hover_availability_type_warn = Gemischt
+chart_hover_date_format = %d.%m.%y
##chart_hover_time_format = %I:%M:%S %p
-##chart_ie_not_supported = Charting is not available for this browser.
-##chart_hover_start_label = Start
-##chart_hover_end_label = End
+chart_ie_not_supported = Charting ist bei diesem Browser nicht unterstützt
+chart_hover_start_label = Start
+chart_hover_end_label = Ende
##chart_hover_period_label = Period
-##chart_hover_bar_label = Duration
+chart_hover_bar_label = Dauer
common_alert_high = HOCH
common_alert_low = NIEDRIG
common_alert_medium = MITTEL
@@ -68,7 +68,7 @@ common_button_schedule = Planen
common_button_search = Suchen
common_button_set = Setzen
common_button_showDetails = Details anzeigen...
-##common_button_unignore = Unignore
+common_button_unignore = Ignorieren aufheben
common_button_uninventory = Aus dem Inventar löschen
common_calendar_april_short = Apr
common_calendar_august_short = Aug
@@ -91,7 +91,7 @@ common_label_filters = Filter
common_label_hour = Stunde
common_label_item = Eintrag
common_label_items = Einträge
-##common_label_link = Link
+common_label_link = Link
common_label_month = Monat
common_label_none = keine
common_label_none2 = keines
@@ -128,7 +128,7 @@ common_status_nochange = Keine Änderung
common_status_partial = partiell
common_status_success = Erfolg
common_status_unknown = Unbekannt
-##common_title_acknowledged = Acknowledged
+common_title_acknowledged = Bestätigt
common_title_add_column = Spalte hinzufügen
common_title_add_portlet = Portlet hinzufügen
common_title_address = Adresse
@@ -418,7 +418,7 @@ favorites_recentlyViewed = Kürzlich angesehen
favorites_resources = Gemerkte Ressourcen
filter_from_date = Von
filter_to_date = Bis
-##group_tree_groupOfResourceType = Group of [{0}]
+group_tree_groupOfResourceType = Gruppe von [{0}]
group_tree_partialClusterTooltip = {0} der {1} Gruppenmitglieder haben eine ''{2}'' Ressource
util_disambiguationReportDecorator_pluginSuffix = ({0} Plugin)
util_errorHandler_nullException = Exception war null
@@ -441,8 +441,8 @@ view_adminConfig_agentPlugins = Agent Plugins
view_adminConfig_alertDefTemplates = Vorlagen für Alarmdefinitionen
view_adminConfig_downloads = Downloads
view_adminConfig_driftDefTemplates = Vorlagen für Dritf-Definitionen
-##view_adminConfig_ignoreResourceTypes = Ignored Resource Types
-##view_adminConfig_ignoreResourceTypes_changeTitle = Change?
+view_adminConfig_ignoreResourceTypes = Ignorierte Ressource Typen
+view_adminConfig_ignoreResourceTypes_changeTitle = Ändern?
##view_adminConfig_ignoreResourceTypes_confirmIgnore = Are you sure you want to ignore the resource type [{0}]? You will no longer be able to import resources of this type and any resources of this type that are already in inventory will be uninventoried and you can no longer manage them.
##view_adminConfig_ignoreResourceTypes_confirmUnignore = Are you sure you want to unignore the resource type [{0}]? Any resources of this type that exist in your managed environment will be able to be discovered and inventoried.
##view_adminConfig_ignoreResourceTypes_failure = Failed to set the ignore flag on the selected resource type.
@@ -456,7 +456,7 @@ view_adminConfig_systemSettings = Systemeinstellungen
view_adminContent_contentSources = Quellen für Inhalte
view_adminRoles_assignedGroups = Zugewiesene Ressourcen-Gruppen
view_adminRoles_assignedSubjects = Zugewisene Benutzer
-##view_adminRoles_failCreateRoleWithExistingName = Failed to create role with existing name [{0}]. Please use another name.
+view_adminRoles_failCreateRoleWithExistingName = Konnte die Rolle mit dem existierenden Namen [{0}] nicht anlegen. Bitte wählen Sie einen anderen Namen.
view_adminRoles_failLdap = Konnte nicht ermitteln, ob LDAP konfiguriert ist - gehe von keiner LDAP-Konfiguration aus.
view_adminRoles_failLdapGroups = Konnte de LDAP-Gruppen nicht laden. Annahme ist, dass es keine gibt.
view_adminRoles_failLdapGroupsRole = Konnte die LDAP-Gruppen für die Rolle nicht laden.
@@ -526,23 +526,23 @@ view_adminTemplates_pluginTemplates = Vorlagen für Plugins Plugins
view_adminTemplates_servers = Server
view_adminTemplates_userTemplates = Nutzers-spezifische Vorlagen
view_adminTopology_affinityGroups = Affinitätsgruppen
-##view_adminTopology_affinityGroups_agentCount = Agent Count
-##view_adminTopology_affinityGroups_agentsInThisGroup = Agents in This Group
+view_adminTopology_affinityGroups_agentCount = Anzahl Agenten
+view_adminTopology_affinityGroups_agentsInThisGroup = Agenten in dieser Gruppe
##view_adminTopology_affinityGroups_agentsNotPartOfAnAffinityGroup = Agents not Part of an Affinity Group
##view_adminTopology_affinityGroups_agetnMembers = Agent Members
-##view_adminTopology_affinityGroups_createNew = Create New
+view_adminTopology_affinityGroups_createNew = Neu anlegen
##view_adminTopology_affinityGroups_details = Affinity Group Details
-##view_adminTopology_affinityGroups_removeSelected = Remove Selected
-##view_adminTopology_affinityGroups_serverCount = Server Count
+view_adminTopology_affinityGroups_removeSelected = Ausgewählte entfernen
+view_adminTopology_affinityGroups_serverCount = Anzahl Server
##view_adminTopology_affinityGroups_serverMembers = Server Members
-##view_adminTopology_agentDetail_address = Address
+view_adminTopology_agentDetail_address = Adresse
##view_adminTopology_agentDetail_agentFailoverList = Agent Failover List
-##view_adminTopology_agentDetail_currentServer = Current Server
+view_adminTopology_agentDetail_currentServer = Aktueller Server
##view_adminTopology_agentDetail_token = Token
##view_adminTopology_agent_agentBindAddress = Agent Bind Address
##view_adminTopology_agent_agentBindPort = Agent Bind Port
-##view_adminTopology_agent_agentName = Agent Name
-##view_adminTopology_agent_connectedServer = Connected Server
+view_adminTopology_agent_agentName = Name des Agenten
+view_adminTopology_agent_connectedServer = Verbundener Server
##view_adminTopology_agent_delete_confirm = This will deregister the selected agents and uninventory their corresponding platforms and all other resources associated with them. There is no way to undo this action. Are you sure you want to do this?
##view_adminTopology_agent_lastAvailabilityPing = Last Availability Ping
##view_adminTopology_agent_lastAvailabilityReport = Last Availability Report
@@ -592,7 +592,7 @@ view_adminTopology_partitionEvents = Partitionierungs-Ereignisse
##view_adminTopology_partitionEventsDetail_eventDetails = Event Details
##view_adminTopology_partitionEventsDetail_eventExecutionTime = Event Execution Time
##view_adminTopology_partitionEventsDetail_eventType = Event Type
-##view_adminTopology_partitionEvents_details = Details
+view_adminTopology_partitionEvents_details = Details
##view_adminTopology_partitionEvents_detailsFilter = Details Filter
##view_adminTopology_partitionEvents_execStatusFilter = Execution Status Filter
##view_adminTopology_partitionEvents_execTime = Execution Time
@@ -600,7 +600,7 @@ view_adminTopology_partitionEvents = Partitionierungs-Ereignisse
##view_adminTopology_partitionEvents_forceRepartition = Force Repartition
##view_adminTopology_partitionEvents_initiatedBy = Initiated By
##view_adminTopology_partitionEvents_purgeAll = Purge All
-##view_adminTopology_partitionEvents_type = Type
+view_adminTopology_partitionEvents_type = Typ
##view_adminTopology_partitionEvents_typeFilter = Type Filter
view_adminTopology_remoteAgentInstall = Installation entfernter Agenten
##view_adminTopology_serverDetail_connectedAgents = Connected Agents
@@ -610,7 +610,7 @@ view_adminTopology_remoteAgentInstall = Installation entfernter Agenten
##view_adminTopology_server_agentCount = Agent Count
##view_adminTopology_server_endpointAddress = Endpoint Address
##view_adminTopology_server_lastUpdateTime = Last Update Time
-##view_adminTopology_server_mode = Mode
+view_adminTopology_server_mode = Modus
##view_adminTopology_server_nonSecurePort = Nonsecure Port
##view_adminTopology_server_removeSelected = Remove Selected
##view_adminTopology_server_securePort = Secure Port
@@ -728,15 +728,15 @@ view_admin_systemSettings_serverDetails_dbUrl = URL der Datenbankverbindung
view_admin_systemSettings_serverDetails_dbVersion = Produktversion der Datenbank
view_admin_systemSettings_serverDetails_installDir = Installationsverzeichnis des Servers
view_admin_systemSettings_serverDetails_nextRotation = Nächste Rotation der Metrik-Tabellen
-##view_admin_systemSettings_serverDetails_productName = Product Name
-##view_admin_systemSettings_serverDetails_serverName = Server Name
+view_admin_systemSettings_serverDetails_productName = Produktname
+view_admin_systemSettings_serverDetails_serverName = Servername
view_admin_systemSettings_serverDetails_time = Lokale Zeit des Servers
view_admin_systemSettings_serverDetails_tz = Zeitzone des Servers
view_admin_topology = Topologie
view_alert_common_tab_conditions = Bedingungen
view_alert_common_tab_conditions_expression = Alarm auslösen wenn
##view_alert_common_tab_conditions_expression_tooltip = Determines if ANY or ALL of the conditions must evaluate to true in order for the entire condition set to be considered true.
-##view_alert_common_tab_conditions_modalEdit_title = Edit Condition
+view_alert_common_tab_conditions_modalEdit_title = Bedingungen ändern
view_alert_common_tab_conditions_modal_title = Bedingung hinzufügen
view_alert_common_tab_conditions_recovery_disabled = Dieser Alarm hat seine Definition deaktiviert.
view_alert_common_tab_conditions_recovery_enabled = Ausgelöst, dass ''{0}'' wieder aktiviert wurde
@@ -883,7 +883,7 @@ view_alert_definition_condition_editor_option_metric_trait_change = Änderung de
view_alert_definition_condition_editor_option_operation = Ausführung der Operation
view_alert_definition_condition_editor_option_resource_configuration = Änderung der Konfiguration der Ressource
##view_alert_definition_condition_editor_resource_configuration_tooltip = This condition is triggered when the resource configuration changes.
-##view_alert_definition_editCondition = Edit Condition
+view_alert_definition_editCondition = Bedingungen ändern
view_alert_definition_for_group = Gruppendefinition ansehen
view_alert_definition_for_type = Vorlage ansehen
view_alert_definition_notification_cliScript_editor_anotherUser = Anderer Benutzer
@@ -892,7 +892,7 @@ view_alert_definition_notification_cliScript_editor_script = Skript
view_alert_definition_notification_cliScript_editor_thisUser = Aktueller Benutzer
view_alert_definition_notification_editor_delete_confirm = Sind Sie sicher, dass sie die ausgewählten Alarm-Benachrichtigungen löschen wollen?
view_alert_definition_notification_editor_field_configuration = Konfiguration
-##view_alert_definition_notification_editor_field_configuration_loadFailed = Failed to get notification configuration preview
+view_alert_definition_notification_editor_field_configuration_loadFailed = Konte die Vorschau der Benachrichtigung nicht laden
view_alert_definition_notification_editor_field_configuration_not_loaded = Unbekannt
view_alert_definition_notification_editor_field_sender = Sender
view_alert_definition_notification_editor_loadFailed = Kann die Alarm-Sender nicht laden
@@ -946,7 +946,7 @@ view_alert_definitions_disable_success = Es wurden {0} Alarm-Definitionen erfolg
view_alert_definitions_enable_confirm = Die ausgewählten Alarm-Definitionen aktivieren?
view_alert_definitions_enable_failure = Konnte die ausgewählten Alarm-Definitionen nicht aktivieren
view_alert_definitions_enable_success = Es wurden {0} Alarm-Definitionen erfolgreich aktiviert
-##view_alert_definitions_leaveUnsaved = Do you want to save the modified alert definition?
+view_alert_definitions_leaveUnsaved = Möchten Sie die geänderte Alarm-Definition speichern?
view_alert_definitions_loadFailed = Konnte die Daten für die Alarm-Definitionen nicht laden
view_alert_definitions_loadFailed_single = Konnte die Daten für die Alarm-Definition mit der id {0}
view_alert_definitions_table_title_group = Alarm-Definitionen für Gruppen
@@ -1184,7 +1184,7 @@ view_bundle_version_backToBundle = Zurück zum Bundle
##view_bundle_version_deleteSuccessful = You successfully deleted the bundle version [{0}]
##view_bundle_version_loadFailure = Failed to load bundle version
view_bundle_versions = Versionen
-##view_charts_time_axis_label = Time
+view_charts_time_axis_label = Zeit
view_configCompare_comparingConfigs = Konfigurationen vergleichen
##view_configCompare_configCompare = Configuration Comparison
view_configEdit_addItem = Eintrag zur Liste hinzufügen
@@ -1483,13 +1483,13 @@ view_inventory_groups_children = Kinder
##view_inventory_groups_deleteSuccessful = You have successfully deleted the selected resource groups
##view_inventory_groups_descendants = Descendants
##view_inventory_groups_loadFailed = Failed to load group composite data
-##view_inventory_ignoredResources = Ignored Resources
+view_inventory_ignoredResources = Ignorierte Ressourcen
view_inventory_mixed = gemischt
view_inventory_platforms = Platformen
view_inventory_problemGroups = Gruppen mit Problemen
##view_inventory_resource_loadFailed = Resource with id [{0}] does not exist or is not accessible
-##view_inventory_resources_deleteConfirm = Are you sure you want to delete the selected resources?
-##view_inventory_resources_deleteFailed = Failed to delete the selected resources
+view_inventory_resources_deleteConfirm = Sind Sie sicher, dass Sie die ausgewählten Ressourcen löschen wollen?
+view_inventory_resources_deleteFailed = Löschen der ausgewählten Ressourcen ist fehlgeschlagen
##view_inventory_resources_deleteSuccessful = A request to perform the resource deletion has been submitted successfully to the agent(s).
##view_inventory_resources_disableSuccessful = You have successfully disabled the selected resources and their children, [{0}] resources.
##view_inventory_resources_ignoreConfirm = Are you sure you want the selected resources to be ignored? They will no longer show up in inventory.
10 years, 12 months
[rhq] Branch 'feature/cassandra-backend' - 2 commits - modules/enterprise
by John Sanda
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java | 74 ++++++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerLocal.java | 38 +++
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java | 108 +++++-----
modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerLocal.java | 21 +
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java | 10
modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsServer.java | 18 +
6 files changed, 210 insertions(+), 59 deletions(-)
New commits:
commit 64735ee2aa844031c46f1da06fc2eedea00335c2
Author: John Sanda <jsanda(a)redhat.com>
Date: Thu May 23 22:20:18 2013 -0400
updating logging
removing logging from MetricsServer.updateMetricsIndex method as it will result
in a lot of output in the logs.
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java
index ba228d9..6242df6 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java
@@ -40,7 +40,7 @@ import org.rhq.server.metrics.domain.AggregateType;
*/
public class MetricsBaselineCalculator {
- private final Log log = LogFactory.getLog(MetricsServer.class);
+ private final Log log = LogFactory.getLog(MetricsBaselineCalculator.class);
private MetricsDAO metricsDAO;
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 0e07d4d..d6d388b 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
@@ -26,8 +26,6 @@
package org.rhq.server.metrics;
import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -234,28 +232,36 @@ public class MetricsServer {
}
public void addNumericData(Set<MeasurementDataNumeric> dataSet) {
+ if (log.isDebugEnabled()) {
+ log.debug("Persisting " + dataSet.size() + " raw metrics");
+ }
+ long startTime = System.currentTimeMillis();
+ int count = 0;
try {
for (MeasurementDataNumeric data : dataSet) {
dao.insertRawData(data);
+ ++count;
}
updateMetricsIndex(dataSet);
} catch (Exception e) {
log.error("An error occurred while inserting raw numeric data", e);
throw new RuntimeException(e);
+ } finally {
+ long endTime = System.currentTimeMillis();
+ if (log.isDebugEnabled()) {
+ log.debug("Persisted " + count + " raw metrics in " + (endTime - startTime) + " ms");
+ }
}
}
void updateMetricsIndex(Set<MeasurementDataNumeric> rawMetrics) {
+
Map<Integer, Long> updates = new TreeMap<Integer, Long>();
for (MeasurementDataNumeric rawMetric : rawMetrics) {
updates.put(rawMetric.getScheduleId(), dateTimeService.getTimeSlice(
new DateTime(rawMetric.getTimestamp()), configuration.getRawTimeSliceDuration()).getMillis());
}
- if (log.isDebugEnabled()) {
- log.debug("Updating one hour index with time slices " + StringUtil.collectionToString(updates.values()));
- }
-
dao.updateMetricsIndex(MetricsTable.ONE_HOUR, updates);
}
commit e8582b3995f749923255418277f9dff88e8125d4
Author: John Sanda <jsanda(a)redhat.com>
Date: Wed May 22 20:20:35 2013 -0400
changing transaction demarcation for basline and OOB calculations
The queries and methods in MeasurementBaselineManagerBean and in
MeasurementOOBManagerBean were too coarse-grained. In a test environment, I
was seeing regular timeouts while querying for schedules that do not yet have
baselines. And the method that computes OOBs was experiencing frequent
transaction timeouts. The transaction demarcation has been changed so that we
are doing a small, fixed size amount of working for each transaction when
calculating baselines and OOBs. Calls to Cassandra have been moved to
non-transactional methods.
Lastly, fixing a bug in MetricsBaselineCalculator to make sure we always return
a baseline for each schedule that it receives.
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
index 8fb615c..37af9de 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerBean.java
@@ -20,6 +20,8 @@ package org.rhq.enterprise.server.measurement;
import java.util.Arrays;
import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
@@ -88,7 +90,8 @@ public class MeasurementBaselineManagerBean implements MeasurementBaselineManage
private SessionManagerBean sessionManager;
private final Log log = LogFactory.getLog(MeasurementBaselineManagerBean.class);
- private static final int BASELINE_PROCESSING_LIMIT = 50000;
+
+ private static final int BASELINE_PROCESSING_LIMIT = 100;
@TransactionAttribute(TransactionAttributeType.NEVER)
public void calculateAutoBaselines() {
@@ -185,11 +188,14 @@ public class MeasurementBaselineManagerBean implements MeasurementBaselineManage
* In any event, an appropriate chunking solution needs to be found, and that partitioning strategy
* needs to replace the limits in the query today.
*/
- int schedulesWithoutBaselines = measurementBaselineManager
- ._calculateAutoBaselinesINSERT(amountOfData);
- totalProcessed += schedulesWithoutBaselines;
-
- if (schedulesWithoutBaselines < BASELINE_PROCESSING_LIMIT) {
+// int schedulesWithoutBaselines = measurementBaselineManager
+// ._calculateAutoBaselinesINSERT(amountOfData);
+ List<MeasurementSchedule> schedulesWithoutBaselines =
+ measurementBaselineManager.getSchedulesWithoutBaselines();
+ measurementBaselineManager.calculateBaselines(schedulesWithoutBaselines, now, amountOfData);
+ totalProcessed += schedulesWithoutBaselines.size();
+
+ if (schedulesWithoutBaselines.size() < BASELINE_PROCESSING_LIMIT) {
break;
}
}
@@ -217,6 +223,62 @@ public class MeasurementBaselineManagerBean implements MeasurementBaselineManage
@SuppressWarnings("unchecked")
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ public List<MeasurementSchedule> getSchedulesWithoutBaselines() {
+ Query query = this.entityManager
+ .createNamedQuery(MeasurementBaseline.QUERY_FIND_MEASUREMENT_SCHEDULES_WITHOUT_AUTOBASELINES);
+ query.setMaxResults(BASELINE_PROCESSING_LIMIT);
+ List<MeasurementSchedule> scheduleIdsWithoutBaselines = query.getResultList();
+
+ return scheduleIdsWithoutBaselines;
+ }
+
+ @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
+ public void calculateBaselines(List<MeasurementSchedule> schedules, long olderThan, long amountOfData) {
+ long endTime = olderThan;
+ long startTime = endTime - amountOfData;
+
+ log.debug("Computing baselines for " + schedules.size() + " schedules");
+ MetricsBaselineCalculator baselineCalculator = new MetricsBaselineCalculator(sessionManager.getMetricsDAO());
+ long calcStartTime = System.currentTimeMillis();
+ List<MeasurementBaseline> results = baselineCalculator.calculateBaselines(schedules, startTime, endTime);
+ long calcEndTime = System.currentTimeMillis();
+ int count = results.size();
+
+ if (log.isDebugEnabled()) {
+ log.debug("Finished computing " + count + " new baselines in " + (calcEndTime - calcStartTime) + " ms");
+ }
+
+ log.debug("Persisting baselines calculations");
+ long saveStartTime = System.currentTimeMillis();
+ Iterator<MeasurementBaseline> iterator = results.iterator();
+ List<MeasurementBaseline> queue = new LinkedList<MeasurementBaseline>();
+ while (iterator.hasNext()) {
+ if (queue.size() == 10) {
+ measurementBaselineManager.saveNewBaselines(queue);
+ queue = new LinkedList<MeasurementBaseline>();
+ }
+ queue.add(iterator.next());
+ }
+ if (!queue.isEmpty()) {
+ measurementBaselineManager.saveNewBaselines(queue);
+ }
+
+ long saveEndTime = System.currentTimeMillis();
+ if (log.isDebugEnabled()) {
+ log.debug("Finished persisting " + count + " baselines in " + (saveEndTime - saveStartTime) + " ms");
+ }
+ }
+
+ @Override
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
+ public void saveNewBaselines(List<MeasurementBaseline> baselines) {
+ for (MeasurementBaseline baseline : baselines) {
+ entityManager.merge(baseline);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public int _calculateAutoBaselinesINSERT(long amountOfData) throws Exception {
long endTime = System.currentTimeMillis();
long startTime = endTime - amountOfData;
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerLocal.java
index 7f7655a..8781fc5 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementBaselineManagerLocal.java
@@ -24,6 +24,7 @@ import javax.ejb.Local;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.measurement.MeasurementBaseline;
+import org.rhq.core.domain.measurement.MeasurementSchedule;
import org.rhq.core.domain.resource.Resource;
/**
@@ -68,10 +69,47 @@ public interface MeasurementBaselineManagerLocal {
* Inserts baselines "as appropriate" for measurements that have at least amountOfData
* @param amountOfData will use amountOfData to compute new min/max/mean for baselines as appropriate
* @return number of rows inserted
+ * @deprecated This method is pending removal after peer review. Because 1hr data is
+ * now stored in Cassandra, transaction boundaries needed to change. This method has
+ * been replaced by {@link #getSchedulesWithoutBaselines()}, {@link #calculateBaselines(java.util.List, long)},
+ * and {@link #saveNewBaselines(java.util.List)}.
* @throws Exception
*/
int _calculateAutoBaselinesINSERT(long amountOfData) throws Exception;
+ /**
+ * <strong>Note</strong> This method exists only for transaction demarcation.
+ *
+ * @return A list of schedules that do not have baselines. This list is not assumed
+ * to be an exhaustive list of schedules that lack a baseline. As such, this method
+ * will be called repeatedly during baseline calculations to get all of the necessary
+ * schedules.
+ */
+ List<MeasurementSchedule> getSchedulesWithoutBaselines();
+
+ /**
+ * Given a list of schedules, this method calculates and stores baselines using the
+ * amount of 1 hr data specified and older than the time specified.
+ * <br/><br/>
+ * <strong>Note</strong> This method exists only for transaction demarcation.
+ *
+ * @param schedules The schedules that do not yet have baselines
+ * @param olderThan Use 1 hr data prior to this time
+ * @param amountOfData The amount of data to use for calculating baselines. This value
+ * is treated as a duration. For example, a value of 259200000
+ * would be treated as 3 days.
+ */
+ void calculateBaselines(List<MeasurementSchedule> schedules, long olderThan, long amountOfData);
+
+ /**
+ * Persists the newly calculated baselines.
+ * <br/><br/>
+ * <strong>Note</strong> This method exists only for transaction demarcation.
+ *
+ * @param baselines The baselines to persist.
+ */
+ void saveNewBaselines(List<MeasurementBaseline> baselines);
+
MeasurementBaseline getBaselineIfEqual(Subject subject, int groupId, int definitionId);
/**
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
index eecbbca..f742c7f 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerBean.java
@@ -82,6 +82,9 @@ public class MeasurementOOBManagerBean implements MeasurementOOBManagerLocal {
@EJB
AuthorizationManagerLocal authMangager;
+ @EJB
+ MeasurementOOBManagerLocal oobManager;
+
/**
* Compute oobs from the values in the 1h measurement table that just got added.
* For the total result, this is an incremental computation. The idea is that
@@ -191,56 +194,15 @@ public class MeasurementOOBManagerBean implements MeasurementOOBManagerLocal {
}
@SuppressWarnings("unchecked")
+ @TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
public void computeOOBsForLastHour(Subject subject, Iterable<AggregateNumericMetric> metrics) {
+ log.info("Computing OOBs");
int count = 0;
long startTime = System.currentTimeMillis();
try {
for (AggregateNumericMetric metric : metrics) {
try {
- List<MeasurementBaseline> baselines = entityManager.createQuery(
- "select baseline from MeasurementBaseline baseline where baseline.schedule.id = :scheduleId")
- .setParameter("scheduleId", metric.getScheduleId())
- .getResultList();
- if (baselines.isEmpty()) {
- continue;
- }
- MeasurementBaseline baseline = baselines.get(0);
- Long upperDelta = null;
- Long lowerDelta = null;
-
- if (isPastUpperBound(baseline, metric)) {
- upperDelta =
- Math.round(((metric.getMax() - baseline.getMax()) / (baseline.getMax() - baseline.getMin())) * 100);
- }
-
- if (isPastLowerBound(baseline, metric)) {
- lowerDelta =
- Math.round(((baseline.getMin() - metric.getMin()) / (baseline.getMax() - baseline.getMin())) * 100);
- }
-
- Integer oobFactor;
- if (upperDelta != null && lowerDelta == null) {
- oobFactor = upperDelta.intValue();
- } else if (upperDelta == null && lowerDelta != null) {
- oobFactor = lowerDelta.intValue();
- } else if (upperDelta != null && lowerDelta != null) {
- if (upperDelta > lowerDelta) {
- oobFactor = upperDelta.intValue();
- } else {
- oobFactor = lowerDelta.intValue();
- }
- } else { // both are null
- oobFactor = null;
- }
-
- if (oobFactor != null) {
- MeasurementOOB oob = new MeasurementOOB();
- oob.setScheduleId(metric.getScheduleId());
- oob.setTimestamp(metric.getTimestamp());
- oob.setOobFactor(oobFactor);
- entityManager.merge(oob);
- ++count;
- }
+ count += oobManager.calculateOOB(metric);
} catch (Exception e) {
log.error("An error occurred while calculating OOBs for " + metric, e);
throw new RuntimeException(e);
@@ -248,10 +210,66 @@ public class MeasurementOOBManagerBean implements MeasurementOOBManagerLocal {
}
} finally {
long endTime = System.currentTimeMillis();
+ if (log.isInfoEnabled()) {
+ log.info("Finished calculating " + count + " OOBs in " + (endTime - startTime) + " ms");
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
+ public int calculateOOB(AggregateNumericMetric metric) {
+ List<MeasurementBaseline> baselines = entityManager.createQuery(
+ "select baseline from MeasurementBaseline baseline where baseline.schedule.id = :scheduleId")
+ .setParameter("scheduleId", metric.getScheduleId())
+ .getResultList();
+ if (baselines.isEmpty()) {
+ return 0;
+ }
+ MeasurementBaseline baseline = baselines.get(0);
+ Long upperDelta = null;
+ Long lowerDelta = null;
+
+ if (isPastUpperBound(baseline, metric)) {
+ upperDelta =
+ Math.round(((metric.getMax() - baseline.getMax()) / (baseline.getMax() - baseline.getMin())) * 100);
+ }
+
+ if (isPastLowerBound(baseline, metric)) {
+ lowerDelta =
+ Math.round(((baseline.getMin() - metric.getMin()) / (baseline.getMax() - baseline.getMin())) * 100);
+ }
+
+ Integer oobFactor;
+ if (upperDelta != null && lowerDelta == null) {
+ oobFactor = upperDelta.intValue();
+ } else if (upperDelta == null && lowerDelta != null) {
+ oobFactor = lowerDelta.intValue();
+ } else if (upperDelta != null && lowerDelta != null) {
+ if (upperDelta > lowerDelta) {
+ oobFactor = upperDelta.intValue();
+ } else {
+ oobFactor = lowerDelta.intValue();
+ }
+ } else { // both are null
+ oobFactor = null;
+ }
+
+ if (oobFactor != null) {
+ MeasurementOOB oob = new MeasurementOOB();
+ oob.setScheduleId(metric.getScheduleId());
+ oob.setTimestamp(metric.getTimestamp());
+ oob.setOobFactor(oobFactor);
+
if (log.isDebugEnabled()) {
- log.debug("Finished calculating " + count + " OOBs in " + (endTime - startTime) + " ms");
+ log.debug("Generated OOB " + oob + " for 1 hr metric " + metric + " with baseline " + baseline);
}
+
+ entityManager.merge(oob);
+ return 1;
}
+
+ return 0;
}
private boolean isPastUpperBound(MeasurementBaseline baseline, AggregateNumericMetric metric) {
diff --git a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerLocal.java b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerLocal.java
index b452a28..853c5af 100644
--- a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerLocal.java
+++ b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementOOBManagerLocal.java
@@ -45,9 +45,30 @@ public interface MeasurementOOBManagerLocal {
*/
void computeOOBsFromHourBeginingAt(Subject subject, long begin);
+ /**
+ * Computes OOBs using the provided 1 hr data which should be the most recent 1 hr
+ * aggregates. These metrics are provided as an argument as opposed to querying for
+ * them because we already have the 1 hr aggregates load in memory when metrics
+ * aggregation runs prior to calculating OOBs.
+ *
+ * @param subject
+ * @param metrics The most recent 1 hr aggregates
+ */
void computeOOBsForLastHour(Subject subject, Iterable<AggregateNumericMetric> metrics);
/**
+ * Determines and calculates an OOB if necessary, If an OOB is generated, this method
+ * saves it to the database.
+ * <br/><br/>
+ * <strong>Note</strong> This method exists only for transaction demarcation.
+ *
+ * @param metric The 1 hr metric that is used to determine whether or not an OOB should
+ * be generated
+ * @return 1 if an OOB is generated, 0 otherwise
+ */
+ int calculateOOB(AggregateNumericMetric metric);
+
+ /**
* Return OOB Composites that contain all information about the OOBs in a given time as aggregates.
* @param subject The caller
* @param metricNameFilter
diff --git a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java
index 3aa5441..ba228d9 100644
--- a/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java
+++ b/modules/enterprise/server/server-metrics/src/main/java/org/rhq/server/metrics/MetricsBaselineCalculator.java
@@ -113,6 +113,12 @@ public class MetricsBaselineCalculator {
return baseline;
}
- return null;
+ MeasurementBaseline baseline = new MeasurementBaseline();
+ baseline.setMax(Double.NaN);
+ baseline.setMin(Double.NaN);
+ baseline.setMean(Double.NaN);
+ baseline.setSchedule(schedule);
+
+ return baseline;
}
}
10 years, 12 months
[rhq] modules/enterprise
by Jay Shaughnessy
modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
New commits:
commit 0d6dcd43a16699348430e81a241ae38da6d431af
Author: Jay Shaughnessy <jshaughn(a)redhat.com>
Date: Thu May 23 17:14:50 2013 -0400
Fix test that started failing after the change to remove JOIN FETCH
from Criteria calls that include paging and optional data. It seems the
new approach changes slightly the way the data is returned.
loadDefinition() returns hibernate proxied data. It is not safe to pass
proxies into equals() impls because these typically access fields directly,
not through getters, and therefore bypass the proxied data.
Note that this change in behavior due to the JOIN FETCH fix would only
affect non-client code (like test code or intra-slsb calls) because return
values to client code would already be cleansed of the proxies. The test
is fixed in the same way, by using HibernateDetachUtility to scrub the
proxies before attempting the assertEquals().
diff --git a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java
index 18c7093..4202d6a 100644
--- a/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java
+++ b/modules/enterprise/server/itests-2/src/test/java/org/rhq/enterprise/server/drift/ManageDriftDefinitionsTest.java
@@ -57,6 +57,7 @@ import org.rhq.core.domain.resource.Resource;
import org.rhq.core.domain.resource.ResourceType;
import org.rhq.core.domain.util.PageList;
import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility;
+import org.rhq.enterprise.server.safeinvoker.HibernateDetachUtility.SerializationType;
import org.rhq.enterprise.server.test.TransactionCallback;
import org.rhq.test.AssertUtils;
@@ -91,7 +92,7 @@ public class ManageDriftDefinitionsTest extends AbstractDriftServerTest {
deleteEntity(ResourceType.class, DRIFT_NOT_SUPPORTED_TYPE);
}
- public void createDefinitionFromUnpinnedTemplate() {
+ public void createDefinitionFromUnpinnedTemplate() throws Exception {
// first create a template
final DriftDefinition templateDef = new DriftDefinition(new Configuration());
templateDef.setName(NAME_PREFIX + "createUnpinnedDefinition");
@@ -114,6 +115,7 @@ public class ManageDriftDefinitionsTest extends AbstractDriftServerTest {
DriftDefinitionComparator comparator = new DriftDefinitionComparator(
BOTH_BASE_INFO_AND_DIRECTORY_SPECIFICATIONS);
+ HibernateDetachUtility.nullOutUninitializedFields(newDef, SerializationType.SERIALIZATION);
assertEquals("The drift definition was not persisted correctly", 0, comparator.compare(definition, newDef));
assertEquals("The template association was not set on the definition", template, newDef.getTemplate());
}
10 years, 12 months