Skip to content

Commit

Permalink
[Drools-3444] Support monitoring (apache#2236)
Browse files Browse the repository at this point in the history
* Pass reference of before event in after

* Use timestamp instead of object

* Use shared event for n listeners

* After Activation has a reference to BeforeActivation
BeforeActivation has a timestamp

* Getter for before event
  • Loading branch information
lucamolteni authored and mariofusco committed Feb 12, 2019
1 parent 5548831 commit 8116db8
Show file tree
Hide file tree
Showing 9 changed files with 67 additions and 25 deletions.
Expand Up @@ -54,7 +54,7 @@ public void testCoverage() throws Exception {
assertEquals( 0, assertEquals( 0,
ls.getPercentCovered() ); ls.getPercentCovered() );


ls.afterMatchFired(new AfterActivationFiredEventImpl(new MockActivation("rule1"), null)); ls.afterMatchFired(new AfterActivationFiredEventImpl(new MockActivation("rule1"), null, null));
assertEquals( 2, assertEquals( 2,
ls.rules.size() ); ls.rules.size() );
assertTrue( ls.rules.contains( "rule2" ) ); assertTrue( ls.rules.contains( "rule2" ) );
Expand All @@ -63,7 +63,7 @@ public void testCoverage() throws Exception {
assertEquals( 33, assertEquals( 33,
ls.getPercentCovered() ); ls.getPercentCovered() );


ls.afterMatchFired(new AfterActivationFiredEventImpl(new MockActivation("rule2"), null)); ls.afterMatchFired(new AfterActivationFiredEventImpl(new MockActivation("rule2"), null, null));
assertEquals( 1, assertEquals( 1,
ls.rules.size() ); ls.rules.size() );
assertFalse( ls.rules.contains( "rule2" ) ); assertFalse( ls.rules.contains( "rule2" ) );
Expand All @@ -73,7 +73,7 @@ public void testCoverage() throws Exception {
assertEquals( 66, assertEquals( 66,
ls.getPercentCovered() ); ls.getPercentCovered() );


ls.afterMatchFired( new AfterActivationFiredEventImpl( new MockActivation( "rule3" ), null )); ls.afterMatchFired( new AfterActivationFiredEventImpl( new MockActivation( "rule3" ), null , null));
assertEquals( 0, assertEquals( 0,
ls.rules.size() ); ls.rules.size() );
assertFalse( ls.rules.contains( "rule2" ) ); assertFalse( ls.rules.contains( "rule2" ) );
Expand Down
Expand Up @@ -51,8 +51,8 @@ public void fireActivationCreated(final Activation activation,
final WorkingMemory workingMemory) { final WorkingMemory workingMemory) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


MatchCreatedEvent event = new ActivationCreatedEventImpl(activation, getKRuntime(workingMemory));
if (iter.hasNext()) { if (iter.hasNext()) {
MatchCreatedEvent event = new ActivationCreatedEventImpl(activation, getKRuntime(workingMemory));


do{ do{
iter.next().matchCreated(event); iter.next().matchCreated(event);
Expand All @@ -65,34 +65,36 @@ public void fireActivationCancelled(final Activation activation,
final MatchCancelledCause cause) { final MatchCancelledCause cause) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


MatchCancelledEvent event = new ActivationCancelledEventImpl(activation, getKRuntime(workingMemory), cause);
if (iter.hasNext()) { if (iter.hasNext()) {
MatchCancelledEvent event = new ActivationCancelledEventImpl(activation, getKRuntime(workingMemory), cause);


do{ do{
iter.next().matchCancelled(event); iter.next().matchCancelled(event);
} while (iter.hasNext()); } while (iter.hasNext());
} }
} }


public void fireBeforeActivationFired(final Activation activation, public BeforeMatchFiredEvent fireBeforeActivationFired(final Activation activation,
final WorkingMemory workingMemory) { final WorkingMemory workingMemory) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


BeforeMatchFiredEvent event = new BeforeActivationFiredEventImpl(activation, getKRuntime(workingMemory));
if (iter.hasNext()) { if (iter.hasNext()) {
BeforeMatchFiredEvent event = new BeforeActivationFiredEventImpl(activation, getKRuntime(workingMemory));


do{ do{
iter.next().beforeMatchFired(event); iter.next().beforeMatchFired(event);
} while (iter.hasNext()); } while (iter.hasNext());
} }

return event;
} }


public void fireAfterActivationFired(final Activation activation, public void fireAfterActivationFired(final Activation activation,
final InternalWorkingMemory workingMemory) { final InternalWorkingMemory workingMemory, BeforeMatchFiredEvent beforeMatchFiredEvent) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


AfterMatchFiredEvent event = new AfterActivationFiredEventImpl(activation, getKRuntime(workingMemory), beforeMatchFiredEvent);
if (iter.hasNext()) { if (iter.hasNext()) {
AfterMatchFiredEvent event = new AfterActivationFiredEventImpl(activation, getKRuntime(workingMemory));


do{ do{
iter.next().afterMatchFired(event); iter.next().afterMatchFired(event);
Expand All @@ -104,8 +106,8 @@ public void fireAgendaGroupPopped(final AgendaGroup agendaGroup,
final InternalWorkingMemory workingMemory) { final InternalWorkingMemory workingMemory) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


AgendaGroupPoppedEventImpl event = new AgendaGroupPoppedEventImpl(agendaGroup, getKRuntime(workingMemory));
if (iter.hasNext()) { if (iter.hasNext()) {
AgendaGroupPoppedEventImpl event = new AgendaGroupPoppedEventImpl(agendaGroup, getKRuntime(workingMemory));


do{ do{
iter.next().agendaGroupPopped(event); iter.next().agendaGroupPopped(event);
Expand All @@ -117,8 +119,8 @@ public void fireAgendaGroupPushed(final AgendaGroup agendaGroup,
final InternalWorkingMemory workingMemory) { final InternalWorkingMemory workingMemory) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


AgendaGroupPushedEventImpl event = new AgendaGroupPushedEventImpl(agendaGroup, getKRuntime(workingMemory));
if (iter.hasNext()) { if (iter.hasNext()) {
AgendaGroupPushedEventImpl event = new AgendaGroupPushedEventImpl(agendaGroup, getKRuntime(workingMemory));


do{ do{
iter.next().agendaGroupPushed(event); iter.next().agendaGroupPushed(event);
Expand All @@ -131,8 +133,8 @@ public void fireBeforeRuleFlowGroupActivated(
final InternalWorkingMemory workingMemory) { final InternalWorkingMemory workingMemory) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


RuleFlowGroupActivatedEventImpl event = new RuleFlowGroupActivatedEventImpl(ruleFlowGroup, getKRuntime(workingMemory));
if (iter.hasNext()) { if (iter.hasNext()) {
RuleFlowGroupActivatedEventImpl event = new RuleFlowGroupActivatedEventImpl(ruleFlowGroup, getKRuntime(workingMemory));


do { do {
iter.next().beforeRuleFlowGroupActivated(event); iter.next().beforeRuleFlowGroupActivated(event);
Expand All @@ -145,8 +147,8 @@ public void fireAfterRuleFlowGroupActivated(
final InternalWorkingMemory workingMemory) { final InternalWorkingMemory workingMemory) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


RuleFlowGroupActivatedEventImpl event = new RuleFlowGroupActivatedEventImpl(ruleFlowGroup, getKRuntime(workingMemory));
if (iter.hasNext()) { if (iter.hasNext()) {
RuleFlowGroupActivatedEventImpl event = new RuleFlowGroupActivatedEventImpl(ruleFlowGroup, getKRuntime(workingMemory));


do { do {
iter.next().afterRuleFlowGroupActivated(event); iter.next().afterRuleFlowGroupActivated(event);
Expand All @@ -159,8 +161,8 @@ public void fireBeforeRuleFlowGroupDeactivated(
final InternalWorkingMemory workingMemory) { final InternalWorkingMemory workingMemory) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


RuleFlowGroupDeactivatedEventImpl event = new RuleFlowGroupDeactivatedEventImpl(ruleFlowGroup, getKRuntime(workingMemory));
if (iter.hasNext()) { if (iter.hasNext()) {
RuleFlowGroupDeactivatedEventImpl event = new RuleFlowGroupDeactivatedEventImpl(ruleFlowGroup, getKRuntime(workingMemory));


do { do {
iter.next().beforeRuleFlowGroupDeactivated(event); iter.next().beforeRuleFlowGroupDeactivated(event);
Expand All @@ -173,8 +175,8 @@ public void fireAfterRuleFlowGroupDeactivated(
final InternalWorkingMemory workingMemory) { final InternalWorkingMemory workingMemory) {
Iterator<AgendaEventListener> iter = getEventListenersIterator(); Iterator<AgendaEventListener> iter = getEventListenersIterator();


RuleFlowGroupDeactivatedEventImpl event = new RuleFlowGroupDeactivatedEventImpl(ruleFlowGroup, getKRuntime(workingMemory));
if (iter.hasNext()) { if (iter.hasNext()) {
RuleFlowGroupDeactivatedEventImpl event = new RuleFlowGroupDeactivatedEventImpl(ruleFlowGroup, getKRuntime(workingMemory));


do { do {
iter.next().afterRuleFlowGroupDeactivated(event); iter.next().afterRuleFlowGroupDeactivated(event);
Expand Down
Expand Up @@ -17,13 +17,21 @@
package org.drools.core.event.rule.impl; package org.drools.core.event.rule.impl;


import org.kie.api.event.rule.AfterMatchFiredEvent; import org.kie.api.event.rule.AfterMatchFiredEvent;
import org.kie.api.event.rule.BeforeMatchFiredEvent;
import org.kie.api.runtime.KieRuntime; import org.kie.api.runtime.KieRuntime;
import org.kie.api.runtime.rule.Match; import org.kie.api.runtime.rule.Match;


public class AfterActivationFiredEventImpl extends ActivationEventImpl implements AfterMatchFiredEvent { public class AfterActivationFiredEventImpl extends ActivationEventImpl implements AfterMatchFiredEvent {


public AfterActivationFiredEventImpl(Match activation, KieRuntime kruntime ) { BeforeMatchFiredEvent beforeMatchFiredEvent;

public AfterActivationFiredEventImpl(Match activation, KieRuntime kruntime, BeforeMatchFiredEvent beforeMatchFiredEvent) {
super( activation, kruntime ); super( activation, kruntime );
this.beforeMatchFiredEvent = beforeMatchFiredEvent;
}

public BeforeMatchFiredEvent getBeforeMatchFiredEvent() {
return beforeMatchFiredEvent;
} }


@Override @Override
Expand Down
Expand Up @@ -23,10 +23,20 @@


public class BeforeActivationFiredEventImpl extends ActivationEventImpl implements BeforeMatchFiredEvent { public class BeforeActivationFiredEventImpl extends ActivationEventImpl implements BeforeMatchFiredEvent {


private long timestamp;

public BeforeActivationFiredEventImpl(Match activation, KieRuntime kruntime ) { public BeforeActivationFiredEventImpl(Match activation, KieRuntime kruntime ) {
super( activation, kruntime ); super( activation, kruntime );
} }


public long getTimestamp() {
return timestamp;
}

public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}

@Override @Override
public String toString() { public String toString() {
return "==>[BeforeActivationFiredEvent: getActivation()=" + getMatch() return "==>[BeforeActivationFiredEvent: getActivation()=" + getMatch()
Expand Down
Expand Up @@ -38,6 +38,7 @@
import org.drools.core.spi.Tuple; import org.drools.core.spi.Tuple;
import org.drools.core.util.BinaryHeapQueue; import org.drools.core.util.BinaryHeapQueue;
import org.drools.core.util.index.TupleList; import org.drools.core.util.index.TupleList;
import org.kie.api.event.rule.BeforeMatchFiredEvent;
import org.kie.api.event.rule.MatchCancelledCause; import org.kie.api.event.rule.MatchCancelledCause;
import org.kie.api.runtime.rule.AgendaFilter; import org.kie.api.runtime.rule.AgendaFilter;
import org.slf4j.Logger; import org.slf4j.Logger;
Expand Down Expand Up @@ -364,7 +365,7 @@ public void fireActivation(InternalWorkingMemory wm, InternalAgenda agenda, Acti
// we need to make sure it re-activates // we need to make sure it re-activates
wm.startOperation(); wm.startOperation();
try { try {
wm.getAgendaEventSupport().fireBeforeActivationFired( activation, wm ); BeforeMatchFiredEvent beforeMatchFiredEvent = wm.getAgendaEventSupport().fireBeforeActivationFired(activation, wm);


if ( activation.getActivationGroupNode() != null ) { if ( activation.getActivationGroupNode() != null ) {
// We know that this rule will cancel all other activations in the group // We know that this rule will cancel all other activations in the group
Expand Down Expand Up @@ -397,7 +398,7 @@ public void fireActivation(InternalWorkingMemory wm, InternalAgenda agenda, Acti
} }
} }


wm.getAgendaEventSupport().fireAfterActivationFired( activation, wm ); wm.getAgendaEventSupport().fireAfterActivationFired( activation, wm, beforeMatchFiredEvent );
} finally { } finally {
wm.endOperation(); wm.endOperation();
} }
Expand Down
Expand Up @@ -19,16 +19,20 @@
import org.kie.dmn.api.core.DMNResult; import org.kie.dmn.api.core.DMNResult;
import org.kie.dmn.api.core.ast.DecisionNode; import org.kie.dmn.api.core.ast.DecisionNode;
import org.kie.dmn.api.core.event.AfterEvaluateDecisionEvent; import org.kie.dmn.api.core.event.AfterEvaluateDecisionEvent;
import org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent;


public class AfterEvaluateDecisionEventImpl public class AfterEvaluateDecisionEventImpl
implements AfterEvaluateDecisionEvent { implements AfterEvaluateDecisionEvent {


private DecisionNode decision; private DecisionNode decision;
private DMNResult result; private DMNResult result;
private BeforeEvaluateDecisionEvent before;


public AfterEvaluateDecisionEventImpl( DecisionNode decision, DMNResult result) {
public AfterEvaluateDecisionEventImpl(DecisionNode decision, DMNResult result, BeforeEvaluateDecisionEvent beforeEvent) {
this.decision = decision; this.decision = decision;
this.result = result; this.result = result;
this.before = beforeEvent;
} }


@Override @Override
Expand All @@ -41,6 +45,10 @@ public DMNResult getResult() {
return this.result; return this.result;
} }


public BeforeEvaluateDecisionEvent getBeforeEvent() {
return before;
}

@Override @Override
public String toString() { public String toString() {
return "AfterEvaluateDecisionEvent{ name='"+decision.getName()+"' id='"+decision.getId()+"' }"; return "AfterEvaluateDecisionEvent{ name='"+decision.getName()+"' id='"+decision.getId()+"' }";
Expand Down
Expand Up @@ -25,6 +25,7 @@ public class BeforeEvaluateDecisionEventImpl


private DecisionNode decision; private DecisionNode decision;
private DMNResult result; private DMNResult result;
private long timestamp;


public BeforeEvaluateDecisionEventImpl(DecisionNode decision, DMNResult result) { public BeforeEvaluateDecisionEventImpl(DecisionNode decision, DMNResult result) {
this.decision = decision; this.decision = decision;
Expand All @@ -41,6 +42,14 @@ public DMNResult getResult() {
return this.result; return this.result;
} }


public long getTimestamp() {
return timestamp;
}

public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}

@Override @Override
public String toString() { public String toString() {
return "BeforeEvaluateDecisionEvent{ name='" + decision.getName() + "' id='" + decision.getId() + "' }"; return "BeforeEvaluateDecisionEvent{ name='" + decision.getName() + "' id='" + decision.getId() + "' }";
Expand Down
Expand Up @@ -31,16 +31,18 @@ public final class DMNRuntimeEventManagerUtils {


private static final Logger logger = LoggerFactory.getLogger( DMNRuntimeEventManagerUtils.class ); private static final Logger logger = LoggerFactory.getLogger( DMNRuntimeEventManagerUtils.class );


public static void fireBeforeEvaluateDecision( DMNRuntimeEventManager eventManager, DecisionNode decision, DMNResult result) { public static BeforeEvaluateDecisionEvent fireBeforeEvaluateDecision(DMNRuntimeEventManager eventManager, DecisionNode decision, DMNResult result) {
if( eventManager.hasListeners() ) { if( eventManager.hasListeners() ) {
BeforeEvaluateDecisionEvent event = new BeforeEvaluateDecisionEventImpl( decision, result ); BeforeEvaluateDecisionEvent event = new BeforeEvaluateDecisionEventImpl( decision, result );
notifyListeners( eventManager, l -> l.beforeEvaluateDecision( event ) ); notifyListeners( eventManager, l -> l.beforeEvaluateDecision( event ) );
return event;
} }
return null;
} }


public static void fireAfterEvaluateDecision( DMNRuntimeEventManager eventManager, DecisionNode decision, DMNResult result) { public static void fireAfterEvaluateDecision( DMNRuntimeEventManager eventManager, DecisionNode decision, DMNResult result, BeforeEvaluateDecisionEvent beforeEvaluateDecisionEvent) {
if( eventManager.hasListeners() ) { if( eventManager.hasListeners() ) {
AfterEvaluateDecisionEvent event = new AfterEvaluateDecisionEventImpl(decision, result); AfterEvaluateDecisionEvent event = new AfterEvaluateDecisionEventImpl(decision, result, beforeEvaluateDecisionEvent);
notifyListeners(eventManager, l -> l.afterEvaluateDecision(event)); notifyListeners(eventManager, l -> l.afterEvaluateDecision(event));
} }
} }
Expand Down
Expand Up @@ -49,6 +49,7 @@
import org.kie.dmn.api.core.ast.DecisionNode; import org.kie.dmn.api.core.ast.DecisionNode;
import org.kie.dmn.api.core.ast.DecisionServiceNode; import org.kie.dmn.api.core.ast.DecisionServiceNode;
import org.kie.dmn.api.core.ast.InputDataNode; import org.kie.dmn.api.core.ast.InputDataNode;
import org.kie.dmn.api.core.event.BeforeEvaluateDecisionEvent;
import org.kie.dmn.api.core.event.DMNRuntimeEventListener; import org.kie.dmn.api.core.event.DMNRuntimeEventListener;
import org.kie.dmn.core.api.DMNFactory; import org.kie.dmn.core.api.DMNFactory;
import org.kie.dmn.core.api.EvaluatorResult; import org.kie.dmn.core.api.EvaluatorResult;
Expand Down Expand Up @@ -475,8 +476,9 @@ private boolean evaluateDecision(DMNContext context, DMNResultImpl result, Decis
return false; return false;
} }
} }
BeforeEvaluateDecisionEvent beforeEvaluateDecisionEvent = null;
try { try {
DMNRuntimeEventManagerUtils.fireBeforeEvaluateDecision( eventManager, decision, result ); beforeEvaluateDecisionEvent = DMNRuntimeEventManagerUtils.fireBeforeEvaluateDecision(eventManager, decision, result);
boolean missingInput = false; boolean missingInput = false;
DMNDecisionResultImpl dr = (DMNDecisionResultImpl) result.getDecisionResultById(decisionId); DMNDecisionResultImpl dr = (DMNDecisionResultImpl) result.getDecisionResultById(decisionId);
if (dr == null) { // an imported Decision now evaluated, requires the creation of the decision result: if (dr == null) { // an imported Decision now evaluated, requires the creation of the decision result:
Expand Down Expand Up @@ -636,7 +638,7 @@ private boolean evaluateDecision(DMNContext context, DMNResultImpl result, Decis
} }
return true; return true;
} finally { } finally {
DMNRuntimeEventManagerUtils.fireAfterEvaluateDecision( eventManager, decision, result ); DMNRuntimeEventManagerUtils.fireAfterEvaluateDecision( eventManager, decision, result, beforeEvaluateDecisionEvent);
} }
} }


Expand Down

0 comments on commit 8116db8

Please sign in to comment.