[infinispan-commits] Infinispan SVN: r1020 - in trunk/core: src/main/java/org/infinispan and 7 other directories.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Mon Oct 26 14:22:59 EDT 2009


Author: galder.zamarreno at jboss.com
Date: 2009-10-26 14:22:58 -0400 (Mon, 26 Oct 2009)
New Revision: 1020

Modified:
   trunk/core/pom.xml
   trunk/core/src/main/java/org/infinispan/CacheDelegate.java
   trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java
   trunk/core/src/main/java/org/infinispan/interceptors/ActivationInterceptor.java
   trunk/core/src/main/java/org/infinispan/interceptors/CacheLoaderInterceptor.java
   trunk/core/src/main/java/org/infinispan/interceptors/CacheMgmtInterceptor.java
   trunk/core/src/main/java/org/infinispan/interceptors/CacheStoreInterceptor.java
   trunk/core/src/main/java/org/infinispan/interceptors/InvalidationInterceptor.java
   trunk/core/src/main/java/org/infinispan/interceptors/PassivationInterceptor.java
   trunk/core/src/main/java/org/infinispan/interceptors/TxInterceptor.java
   trunk/core/src/main/java/org/infinispan/manager/DefaultCacheManager.java
   trunk/core/src/main/java/org/infinispan/remoting/rpc/RpcManagerImpl.java
   trunk/core/src/main/java/org/infinispan/util/ClassFinder.java
   trunk/core/src/main/java/org/infinispan/util/concurrent/locks/DeadlockDetectingLockManager.java
   trunk/core/src/main/java/org/infinispan/util/concurrent/locks/LockManagerImpl.java
   trunk/core/src/test/java/org/infinispan/jmx/CacheMBeanTest.java
Log:
[ISPN-134] (Update ManagedAttribute annotations to expose more information for use by JOPR) Instead we've created annotations in JOPR that allow us to add extra information that is then queried at build time to generate rhq-plugin.xml. Also, Cache now exposes its name via JMX/JOPR and both Cache and CacheManager expose their status in String format to avoid CNFEs in tools that are not aware of Infinispan such as JConsole.

Modified: trunk/core/pom.xml
===================================================================
--- trunk/core/pom.xml	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/pom.xml	2009-10-26 18:22:58 UTC (rev 1020)
@@ -21,6 +21,7 @@
       <version.jgroups>2.8.0.CR2</version.jgroups>
       <version.jta>1.0.1.GA</version.jta>
       <version.org.jboss.naming>5.0.3.GA</version.org.jboss.naming>
+      <version.rhq.pluginAnnotations>1.4.0-SNAPSHOT</version.rhq.pluginAnnotations>
    </properties>
 
    <dependencies>
@@ -59,6 +60,12 @@
       </dependency>
 
       <dependency>
+         <groupId>org.rhq.helpers</groupId>
+         <artifactId>rhq-pluginAnnotations</artifactId>
+         <version>${version.rhq.pluginAnnotations}</version>
+      </dependency>
+
+      <dependency>
          <groupId>org.jboss.naming</groupId>
          <artifactId>jnp-client</artifactId>
          <scope>test</scope>

Modified: trunk/core/src/main/java/org/infinispan/CacheDelegate.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/CacheDelegate.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/CacheDelegate.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -53,6 +53,7 @@
 import org.infinispan.jmx.annotations.ManagedOperation;
 import org.infinispan.lifecycle.ComponentStatus;
 import org.infinispan.manager.CacheManager;
+import org.infinispan.manager.DefaultCacheManager;
 import org.infinispan.marshall.MarshalledValue;
 import org.infinispan.marshall.Marshaller;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
@@ -63,6 +64,10 @@
 import org.infinispan.util.concurrent.NotifyingFuture;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
+import org.rhq.helpers.pluginAnnotations.agent.DataType;
+import org.rhq.helpers.pluginAnnotations.agent.DisplayType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
 
 import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
@@ -251,6 +256,7 @@
    }
 
    @ManagedOperation(description = "Starts the cache.")
+   @Operation(displayName = "Starts cache.")
    public void start() {
       componentRegistry.start();
       defaultLifespan = config.getExpirationLifespan();
@@ -258,6 +264,7 @@
    }
 
    @ManagedOperation(description = "Stops the cache.")
+   @Operation(displayName = "Stops cache.")
    public void stop() {
       componentRegistry.stop();
    }
@@ -492,11 +499,20 @@
       return (V) invoker.invoke(ctx, command);
    }
 
-   @ManagedAttribute(description = "Returns the cache status")
    public ComponentStatus getStatus() {
       return componentRegistry.getStatus();
    }
 
