[jboss-svn-commits] JBL Code SVN: r29567 - in labs/jbossrules/trunk: drools-api/src/main/java/org/drools/runtime and 8 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Oct 8 18:05:19 EDT 2009


Author: tirelli
Date: 2009-10-08 18:05:18 -0400 (Thu, 08 Oct 2009)
New Revision: 29567

Added:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java
Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemoryEntryPoint.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandBasedStatefulKnowledgeSession.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventListener.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/DroolsManagementAgent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeBaseMonitoring.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
Log:
JBRULES-2247: adding support to JMX monitoring

Added: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/management/KnowledgeSessionMonitoringMBean.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -0,0 +1,106 @@
+package org.drools.management;
+
+import java.util.Date;
+import java.util.Map;
+
+import javax.management.ObjectName;
+
+/**
+ * An MBean interface for Knowledge Session monitoring
+ * 
+ * @author etirelli
+ */
+public interface KnowledgeSessionMonitoringMBean {
+
+    /**
+     * Resets all stats
+     */
+    public void reset();
+
+    /**
+     * Returns this MBean name
+     * 
+     * @return
+     */
+    public ObjectName getName();
+
+    /**
+     * Returns the associated knowledge base ID
+     * 
+     * @return
+     */
+    public String getKnowledgeBaseId();
+
+    /**
+     * Returns the associated knowledge session ID
+     * 
+     * @return
+     */
+    public int getKnowledgeSessionId();
+
+    /**
+     * Returns the total fact count current loaded into this session
+     * 
+     * @return
+     */
+    public long getTotalFactCount();
+
+    /**
+     * Returns the total number of activations fired in this session since last 
+     * reset.
+     * 
+     * @return
+     */
+    public long getTotalActivationsFired();
+
+    /**
+     * Returns the total number of activations cancelled in this session since 
+     * last reset.
+     *  
+     * @return
+     */
+    public long getTotalActivationsCancelled();
+
+    /**
+     * Returns the total number of activations created in this session since 
+     * last reset.
+     * 
+     * @return
+     */
+    public long getTotalActivationsCreated();
+
+    /**
+     * Returns the total milliseconds spent firing rules in this session since last reset.
+     * 
+     * @return
+     */
+    public long getTotalFiringTime();
+
+    /**
+     * Returns the average firing time in milliseconds for rules in this session
+     * since last reset.
+     * 
+     * @return
+     */
+    public double getAverageFiringTime();
+
+    /**
+     * Returns a formatted String with statistics for a single rule in this session,
+     * like number of activations created, cancelled and fired as well as firing time.
+     *  
+     * @param ruleName the name of the rule for which statistics are requested.
+     * 
+     * @return
+     */
+    public String getStatsForRule(String ruleName);
+
+    /**
+     * Returns the timestamp of the last stats reset
+     * 
+     * @return
+     */
+    public Date getLastReset();
+    
+    public Map<String,String> getStatsByRule();    
+
+}
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/StatefulKnowledgeSession.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -77,4 +77,5 @@
      * will not free the memory used by the session.
      */
     void dispose();
+    
 }

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemoryEntryPoint.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemoryEntryPoint.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/WorkingMemoryEntryPoint.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -133,4 +133,12 @@
      * @return
      */
     <T extends FactHandle> Collection< T > getFactHandles(ObjectFilter filter);    
+    
+    /**
+     * Returns the total number of facts currently in this entry point
+     * 
+     * @return
+     */
+    public long getFactCount();
+    
 }

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/testframework/MockWorkingMemory.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -602,4 +602,14 @@
         return null;
     }
 
+    public long getFactCount() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
+    public long getTotalFactCount() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandBasedStatefulKnowledgeSession.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandBasedStatefulKnowledgeSession.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/command/impl/CommandBasedStatefulKnowledgeSession.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -70,7 +70,7 @@
 import org.drools.runtime.rule.RuleFlowGroup;
 import org.drools.runtime.rule.WorkingMemoryEntryPoint;
 import org.drools.time.SessionClock;
