Skip to content

Commit

Permalink
[DROOLS-7599] SessionStats should have the 'end' attribute only when …
Browse files Browse the repository at this point in the history
…the session is disposed (#96)
  • Loading branch information
mariofusco authored Jan 3, 2024
1 parent 4be84ec commit 1a64e2c
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 30 deletions.
2 changes: 1 addition & 1 deletion .ci/jenkins/Jenkinsfile.prod.nightly
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ pipeline{
label 'kie-rhel7 && kie-mem8g && !built-in'
}
tools {
maven 'kie-maven-3.8.7'
maven 'kie-maven-3.9.3'
jdk 'kie-jdk17'
nodejs 'nodejs-16.2.0'
}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/pull-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
matrix:
os: [ubuntu-latest]
java-version: [17]
maven-version: ['3.8.7']
maven-version: ['3.9.3']
fail-fast: false
runs-on: ${{ matrix.os }}
name: Ansible Integration / ${{ matrix.os }} / Java-${{ matrix.java-version }} / Maven-${{ matrix.maven-version }}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,5 @@
package org.drools.ansible.rulebook.integration.api.rulesengine;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import org.drools.ansible.rulebook.integration.api.RulesExecutorContainer;
import org.drools.ansible.rulebook.integration.api.domain.RuleMatch;
import org.drools.ansible.rulebook.integration.api.io.JsonMapper;
Expand All @@ -24,6 +12,18 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public abstract class AbstractRulesEvaluator implements RulesEvaluator {

protected static final Logger log = LoggerFactory.getLogger(AbstractRulesEvaluator.class);
Expand Down Expand Up @@ -161,7 +161,7 @@ public SessionStats dispose() {

@Override
public SessionStats getSessionStats() {
return rulesExecutorSession.getSessionStats();
return rulesExecutorSession.getSessionStats(false);
}

protected List<Match> process(Map<String, Object> factMap, boolean processEventInsertion) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,13 @@ int fireAllRules(AgendaFilter agendaFilter) {
}

SessionStats dispose() {
SessionStats stats = getSessionStats();
SessionStats stats = getSessionStats(true);
kieSession.dispose();
return stats;
}

SessionStats getSessionStats() {
return sessionStatsCollector.generateStats(this);
SessionStats getSessionStats(boolean disposing) {
return sessionStatsCollector.generateStats(this, disposing);
}

public void registerMatch(Match match) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package org.drools.ansible.rulebook.integration.api.rulesengine;

import com.fasterxml.jackson.annotation.JsonInclude;
import org.drools.base.facttemplates.Fact;

import java.time.Instant;
import java.util.Collection;
import java.util.stream.Stream;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class SessionStats {
private final String start;
private final String end;
Expand Down Expand Up @@ -34,9 +36,9 @@ public class SessionStats {
private final String lastRuleFired;
private final String lastRuleFiredAt;

public SessionStats(SessionStatsCollector stats, RulesExecutorSession session) {
public SessionStats(SessionStatsCollector stats, RulesExecutorSession session, boolean disposing) {
this.start = stats.getStart().toString();
this.end = Instant.now().toString();
this.end = disposing ? Instant.now().toString() : null;
this.lastClockTime = Instant.ofEpochMilli(session.getPseudoClock().getCurrentTime()).toString();
this.clockAdvanceCount = stats.getClockAdvanceCount();
this.numberOfRules = session.rulesCount();
Expand Down Expand Up @@ -86,7 +88,7 @@ public SessionStats(String start, String end, String lastClockTime, int clockAdv
public String toString() {
return "SessionStats{" +
"start='" + start + '\'' +
", end='" + end + '\'' +
(end != null ? ", end='" + end + '\'' : "") +
", lastClockTime='" + lastClockTime + '\'' +
", clockAdvanceCount=" + clockAdvanceCount +
", numberOfRules=" + numberOfRules +
Expand Down Expand Up @@ -202,7 +204,9 @@ public static SessionStats aggregate(SessionStats stats1, SessionStats stats2) {

return new SessionStats(
Instant.parse(stats1.getStart()).compareTo(Instant.parse(stats2.getStart())) < 0 ? stats1.getStart() : stats2.getStart(),
Instant.parse(stats1.getEnd()).compareTo(Instant.parse(stats2.getEnd())) > 0 ? stats1.getEnd() : stats2.getEnd(),
stats1.getEnd() == null || stats2.getEnd() == null ? // if one of the sessions is still alive the aggregate is also alive
null :
( Instant.parse(stats1.getEnd()).compareTo(Instant.parse(stats2.getEnd())) > 0 ? stats1.getEnd() : stats2.getEnd() ),
Instant.parse(stats1.getLastClockTime()).compareTo(Instant.parse(stats2.getLastClockTime())) > 0 ? stats1.getLastClockTime() : stats2.getLastClockTime(),
stats1.clockAdvanceCount + stats2.clockAdvanceCount,
stats1.numberOfRules + stats2.numberOfRules,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package org.drools.ansible.rulebook.integration.api.rulesengine;

import java.time.Instant;
import java.util.Collection;
import java.util.concurrent.TimeUnit;

import org.kie.api.runtime.rule.FactHandle;
import org.kie.api.runtime.rule.Match;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.time.Instant;
import java.util.Collection;
import java.util.concurrent.TimeUnit;

public class SessionStatsCollector {

private static final Logger LOG = LoggerFactory.getLogger(SessionStatsCollector.class.getName());
Expand Down Expand Up @@ -47,8 +47,8 @@ public SessionStatsCollector(long id) {
this.id = id;
}

public SessionStats generateStats(RulesExecutorSession session) {
return new SessionStats(this, session);
public SessionStats generateStats(RulesExecutorSession session, boolean disposing) {
return new SessionStats(this, session, disposing);
}

public Instant getStart() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

public class SessionStatsTest {
Expand Down Expand Up @@ -86,7 +88,9 @@ public void testWithDisabledRule() {
assertTrue( stats.getPermanentStorageSize() > 10 );
assertTrue( stats.getPermanentStorageSize() < 1000 );
assertEquals( "R1", stats.getLastRuleFired() );
assertNull( stats.getEnd() );

rulesExecutor.dispose();
SessionStats disposeStats = rulesExecutor.dispose();
assertNotNull( disposeStats.getEnd() );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,11 @@ public void testJpyApi() {
assertEquals(4, statsMap.get("numberOfRules"));
assertEquals(0, statsMap.get("numberOfDisabledRules"));
assertEquals(1, statsMap.get("rulesTriggered"));
engine.dispose(sessionId);
assertFalse(statsMap.keySet().contains("end"));

String disposeStats = engine.dispose(sessionId);
Map<String, Object> disposeStatsMap = JsonMapper.readValueAsMapOfStringAndObject(disposeStats);
assertTrue(disposeStatsMap.keySet().contains("end"));
}
}

Expand Down

0 comments on commit 1a64e2c

Please sign in to comment.