+   /** 
+    * Returns String representation of ComponentStatus enumeration in order to avoid 
+    * class not found exceptions in JMX tools that don't have access to infinispan classes.
+    */
+   @ManagedAttribute(description = "Returns the cache status")
+   @Metric(displayName = "Cache status", dataType = DataType.TRAIT, displayType = DisplayType.SUMMARY)
+   public String getCacheStatus() {
+      return getStatus().toString();
+   }
+
    public boolean startBatch() {
       if (!config.isInvocationBatchingEnabled())
          throw new ConfigurationException("Invocation batching not enabled in current configuration!  Please use the <invocationBatching /> element.");
@@ -513,6 +529,15 @@
       return name;
    }
 
+   /** 
+    * Returns the cache name. If this is the default cache, it returns a more friendly name. 
+    */
+   @ManagedAttribute(description = "Returns the cache name")
+   @Metric(displayName = "Cache name", dataType = DataType.TRAIT, displayType = DisplayType.SUMMARY)
+   public String getCacheName() {
+      return getName().equals(DefaultCacheManager.DEFAULT_CACHE_NAME) ? "Default Cache" : getName();
+   }
+
    public String getVersion() {
       return Version.version;
    }

Modified: trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -37,6 +37,10 @@
 import org.infinispan.util.Util;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
+import org.rhq.helpers.pluginAnnotations.agent.DataType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
+import org.rhq.helpers.pluginAnnotations.agent.Parameter;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -93,6 +97,7 @@
    private InterceptorChain interceptorChain;
    private InvocationContextContainer icc;
    @ManagedAttribute(description = "If true, the node has successfully joined the grid and is considered to hold state.  If false, the join process is still in progress.")
+   @Metric(displayName = "Is join completed?", dataType = DataType.TRAIT)
    volatile boolean joinComplete = false;
    final List<Address> leavers = new CopyOnWriteArrayList<Address>();
    volatile Future<Void> leaveTaskFuture;
@@ -249,7 +254,8 @@
    }
 
    @ManagedOperation(description = "Determines whether a given key is affected by an ongoing rehash, if any.")
-   public boolean isAffectedByRehash(Object key) {
+   @Operation(displayName = "Could key be affected by reshah?")
+   public boolean isAffectedByRehash(@Parameter(name = "key", description = "Key to check") Object key) {
       return transactionLogger.isEnabled() && oldConsistentHash != null && !oldConsistentHash.locate(key, replCount).contains(self);
    }
 
@@ -334,6 +340,7 @@
    }
 
    @ManagedAttribute(description = "Checks whether the node is involved in a rehash.")
+   @Metric(displayName = "Is rehash in progress?", dataType = DataType.TRAIT)
    public boolean isRehashInProgress() {
       return !leavers.isEmpty() || rehashInProgress;
    }
@@ -371,18 +378,15 @@
       }
    }
 
-   @ManagedAttribute(description = "Size of the cluster in number of nodes")
-   public String getClusterSize() {
-      return rpcManager.getTransport().getMembers().size() + "";
-   }
-
    @ManagedOperation(description = "Tells you whether a given key is local to this instance of the cache.  Only works with String keys.")
