[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