-
+ 
 public class CommandBasedStatefulKnowledgeSession
     implements
     StatefulKnowledgeSession {
@@ -397,4 +397,9 @@
         return EntryPoint.DEFAULT.getEntryPointId();
     }
 
+    public long getFactCount() {
+        // TODO: implement this
+        return 0;
+    }
+
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -61,6 +61,7 @@
 import org.drools.event.RuleFlowEventSupport;
 import org.drools.event.WorkingMemoryEventListener;
 import org.drools.event.WorkingMemoryEventSupport;
+import org.drools.management.DroolsManagementAgent;
 import org.drools.process.core.event.EventFilter;
 import org.drools.process.core.event.EventTypeFilter;
 import org.drools.process.instance.ProcessInstance;
@@ -338,8 +339,15 @@
         this.opCounter = new AtomicLong( 0 );
         this.lastIdleTimestamp = new AtomicLong( -1 );
         
+        initManagementBeans();
     }
 
+    private void initManagementBeans() {
+        if( this.ruleBase.getConfiguration().isMBeansEnabled() ) {
+            DroolsManagementAgent.getInstance().registerKnowledgeSession( this ); 
+        }
+    }
+    
     public String getEntryPointId() {
         return EntryPoint.DEFAULT.getEntryPointId();
     }
@@ -1986,6 +1994,9 @@
     // }
 
     public void dispose() {
+        if( this.ruleBase.getConfiguration().isMBeansEnabled() ) {
+            DroolsManagementAgent.getInstance().unregisterKnowledgeSession( this ); 
+        }
         this.workingMemoryEventSupport.reset();
         this.agendaEventSupport.reset();
         this.workflowEventSupport.reset();
@@ -2021,7 +2032,19 @@
     public Map<String, WorkingMemoryEntryPoint> getEntryPoints() {
         return this.entryPoints;
     }
+    
+    public long getFactCount() {
+        return this.objectStore.size();
+    }
 
+    public long getTotalFactCount() {
+        long result = 0;
+        for( WorkingMemoryEntryPoint ep : this.entryPoints.values() ) {
+            result += ep.getFactCount();
+        }
+        return result;
+    }
+    
     /**
      * This method must be called before starting any new work in the engine,
      * like inserting a new fact or firing a new rule. It will reset the engine

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/InternalWorkingMemory.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -191,4 +191,14 @@
      * activation firing. 
      */
     public void activationFired();
+    
+    /**
+     * Returns the total number of facts in the working memory, i.e., counting
+     * all facts from all entry points. This is an approximate value and may not
+     * be accurate due to the concurrent nature of the entry points.
+     * 
+     * @return
+     */
+    public long getTotalFactCount();
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/NamedEntryPoint.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -9,8 +9,10 @@
 import java.util.concurrent.locks.ReentrantLock;
 
 import org.drools.FactException;
+import org.drools.FactHandle;
 import org.drools.RuleBase;
 import org.drools.RuntimeDroolsException;
+import org.drools.WorkingMemory;
 import org.drools.WorkingMemoryEntryPoint;
 import org.drools.RuleBaseConfiguration.AssertBehaviour;
 import org.drools.impl.StatefulKnowledgeSessionImpl.ObjectStoreWrapper;
@@ -19,8 +21,6 @@
 import org.drools.reteoo.ObjectTypeConf;
 import org.drools.rule.EntryPoint;
 import org.drools.rule.Rule;
-import org.drools.FactHandle;
-import org.drools.WorkingMemory;
 import org.drools.spi.Activation;
 import org.drools.spi.FactHandleFactory;
 import org.drools.spi.PropagationContext;
@@ -517,24 +517,28 @@
         return this.objectStore.getObjectForHandle( (InternalFactHandle) factHandle );
     }    
     
+    @SuppressWarnings("unchecked")
     public <T extends org.drools.runtime.rule.FactHandle> Collection< T > getFactHandles() {
         return new ObjectStoreWrapper( this.objectStore,
                                        null,
                                        ObjectStoreWrapper.FACT_HANDLE );
     }
 
+    @SuppressWarnings("unchecked")
     public <T extends org.drools.runtime.rule.FactHandle> Collection< T > getFactHandles(org.drools.runtime.ObjectFilter filter) {
         return new ObjectStoreWrapper( this.objectStore,
                                        filter,
                                        ObjectStoreWrapper.FACT_HANDLE );
     }
 