-   public boolean isLocatedLocally(String key) {
+   @Operation(displayName = "Is key local?")
+   public boolean isLocatedLocally(@Parameter(name = "key", description = "Key to query") String key) {
       return isLocal(key);
    }
 
    @ManagedOperation(description = "Locates an object in a cluster.  Only works with String keys.")
-   public List<String> locateKey(String key) {
+   @Operation(displayName = "Locate key")
+   public List<String> locateKey(@Parameter(name = "key", description = "Key to locate") String key) {
       List<String> l = new LinkedList<String>();
       for (Address a : locate(key)) l.add(a.toString());
       return l;

Modified: trunk/core/src/main/java/org/infinispan/interceptors/ActivationInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/ActivationInterceptor.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/interceptors/ActivationInterceptor.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -13,6 +13,9 @@
 import org.infinispan.jmx.annotations.ManagedOperation;
 import org.infinispan.loaders.CacheLoaderException;
 import org.infinispan.loaders.CacheStore;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
 
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -82,12 +85,14 @@
    }
 
    @ManagedAttribute(description = "Number of activation events")
+   @Metric(displayName = "Number of cache entries activated", measurementType = MeasurementType.TRENDSUP)
    public String getActivations() {
       if (!getStatisticsEnabled()) return "N/A";
       return String.valueOf(activations.get());
    }
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset statistics")
    public void resetStatistics() {
       super.resetStatistics();
       activations.set(0);

Modified: trunk/core/src/main/java/org/infinispan/interceptors/CacheLoaderInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/CacheLoaderInterceptor.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/interceptors/CacheLoaderInterceptor.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -41,6 +41,9 @@
 import org.infinispan.loaders.CacheLoader;
 import org.infinispan.loaders.CacheLoaderManager;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
 
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -179,17 +182,20 @@
       }
    }
 
-   @ManagedAttribute(description = "Number of CacheLoader loads")
+   @ManagedAttribute(description = "Number of entries loaded from cache store")
+   @Metric(displayName = "Number of cache store loads", measurementType = MeasurementType.TRENDSUP)
    public long getCacheLoaderLoads() {
       return cacheLoads.get();
    }
 
-   @ManagedAttribute(description = "Number of CacheLoader misses")
+   @ManagedAttribute(description = "Number of entries that did not exist in cache store")
+   @Metric(displayName = "Number of cache store load misses", measurementType = MeasurementType.TRENDSUP)
    public long getCacheLoaderMisses() {
       return cacheMisses.get();
    }
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset Statistics")
    public void resetStatistics() {
       cacheLoads.set(0);
       cacheMisses.set(0);

Modified: trunk/core/src/main/java/org/infinispan/interceptors/CacheMgmtInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/CacheMgmtInterceptor.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/interceptors/CacheMgmtInterceptor.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -32,8 +32,14 @@
 import org.infinispan.jmx.annotations.MBean;
 import org.infinispan.jmx.annotations.ManagedAttribute;
 import org.infinispan.jmx.annotations.ManagedOperation;
+import org.rhq.helpers.pluginAnnotations.agent.DisplayType;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
+import org.rhq.helpers.pluginAnnotations.agent.Units;
 
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 /**
@@ -108,27 +114,32 @@
       return retval;
    }
 
-   @ManagedAttribute(description = "number of cache attribute hits")
+   @ManagedAttribute(description = "Number of cache attribute hits")
+   @Metric(displayName = "Number of cache hits", measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public long getHits() {
       return hits.get();
    }
 
-   @ManagedAttribute(description = "number of cache attribute misses")
+   @ManagedAttribute(description = "Number of cache attribute misses")
+   @Metric(displayName = "Number of cache misses", measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public long getMisses() {
       return misses.get();
    }
 
    @ManagedAttribute(description = "number of cache attribute put operations")
+   @Metric(displayName = "Number of cache puts" , measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public long getStores() {
       return stores.get();
    }
 
-   @ManagedAttribute(description = "number of cache eviction operations")
+   @ManagedAttribute(description = "Number of cache eviction operations")
+   @Metric(displayName = "Number of cache evictions", measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public long getEvictions() {
       return evictions.get();
    }
 
-   @ManagedAttribute(description = "hit/(hit+miss) ratio for the cache")
+   @ManagedAttribute(description = "Percentage hit/(hit+miss) ratio for the cache")
+   @Metric(displayName = "Hit ratio", units = Units.PERCENTAGE, displayType = DisplayType.SUMMARY)
    public double getHitRatio() {
       double total = hits.get() + misses.get();
       if (total == 0)
@@ -137,13 +148,15 @@
    }
 
    @ManagedAttribute(description = "read/writes ratio for the cache")
+   @Metric(displayName = "Read/write ratio", units = Units.PERCENTAGE, displayType = DisplayType.SUMMARY)
    public double getReadWriteRatio() {
       if (stores.get() == 0)
          return 0;
       return (((double) (hits.get() + misses.get()) / (double) stores.get()));
    }
 
-   @ManagedAttribute(description = "average number of milliseconds for a read operation")
+   @ManagedAttribute(description = "Average number of milliseconds for a read operation on the cache")
+   @Metric(displayName = "Average read time", units = Units.MILLISECONDS, displayType = DisplayType.SUMMARY)
    public long getAverageReadTime() {
       long total = hits.get() + misses.get();
       if (total == 0)
@@ -151,29 +164,34 @@
       return (hitTimes.get() + missTimes.get()) / total;
    }
 
-   @ManagedAttribute(description = "average number of milliseconds for a write operation")
+   @ManagedAttribute(description = "Average number of milliseconds for a write operation in the cache")
+   @Metric(displayName = "Average write time", units = Units.MILLISECONDS, displayType = DisplayType.SUMMARY)
    public long getAverageWriteTime() {
       if (stores.get() == 0)
          return 0;
       return (storeTimes.get()) / stores.get();
    }
 
-   @ManagedAttribute(description = "number of entries in the cache")
+   @ManagedAttribute(description = "Number of entries in the cache")
+   @Metric(displayName = "Number of cache entries", displayType = DisplayType.SUMMARY)
    public int getNumberOfEntries() {
       return dataContainer.size();
    }
 
-   @ManagedAttribute(description = "seconds since cache started")
+   @ManagedAttribute(description = "Number of seconds since cache started")
+   @Metric(displayName = "Seconds since cache started", units = Units.SECONDS, measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public long getElapsedTime() {
-      return (System.currentTimeMillis() - start.get()) / 1000;
+      return TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start.get());
    }
 
-   @ManagedAttribute(description = "number of seconds since the cache statistics were last reset")
+   @ManagedAttribute(description = "Number of seconds since the cache statistics were last reset")
+   @Metric(displayName = "Seconds since cache statistics were reset", units = Units.SECONDS, displayType = DisplayType.SUMMARY)
    public long getTimeSinceReset() {
-      return (System.currentTimeMillis() - reset.get()) / 1000;
+      return TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - reset.get());
    }
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset Statistics (Statistics)")
    public void resetStatistics() {
       hits.set(0);
       misses.set(0);

Modified: trunk/core/src/main/java/org/infinispan/interceptors/CacheStoreInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/CacheStoreInterceptor.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/interceptors/CacheStoreInterceptor.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -53,6 +53,9 @@
 import org.infinispan.loaders.modifications.Store;
 import org.infinispan.transaction.xa.GlobalTransaction;
 import org.infinispan.util.logging.LogFactory;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -305,11 +308,13 @@
    }
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset statistics")
    public void resetStatistics() {
       cacheStores.set(0);
    }
 
    @ManagedAttribute(description = "number of cache loader stores")
+   @Metric(displayName = "Number of cache stores", measurementType = MeasurementType.TRENDSUP)
    public long getCacheLoaderStores() {
       return cacheStores.get();
    }

Modified: trunk/core/src/main/java/org/infinispan/interceptors/InvalidationInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/InvalidationInterceptor.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/interceptors/InvalidationInterceptor.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -44,6 +44,11 @@
 import org.infinispan.transaction.xa.GlobalTransaction;
 import org.infinispan.util.concurrent.NotifyingFutureImpl;
 import org.infinispan.util.concurrent.NotifyingNotifiableFuture;
+import org.rhq.helpers.pluginAnnotations.agent.DataType;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
+import org.rhq.helpers.pluginAnnotations.agent.Parameter;
 
 import javax.transaction.SystemException;
 import javax.transaction.Transaction;
@@ -230,19 +235,23 @@
    }
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset statistics")
    public void resetStatistics() {
       invalidations.set(0);
    }
 
+   @Metric(displayName = "Statistics enabled", dataType = DataType.TRAIT)
    public boolean getStatisticsEnabled() {
       return this.statisticsEnabled;
    }
 
-   public void setStatisticsEnabled(boolean enabled) {
+   @Operation(displayName = "Enable/disable statistics")
+   public void setStatisticsEnabled(@Parameter(name = "enabled", description = "Whether statistics should be enabled or disabled (true/false)") boolean enabled) {
       this.statisticsEnabled = enabled;
    }
 
-   @ManagedAttribute(description = "number of invalidations")
+   @ManagedAttribute(description = "Number of invalidations")
+   @Metric(displayName = "Number of invalidations", measurementType = MeasurementType.TRENDSUP)
    public long getInvalidations() {
       return invalidations.get();
    }

Modified: trunk/core/src/main/java/org/infinispan/interceptors/PassivationInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/PassivationInterceptor.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/interceptors/PassivationInterceptor.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -14,6 +14,9 @@
 import org.infinispan.loaders.CacheLoaderManager;
 import org.infinispan.loaders.CacheStore;
 import org.infinispan.notifications.cachelistener.CacheNotifier;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
 
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -59,11 +62,13 @@
    }
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset statistics")
    public void resetStatistics() {
       passivations.set(0);
    }
 
    @ManagedAttribute(description = "Number of passivation events")
+   @Metric(displayName = "Number of cache passivations", measurementType = MeasurementType.TRENDSUP)   
    public String getPassivations() {
       if (!getStatisticsEnabled()) return "N/A";
       return String.valueOf(passivations.get());

Modified: trunk/core/src/main/java/org/infinispan/interceptors/TxInterceptor.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/interceptors/TxInterceptor.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/interceptors/TxInterceptor.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -26,6 +26,12 @@
 import org.infinispan.transaction.TransactionLog;
 import org.infinispan.transaction.xa.TransactionTable;
 import org.infinispan.transaction.xa.TransactionXaAdapter;
+import org.rhq.helpers.pluginAnnotations.agent.DataType;
+import org.rhq.helpers.pluginAnnotations.agent.DisplayType;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
+import org.rhq.helpers.pluginAnnotations.agent.Parameter;
 
 import javax.transaction.RollbackException;
 import javax.transaction.Status;
@@ -209,31 +215,37 @@
    }
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset Statistics")
    public void resetStatistics() {
       prepares.set(0);
       commits.set(0);
       rollbacks.set(0);
    }
 
-   public void setStatisticsEnabled(boolean enabled) {
+   @Operation(displayName = "Enable/disable statistics")
+   public void setStatisticsEnabled(@Parameter(name = "enabled", description = "Whether statistics should be enabled or disabled (true/false)") boolean enabled) {
       this.statisticsEnabled = enabled;
    }
 
+   @Metric(displayName = "Statistics enabled", dataType = DataType.TRAIT)
    public boolean isStatisticsEnabled() {
       return this.statisticsEnabled;
    }
 
-   @ManagedAttribute(description = "number of transaction prepares")
+   @ManagedAttribute(description = "Number of transaction prepares performed since last reset")
+   @Metric(displayName = "Prepares", measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public long getPrepares() {
       return prepares.get();
    }
 
-   @ManagedAttribute(description = "number of transaction commits")
+   @ManagedAttribute(description = "Number of transaction commits performed since last reset")
+   @Metric(displayName = "Commits", measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public long getCommits() {
       return commits.get();
    }
 
-   @ManagedAttribute(description = "number of transaction rollbacks")
+   @ManagedAttribute(description = "Number of transaction rollbacks performed since last reset")
+   @Metric(displayName = "Rollbacks", measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public long getRollbacks() {
       return rollbacks.get();
    }

Modified: trunk/core/src/main/java/org/infinispan/manager/DefaultCacheManager.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/manager/DefaultCacheManager.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/manager/DefaultCacheManager.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -45,6 +45,11 @@
 import org.infinispan.remoting.transport.Address;
 import org.infinispan.remoting.transport.Transport;
 import org.infinispan.util.Immutables;
+import org.rhq.helpers.pluginAnnotations.agent.DataType;
+import org.rhq.helpers.pluginAnnotations.agent.DisplayType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
+import org.rhq.helpers.pluginAnnotations.agent.Parameter;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -317,7 +322,8 @@
     *
     * @return the default cache.
     */
-   @ManagedOperation(description = "Starts the default cache.")
+   @ManagedOperation(description = "Retrieves the default cache associated with this cache manager and starts it up.")
+   @Operation(displayName = "Starts the default cache.")
    public <K, V> Cache<K, V> getCache() {
       return getCache(DEFAULT_CACHE_NAME);
    }
@@ -335,8 +341,9 @@
     * @return a cache instance identified by cacheName
     */
    @SuppressWarnings("unchecked")
-   @ManagedOperation(description = "Starts a cache with the given name.")
-   public <K, V> Cache<K, V> getCache(String cacheName) {
+   @ManagedOperation(description = "Retrieves a named cache from the system and starts it up.")
+   @Operation(name = "getCacheWithCacheName", displayName = "Starts a cache with the given name.")
+   public <K, V> Cache<K, V> getCache(@Parameter(name = "cacheName", description = "Name of cache to start") String cacheName) {
       if (cacheName == null)
          throw new NullPointerException("Null arguments not allowed");
 
@@ -434,6 +441,12 @@
    public ComponentStatus getStatus() {
       return globalComponentRegistry.getStatus();
    }
+   
+   @ManagedAttribute(description = "The status of the cache manager instance.")
+   @Metric(displayName = "Cache manager status", dataType = DataType.TRAIT, displayType = DisplayType.SUMMARY)
+   public String getCacheManagerStatus() {
+      return getStatus().toString();
+   }
 
    public GlobalConfiguration getGlobalConfiguration() {
       return globalConfiguration;
@@ -449,6 +462,7 @@
    }
 
    @ManagedAttribute(description = "The defined cache names and their statuses.  The default cache is not included in this representation.")
+   @Metric(displayName = "List of defined caches", dataType = DataType.TRAIT, displayType = DisplayType.SUMMARY)
    public String getDefinedCacheNames() {
       StringBuilder result = new StringBuilder("[");
       for (String cacheName : getCacheNames()) {
@@ -460,16 +474,19 @@
    }
 
    @ManagedAttribute(description = "The total number of defined caches, excluding the default cache.")
+   @Metric(displayName = "Number of caches defined", displayType = DisplayType.SUMMARY)
    public String getDefinedCacheCount() {
       return String.valueOf(this.configurationOverrides.keySet().size());
    }
 
    @ManagedAttribute(description = "The total number of created caches, including the default cache.")
+   @Metric(displayName = "Number of caches created", displayType = DisplayType.SUMMARY)
    public String getCreatedCacheCount() {
       return String.valueOf(this.caches.keySet().size());
    }
 
    @ManagedAttribute(description = "The total number of running caches, including the default cache.")
+   @Metric(displayName = "Number of running caches", displayType = DisplayType.SUMMARY)
    public String getRunningCacheCount() {
       int running = 0;
       for (Cache cache : caches.values()) {
@@ -478,12 +495,14 @@
       return String.valueOf(running);
    }
 
-   @ManagedAttribute(description = "Infinispan version")
+   @ManagedAttribute(description = "Infinispan version.")
+   @Metric(displayName = "Infinispan version", displayType = DisplayType.SUMMARY, dataType = DataType.TRAIT)
    public String getVersion() {
       return Version.printVersion();
    }
 
-   @ManagedAttribute(description = "Cache manager name")
+   @ManagedAttribute(description = "The name of this cache manager")
+   @Metric(displayName = "Cache manager name", displayType = DisplayType.SUMMARY, dataType = DataType.TRAIT)
    public String getName() {
       String address = getAddress() == null ? "local" : getAddress().toString();
       return globalConfiguration.getJmxDomain() + '@' + address;

Modified: trunk/core/src/main/java/org/infinispan/remoting/rpc/RpcManagerImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/remoting/rpc/RpcManagerImpl.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/remoting/rpc/RpcManagerImpl.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -21,6 +21,13 @@
 import org.infinispan.util.concurrent.NotifyingNotifiableFuture;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
+import org.rhq.helpers.pluginAnnotations.agent.DataType;
+import org.rhq.helpers.pluginAnnotations.agent.DisplayType;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
+import org.rhq.helpers.pluginAnnotations.agent.Parameter;
+import org.rhq.helpers.pluginAnnotations.agent.Units;
 
 import java.text.NumberFormat;
 import java.util.Collection;
@@ -267,12 +274,14 @@
    // -------------------------------------------- JMX information -----------------------------------------------
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset statistics")
    public void resetStatistics() {
       replicationCount.set(0);
       replicationFailures.set(0);
    }
 
-   @ManagedAttribute(description = "number of successful replications")
+   @ManagedAttribute(description = "Number of successful replications")
+   @Metric(displayName = "Number of successfull replications", measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public String getReplicationCount() {
       if (!isStatisticsEnabled()) {
          return "N/A";
@@ -280,7 +289,8 @@
       return String.valueOf(replicationCount.get());
    }
 
-   @ManagedAttribute(description = "number of failed replications")
+   @ManagedAttribute(description = "Number of failed replications")
+   @Metric(displayName = "Number of failed replications", measurementType = MeasurementType.TRENDSUP, displayType = DisplayType.SUMMARY)
    public String getReplicationFailures() {
       if (!isStatisticsEnabled()) {
          return "N/A";
@@ -288,15 +298,18 @@
       return String.valueOf(replicationFailures.get());
    }
 
+   @Metric(displayName = "Statistics enabled", dataType = DataType.TRAIT)
    public boolean isStatisticsEnabled() {
       return statisticsEnabled;
    }
 
-   public void setStatisticsEnabled(boolean statisticsEnabled) {
+   @Operation(displayName = "Enable/disable statistics")
+   public void setStatisticsEnabled(@Parameter(name = "enabled", description = "Whether statistics should be enabled or disabled (true/false)") boolean statisticsEnabled) {
       this.statisticsEnabled = statisticsEnabled;
    }
 
    @ManagedAttribute(description = "The network address associated with this instance")
+   @Metric(displayName = "Network address", dataType = DataType.TRAIT, displayType = DisplayType.SUMMARY)
    public String getAddress() {
       if (t == null || !isStatisticsEnabled()) return "N/A";
       Address address = t.getAddress();
@@ -304,13 +317,21 @@
    }
 
    @ManagedAttribute(description = "List of members in the cluster")
+   @Metric(displayName = "Cluster members", dataType = DataType.TRAIT, displayType = DisplayType.SUMMARY)
    public String getMembers() {
       if (t == null || !isStatisticsEnabled()) return "N/A";
       List<Address> addressList = t.getMembers();
       return addressList.toString();
    }
+   
+   @ManagedAttribute(description = "Size of the cluster in number of nodes")
+   @Metric(displayName = "Cluster size", displayType = DisplayType.SUMMARY)
+   public String getClusterSize() {
+      return t.getMembers().size() + "";
+   }
 
    @ManagedAttribute(description = "Successful replications as a ratio of total replications")
+   @Metric(displayName = "Successful replication ratio", units = Units.PERCENTAGE, displayType = DisplayType.SUMMARY)
    public String getSuccessRatio() {
       if (replicationCount.get() == 0 || !statisticsEnabled) {
          return "N/A";

Modified: trunk/core/src/main/java/org/infinispan/util/ClassFinder.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/ClassFinder.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/util/ClassFinder.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -54,6 +54,21 @@
       }
       return clazzes;
    }
+   
+   public static List<Class<?>> withAnnotationDeclared(List<Class<?>> classes, Class<? extends Annotation> c) {
+      List<Class<?>> clazzes = new ArrayList<Class<?>>();
+      for (Class<?> clazz : classes) {
+         if (clazz.isAnnotationPresent(c)) {
+            Annotation[] declaredAnnots = clazz.getDeclaredAnnotations();
+            for (Annotation declaredAnnot : declaredAnnots) {
+               if (declaredAnnot.annotationType().isAssignableFrom(c)) {
+                  clazzes.add(clazz);
+               }
+            }
+         }
+      }
+      return clazzes;
+   }
 
    public static List<Class<?>> isAssignableFrom(List<Class<?>> classes, Class<?> clazz) {
       List<Class<?>> clazzes = new ArrayList<Class<?>>();

Modified: trunk/core/src/main/java/org/infinispan/util/concurrent/locks/DeadlockDetectingLockManager.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/concurrent/locks/DeadlockDetectingLockManager.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/util/concurrent/locks/DeadlockDetectingLockManager.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -10,6 +10,9 @@
 import org.infinispan.transaction.xa.DeadlockDetectingGlobalTransaction;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
+import org.rhq.helpers.pluginAnnotations.agent.MeasurementType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
+import org.rhq.helpers.pluginAnnotations.agent.Operation;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import java.util.concurrent.atomic.AtomicLong;
@@ -19,7 +22,7 @@
  *
  * @author Mircea.Markus at jboss.com
  */
- at MBean(description = "Information about the number of deadlocks that were detected")
+ at MBean(objectName = "DeadlockDetectingLockManager", description = "Information about the number of deadlocks that were detected")
 public class DeadlockDetectingLockManager extends LockManagerImpl {
 
    private static final Log log = LogFactory.getLog(DeadlockDetectingLockManager.class);
@@ -143,32 +146,37 @@
    }
 
    @ManagedAttribute(description = "Number of situtations when we try to determine a deadlock and the other lock owner is e.g. a local tx. In this scenario we cannot run the deadlock detection mechanism")
+   @Metric(displayName = "Number of unsolvable deadlock situations", measurementType = MeasurementType.TRENDSUP)
    public long getOverlapWithNotDeadlockAwareLockOwners() {
       return overlapWithNotDeadlockAwareLockOwners.get();
    }
 
-
    @ManagedAttribute(description = "Number of locally originated transactions that were interrupted as a deadlock situation was detected")
+   @Metric(displayName = "Number of interrupted local transactions", measurementType = MeasurementType.TRENDSUP)
    public long getLocallyInterruptedTransactions() {
       return locallyInterruptedTransactions.get();
    }
 
    @ManagedAttribute(description = "Number of remote deadlocks detected")
+   @Metric(displayName = "Number of detected remote deadlocks", measurementType = MeasurementType.TRENDSUP)
    public long getDetectedRemoteDeadlocks() {
       return detectedRemoteDeadlocks.get();
    }
 
    @ManagedAttribute (description = "Number of local detected deadlocks")
+   @Metric(displayName = "Number of detected local deadlocks", measurementType = MeasurementType.TRENDSUP)
    public long getDetectedLocalDeadlocks() {
       return detectedLocalDeadlocks.get();
    }
 
    @ManagedAttribute (description = "Total number of local detected deadlocks")
+   @Metric(displayName = "Number of total detected deadlocks", measurementType = MeasurementType.TRENDSUP)
    public long getTotalNumberOfDetectedDeadlocks() {
       return detectedRemoteDeadlocks.get() + detectedLocalDeadlocks.get();
    }
 
    @ManagedOperation(description = "Resets statistics gathered by this component")
+   @Operation(displayName = "Reset statistics")
    public void resetStatistics() {
       overlapWithNotDeadlockAwareLockOwners.set(0);
       locallyInterruptedTransactions.set(0);

Modified: trunk/core/src/main/java/org/infinispan/util/concurrent/locks/LockManagerImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/util/concurrent/locks/LockManagerImpl.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/main/java/org/infinispan/util/concurrent/locks/LockManagerImpl.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -38,6 +38,8 @@
 import org.infinispan.util.concurrent.locks.containers.ReentrantStripedLockContainer;
 import org.infinispan.util.logging.Log;
 import org.infinispan.util.logging.LogFactory;
+import org.rhq.helpers.pluginAnnotations.agent.DataType;
+import org.rhq.helpers.pluginAnnotations.agent.Metric;
 
 import javax.transaction.TransactionManager;
 import java.util.Iterator;
@@ -70,8 +72,8 @@
    @Start
    public void startLockManager() {
       lockContainer = configuration.isUseLockStriping() ?
-            transactionManager == null ? new ReentrantStripedLockContainer(configuration.getConcurrencyLevel()) : new OwnableReentrantStripedLockContainer(configuration.getConcurrencyLevel(), invocationContextContainer) :
-            transactionManager == null ? new ReentrantPerEntryLockContainer(configuration.getConcurrencyLevel()) : new OwnableReentrantPerEntryLockContainer(configuration.getConcurrencyLevel(), invocationContextContainer);
+      transactionManager == null ? new ReentrantStripedLockContainer(configuration.getConcurrencyLevel()) : new OwnableReentrantStripedLockContainer(configuration.getConcurrencyLevel(), invocationContextContainer) :
+      transactionManager == null ? new ReentrantPerEntryLockContainer(configuration.getConcurrencyLevel()) : new OwnableReentrantPerEntryLockContainer(configuration.getConcurrencyLevel(), invocationContextContainer);
    }
 
    public boolean lockAndRecord(Object key, InvocationContext ctx) throws InterruptedException {
@@ -169,17 +171,20 @@
       }
    }
 
-   @ManagedAttribute(writable = false, description = "The concurrency level that the MVCC Lock Manager has been configured with.")
+   @ManagedAttribute(description = "The concurrency level that the MVCC Lock Manager has been configured with.")
+   @Metric(displayName = "Concurrency level", dataType = DataType.TRAIT)
    public int getConcurrencyLevel() {
       return configuration.getConcurrencyLevel();
    }
 
-   @ManagedAttribute(writable = false, description = "The number of exclusive locks that are held.")
+   @ManagedAttribute(description = "The number of exclusive locks that are held.")
+   @Metric(displayName = "Number of locks held")
    public int getNumberOfLocksHeld() {
       return lockContainer.getNumLocksHeld();
    }
 
-   @ManagedAttribute(writable = false, description = "The number of exclusive locks that are available.")
+   @ManagedAttribute(description = "The number of exclusive locks that are available.")
+   @Metric(displayName = "Number of locks available")
    public int getNumberOfLocksAvailable() {
       return lockContainer.size() - lockContainer.getNumLocksHeld();
    }

Modified: trunk/core/src/test/java/org/infinispan/jmx/CacheMBeanTest.java
===================================================================
--- trunk/core/src/test/java/org/infinispan/jmx/CacheMBeanTest.java	2009-10-26 17:32:51 UTC (rev 1019)
+++ trunk/core/src/test/java/org/infinispan/jmx/CacheMBeanTest.java	2009-10-26 18:22:58 UTC (rev 1020)
@@ -63,29 +63,29 @@
       ObjectName defaultOn = new ObjectName(JMX_DOMAIN + ":cache-name=" + DefaultCacheManager.DEFAULT_CACHE_NAME + "(local),jmx-resource=Cache");
       ObjectName managerON = new ObjectName(JMX_DOMAIN + ":cache-name=[global],jmx-resource=CacheManager");
       server.invoke(managerON, "getCache", new Object[]{}, new String[]{});
-      assert ComponentStatus.RUNNING == server.getAttribute(defaultOn, "Status");
+      assert ComponentStatus.RUNNING.toString().equals(server.getAttribute(defaultOn, "CacheStatus"));
       assert server.getAttribute(managerON, "CreatedCacheCount").equals("1");
       assert server.getAttribute(managerON, "RunningCacheCount").equals("1");
       server.invoke(defaultOn, "stop", new Object[]{}, new String[]{});
-      assert ComponentStatus.TERMINATED == server.getAttribute(defaultOn, "Status");
+      assert ComponentStatus.TERMINATED.toString().equals(server.getAttribute(defaultOn, "CacheStatus"));
       assert server.getAttribute(managerON, "CreatedCacheCount").equals("1");
       assert server.getAttribute(managerON, "RunningCacheCount").equals("0");
       server.invoke(defaultOn, "start", new Object[]{}, new String[]{});
-      assert ComponentStatus.RUNNING == server.getAttribute(defaultOn, "Status");
+      assert ComponentStatus.RUNNING.toString().equals(server.getAttribute(defaultOn, "CacheStatus"));
       assert server.getAttribute(managerON, "CreatedCacheCount").equals("1");
       assert server.getAttribute(managerON, "RunningCacheCount").equals("1");
       server.invoke(defaultOn, "stop", new Object[]{}, new String[]{});
       assert server.getAttribute(managerON, "CreatedCacheCount").equals("1");
       assert server.getAttribute(managerON, "RunningCacheCount").equals("0");
-      assert ComponentStatus.TERMINATED == server.getAttribute(defaultOn, "Status");
+      assert ComponentStatus.TERMINATED.toString().equals(server.getAttribute(defaultOn, "CacheStatus"));
       server.invoke(defaultOn, "start", new Object[]{}, new String[]{});
       assert server.getAttribute(managerON, "CreatedCacheCount").equals("1");
       assert server.getAttribute(managerON, "RunningCacheCount").equals("1");
-      assert ComponentStatus.RUNNING == server.getAttribute(defaultOn, "Status");
+      assert ComponentStatus.RUNNING.toString().equals(server.getAttribute(defaultOn, "CacheStatus"));
       server.invoke(defaultOn, "stop", new Object[]{}, new String[]{});
       assert server.getAttribute(managerON, "CreatedCacheCount").equals("1");
       assert server.getAttribute(managerON, "RunningCacheCount").equals("0");
-      assert ComponentStatus.TERMINATED == server.getAttribute(defaultOn, "Status");
+      assert ComponentStatus.TERMINATED.toString().equals(server.getAttribute(defaultOn, "CacheStatus"));
    }
    
    public void testManagerStopRemovesCacheMBean(Method method) throws Exception {
@@ -102,8 +102,8 @@
       CacheManager otherManager = TestCacheManagerFactory.createCacheManager(globalConfiguration, configuration);
       server.invoke(managerON, "getCache", new Object[]{}, new String[]{});
       server.invoke(managerON, "getCache", new Object[]{"galder"}, new String[]{String.class.getName()});
-      assert ComponentStatus.RUNNING == server.getAttribute(defaultOn, "Status");
-      assert ComponentStatus.RUNNING == server.getAttribute(galderOn, "Status");
+      assert ComponentStatus.RUNNING.toString().equals(server.getAttribute(defaultOn, "CacheStatus"));
+      assert ComponentStatus.RUNNING.toString().equals(server.getAttribute(galderOn, "CacheStatus"));
       otherManager.stop();
       try {
          log.info(server.getMBeanInfo(managerON));



More information about the infinispan-commits mailing list