+    @SuppressWarnings("unchecked")
     public Collection< Object > getObjects() {
         return new ObjectStoreWrapper( this.objectStore,
                                        null,
                                        ObjectStoreWrapper.OBJECT );
     }
 
+    @SuppressWarnings("unchecked")
     public Collection< Object > getObjects(org.drools.runtime.ObjectFilter filter) {
         return new ObjectStoreWrapper( this.objectStore,
                                        filter,
@@ -543,6 +547,10 @@
 
     public String getEntryPointId() {
         return this.entryPoint.getEntryPointId();
+    }
+
+    public long getFactCount() {
+        return this.objectStore.size();
     }    
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/common/ObjectStore.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -2,7 +2,6 @@
 
 import java.util.Iterator;
 
-import org.drools.runtime.ObjectFilter;
 import org.drools.runtime.rule.FactHandle;
 
 public interface ObjectStore {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventListener.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventListener.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/AgendaEventListener.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -19,7 +19,6 @@
 import java.util.EventListener;
 
 import org.drools.WorkingMemory;
-import org.drools.event.rule.ActivationCancelledCause;
 
 public interface AgendaEventListener
     extends

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/WorkingMemoryEventSupport.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -16,17 +16,10 @@
  * limitations under the License.
  */
 
-import java.io.Externalizable;
-import java.io.IOException;
-import java.io.ObjectInput;
-import java.io.ObjectOutput;
-import java.util.Collections;
-import java.util.List;
 import java.util.Iterator;
-import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.drools.common.InternalWorkingMemory;
 import org.drools.FactHandle;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.spi.PropagationContext;
 
 /**

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/impl/StatefulKnowledgeSessionImpl.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -823,4 +823,9 @@
         return this.session.getEntryPointId();
     }
 
+    public long getFactCount() {
+        return this.session.getFactCount();
+    }
+
+    
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/DroolsManagementAgent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/DroolsManagementAgent.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/DroolsManagementAgent.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -25,6 +25,8 @@
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.drools.common.AbstractWorkingMemory;
+import org.drools.common.InternalWorkingMemory;
 import org.drools.reteoo.ReteooRuleBase;
 
 /**
@@ -101,6 +103,17 @@
                        mbean.getName() );
     }
 
+    public void registerKnowledgeSession(InternalWorkingMemory ksession) {
+        KnowledgeSessionMonitoring mbean = new KnowledgeSessionMonitoring( ksession );
+        registerMBean( ksession, 
+                       mbean,
+                       mbean.getName() );
+    }
+
+    public void unregisterKnowledgeSession(InternalWorkingMemory ksession) {
+        unregisterMBeansFromOwner( ksession );
+    }
+
     public void registerMBean(Object owner,
                               Object mbean,
                               ObjectName name) {
@@ -128,27 +141,39 @@
         if ( mbl != null ) {
             MBeanServer mbs = getMBeanServer();
             for ( ObjectName name : mbl ) {
-                try {
-                    mbs.unregisterMBean( name );
-                } catch ( Exception e ) {
-                    System.err.println( "Exception unregistering mbean: " + name );
-                    e.printStackTrace();
-                }
+                unregisterMBeanFromServer( mbs,
+                                           name );
             }
         }
     }
 
+    private void unregisterMBeanFromServer(MBeanServer mbs,
+                                           ObjectName name) {
+        try {
+            mbs.unregisterMBean( name );
+        } catch ( Exception e ) {
+            System.err.println( "Exception unregistering mbean: " + name );
+            e.printStackTrace();
+        }
+    }
+    
+    public void unregisterMBean( Object owner, ObjectName mbean ) {
+        List<ObjectName> mbl = mbeans.get( owner );
+        if( mbl != null ) {
+            mbl.remove( mbean );
+        }
+        MBeanServer mbs = getMBeanServer();
+        unregisterMBeanFromServer( mbs,
+                                   mbean );
+    }
+
     public void unregisterDependentsMBeansFromOwner(Object owner) {
         List<ObjectName> mbl = mbeans.get( owner );
         if ( mbl != null ) {
             MBeanServer mbs = getMBeanServer();
             for ( ObjectName name : mbl.subList( 1, mbl.size() ) ) {
-                try {
-                    mbs.unregisterMBean( name );
-                } catch ( Exception e ) {
-                    System.err.println( "Exception unregistering mbean: " + name );
-                    e.printStackTrace();
-                }
+                unregisterMBeanFromServer( mbs,
+                                           name );
             }
             mbl.subList( 1, mbl.size() ).clear();
         }
@@ -171,4 +196,5 @@
         }
         return mbs;
     }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeBaseMonitoring.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeBaseMonitoring.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeBaseMonitoring.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -39,7 +39,7 @@
     
     public KnowledgeBaseMonitoring(ReteooRuleBase kbase) {
         this.kbase = kbase;
-        this.name = DroolsManagementAgent.createObjectName(KBASE_PREFIX + ":id="+kbase.getId());
+        this.name = DroolsManagementAgent.createObjectName(KBASE_PREFIX + ":type="+kbase.getId());
     }
     
     public ObjectName getName() {
@@ -84,12 +84,12 @@
         for( EntryPointNode epn : kbase.getRete().getEntryPointNodes().values() ) {
             for( ObjectTypeNode otn : epn.getObjectTypeNodes().values() ) {
                 ObjectTypeNodeMonitor otnm = new ObjectTypeNodeMonitor( otn );
-                ObjectName name = DroolsManagementAgent.createObjectName( this.name.getCanonicalName() + ",type=EntryPoints,EntryPoint=" + otnm.getNameSufix() + ",ObjectType="+((ClassObjectType)otn.getObjectType()).getClassName() );
+                ObjectName name = DroolsManagementAgent.createObjectName( this.name.getCanonicalName() + ",group=EntryPoints,EntryPoint=" + otnm.getNameSufix() + ",ObjectType="+((ClassObjectType)otn.getObjectType()).getClassName() );
                 DroolsManagementAgent.getInstance().registerMBean( kbase, otnm, name );
             }
         }
         KBaseConfigurationMonitor kbcm = new KBaseConfigurationMonitor( kbase.getConfiguration() );
-        ObjectName name = DroolsManagementAgent.createObjectName( this.name.getCanonicalName() + ",type=Configuration" );
+        ObjectName name = DroolsManagementAgent.createObjectName( this.name.getCanonicalName() + ",group=Configuration" );
         DroolsManagementAgent.getInstance().registerMBean( kbase, kbcm, name );
     }
 

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/management/KnowledgeSessionMonitoring.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -0,0 +1,287 @@
+/*
+ * Copyright 2008 Red Hat
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.drools.management;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.management.ObjectName;
+
+import org.drools.WorkingMemory;
+import org.drools.common.InternalRuleBase;
+import org.drools.common.InternalWorkingMemory;
+import org.drools.event.ActivationCancelledEvent;
+import org.drools.event.ActivationCreatedEvent;
+import org.drools.event.AfterActivationFiredEvent;
+import org.drools.event.AgendaEventListener;
+import org.drools.event.AgendaGroupPoppedEvent;
+import org.drools.event.AgendaGroupPushedEvent;
+import org.drools.event.BeforeActivationFiredEvent;
+import org.drools.management.KnowledgeSessionMonitoring.AgendaStats.AgendaStatsData;
+
+/**
+ * An MBean to monitor a given knowledge session
+ * 
+ * @author etirelli
+ */
+public class KnowledgeSessionMonitoring implements KnowledgeSessionMonitoringMBean {
+
+    private static final String KSESSION_PREFIX = "org.drools.kbases";
+    
+    private static final long NANO_TO_MILLISEC = 1000000;
+    
+    private InternalWorkingMemory ksession;
+    private InternalRuleBase kbase;
+    private ObjectName name;
+    public AgendaStats agendaStats;
+    
+    public KnowledgeSessionMonitoring(InternalWorkingMemory ksession) {
+        this.ksession = ksession;
+        this.kbase = (InternalRuleBase) ksession.getRuleBase();
+        this.name = DroolsManagementAgent.createObjectName(KSESSION_PREFIX + ":type="+kbase.getId()+",group=Sessions,sessionId=Session-"+ksession.getId());
+        this.agendaStats = new AgendaStats();
+        this.ksession.addEventListener( agendaStats );
+    }
+    
+    public void dispose() {
+        this.ksession.removeEventListener( agendaStats );
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#reset()
+     */
+    public void reset() {
+        this.agendaStats.reset();
+    }
+
+    public InternalWorkingMemory getKsession() {
+        return ksession;
+    }
+
+    public InternalRuleBase getKbase() {
+        return kbase;
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getName()
+     */
+    public ObjectName getName() {
+        return name;
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getKnowledgeBaseId()
+     */
+    public String getKnowledgeBaseId() {
+        return kbase.getId();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getKnowledgeSessionId()
+     */
+    public int getKnowledgeSessionId() {
+        return ksession.getId();
+    }
+
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getTotalFactCount()
+     */
+    public long getTotalFactCount() {
+        return ksession.getTotalFactCount();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getTotalActivationsFired()
+     */
+    public long getTotalActivationsFired() {
+        return this.agendaStats.getConsolidatedStats().activationsFired.get();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getTotalActivationsCancelled()
+     */
+    public long getTotalActivationsCancelled() {
+        return this.agendaStats.getConsolidatedStats().activationsCancelled.get();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getTotalActivationsCreated()
+     */
+    public long getTotalActivationsCreated() {
+        return this.agendaStats.getConsolidatedStats().activationsCreated.get();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getTotalFiringTime()
+     */
+    public long getTotalFiringTime() {
+        // converting nano secs to milli secs
+        return this.agendaStats.getConsolidatedStats().firingTime.get()/NANO_TO_MILLISEC;
+    }
+    
+    public Date getLastReset() {
+        return this.agendaStats.getConsolidatedStats().lastReset.get();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getAverageFiringTime()
+     */
+    public double getAverageFiringTime() {
+        long fires = this.agendaStats.getConsolidatedStats().activationsFired.get();
+        long time = this.agendaStats.getConsolidatedStats().firingTime.get();
+        // calculating the average and converting it from nano secs to milli secs
+        return fires > 0 ? (((double) time / (double) fires) / (double) NANO_TO_MILLISEC) : 0;
+    }
+    
+    /* (non-Javadoc)
+     * @see org.drools.management.KnowledgeSessionMonitoringMBean#getStatsForRule(java.lang.String)
+     */
+    public String getStatsForRule( String ruleName ) {
+        AgendaStatsData data = this.agendaStats.getRuleStats( ruleName );
+        String result = data == null ? "activationsCreated=0 activationsCancelled=0 activationsFired=0 firingTime=0ms" : data.toString();
+        return result;
+    }
+    
+    public Map<String,String> getStatsByRule() {
+        Map<String, String> result = new HashMap<String, String>();
+        for( Map.Entry<String, AgendaStatsData> entry : this.agendaStats.getRulesStats().entrySet() ) {
+            result.put( entry.getKey(), entry.getValue().toString() );
+        }
+        return result;
+    }
+    
+    public static class AgendaStats implements AgendaEventListener {
+        
+        private AgendaStatsData consolidated = new AgendaStatsData();
+        private ConcurrentHashMap<String, AgendaStatsData> ruleStats = new ConcurrentHashMap<String, AgendaStatsData>();
+
+        public AgendaStats() {
+        }
+        
+        public AgendaStatsData getConsolidatedStats() {
+            return this.consolidated;
+        }
+        
+        public Map<String, AgendaStatsData> getRulesStats() {
+            return this.ruleStats;
+        }
+        
+        public AgendaStatsData getRuleStats( String ruleName ) { 
+            return this.ruleStats.get( ruleName );
+        }
+        
+        public void reset() {
+            this.consolidated.reset();
+            this.ruleStats.clear();
+        }
+        
+        public void activationCancelled(ActivationCancelledEvent event,
+                                        WorkingMemory workingMemory) {
+            this.consolidated.activationsCancelled.incrementAndGet();
+            AgendaStatsData data = getRuleStatsInstance( event.getActivation().getRule().getName() );
+            data.activationsCancelled.incrementAndGet();
+        }
+
+        public void activationCreated(ActivationCreatedEvent event,
+                                      WorkingMemory workingMemory) {
+            this.consolidated.activationsCreated.incrementAndGet();
+            AgendaStatsData data = getRuleStatsInstance( event.getActivation().getRule().getName() );
+            data.activationsCreated.incrementAndGet();
+        }
+
+        public void afterActivationFired(AfterActivationFiredEvent event,
+                                         WorkingMemory workingMemory) {
+            AgendaStatsData data = getRuleStatsInstance( event.getActivation().getRule().getName() );
+            this.consolidated.stopFireClock();
+            data.stopFireClock();
+            this.consolidated.activationsFired.incrementAndGet();
+            data.activationsFired.incrementAndGet();
+        }
+
+        public void agendaGroupPopped(AgendaGroupPoppedEvent event,
+                                      WorkingMemory workingMemory) {
+            // no stats gathered for now
+        }
+
+        public void agendaGroupPushed(AgendaGroupPushedEvent event,
+                                      WorkingMemory workingMemory) {
+            // no stats gathered for now
+        }
+
+        public void beforeActivationFired(BeforeActivationFiredEvent event,
+                                          WorkingMemory workingMemory) {
+            AgendaStatsData data = getRuleStatsInstance( event.getActivation().getRule().getName() );
+            this.consolidated.startFireClock();
+            data.startFireClock();
+        }
+        
+        private AgendaStatsData getRuleStatsInstance(String ruleName) {
+            AgendaStatsData data = this.ruleStats.get( ruleName );
+            if( data == null ) {
+                data = new AgendaStatsData();
+                this.ruleStats.put( ruleName, data );
+            }
+            return data;
+        }
+
+        public static class AgendaStatsData {
+            public AtomicLong activationsFired;
+            public AtomicLong activationsCreated;
+            public AtomicLong activationsCancelled;
+            public AtomicLong firingTime;
+
+            public AtomicReference<Date> lastReset;
+            
+            // no need for synch, because two activations cannot fire concurrently 
+            public long start;
+
+            public AgendaStatsData() {
+                this.activationsFired = new AtomicLong(0);
+                this.activationsCreated = new AtomicLong(0);
+                this.activationsCancelled = new AtomicLong(0);
+                this.firingTime = new AtomicLong(0);
+                this.lastReset = new AtomicReference(new Date());
+            }
+            
+            public void startFireClock() {
+                this.start = System.nanoTime();
+            }
+            
+            public void stopFireClock() {
+                this.firingTime.addAndGet( System.nanoTime()-this.start );
+            }
+            
+            public void reset() {
+                this.activationsFired.set( 0 );
+                this.activationsCreated.set( 0 );
+                this.activationsCancelled.set( 0 );
+                this.firingTime.set( 0 );
+                this.lastReset.set( new Date() );
+            }
+            
+            public String toString() {
+                return "activationsCreated="+activationsCreated.get()+" activationsCancelled="+activationsCancelled.get()+
+                       " activationsFired="+this.activationsFired.get()+" firingTime="+(firingTime.get()/NANO_TO_MILLISEC)+"ms";
+            }
+        }    
+    }
+    
+}

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-10-08 19:36:21 UTC (rev 29566)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java	2009-10-08 22:05:18 UTC (rev 29567)
@@ -25,10 +25,10 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 
 import org.drools.FactException;
+import org.drools.FactHandle;
 import org.drools.KnowledgeBaseFactory;
 import org.drools.RuleBaseConfiguration;
 import org.drools.SessionConfiguration;
@@ -58,7 +58,6 @@
 import org.drools.rule.Rule;
 import org.drools.runtime.Environment;
 import org.drools.runtime.StatefulKnowledgeSession;
-import org.drools.FactHandle;
 import org.drools.spi.ExecutorServiceFactory;
 import org.drools.spi.FactHandleFactory;
 import org.drools.spi.PropagationContext;



More information about the jboss-svn-commits mailing list