如何找到需要很长时间才能完成的规则



我们运行了大约15000个规则,需要2个小时才能完成。我想弄清楚哪条规则需要很长时间。我不可能去每个规则并记录它。所以我实现了AgentaEventListener并重写afterCatchFired((方法。我知道哪些规则被取消了。但我怎么知道哪条规则花了很长时间。

如果希望有时间执行匹配,请更新侦听器以实现beforeMatchFired方法。当beforeMatchFired方法触发时,启动计时器。当相同规则的afterMatchFired触发时,停止计时器并记录它。您还需要跟踪取消的比赛以丢弃不必要的计时器。

记住要根据每个规则来跟踪这一点——您需要唯一地标识每个规则(包+名称应该足够具体(。请注意,如果您有扩展其他规则的规则,那么这个练习会变得有点复杂。

与其做自己的概要文件,不如看看能准确解决问题的新drools-metric模块。

来自手动

使用流度量模块来识别规则中的障碍您可以使用drowls度量模块来识别慢规则,尤其是当你处理许多规则时。下垂度量模块也可以提供帮助在Drools发动机性能分析中。请注意drowls度量模块不适用于生产环境。然而您可以在测试环境中执行分析。

要使用Drools指标分析Drools发动机性能,请添加将度量降到项目依赖项并启用跟踪日志记录对于org.rools.metric.util.MetricLogUtils,如下所示示例:

从实用程序中尝试RulesChronoAgendaEventListenerRulesChronoChartRecorder

两者都为您提供实时JMX监控,显示每个规则的平均和最大执行时间。其次,收集jfreechart数据,及时向您显示价值,这会让您对整体性能和"有问题"的情况有完美的了解。

注册会话侦听器

AgendaEventListener rulesChrono = new RulesChronoChartRecorder().withMaxThreshold(500).schedule();
session.addEventListener(rulesChrono);

按规则打印统计

StringBuilder sb = new StringBuilder();
rulesChrono.getPerfStat().values()
.forEach(s -> sb.append(format("%n%s - min: %.2f avg: %.2f max: %.2f activations: %d", s.getDomain(), s.getMinTimeMs(), s.getAvgTimeMs(), s.getMaxTimeMs(), s.getLeapsCount())));
System.out.println(sb.toString());

绘制图表

Map<String, TimeSeries> rulesMaxChart = rulesChrono.getRulesMaxChart();
Map<String, TimeSeries> rulesMinChart = rulesChrono.getRulesMinChart();
rulesChrono.getRulesAvgChart().entrySet()
.forEach(e -> ChartUtils.pngChart(format("charts/%s.png", e.getKey()), 1024, 500, e.getValue(), Color.black, rulesMaxChart.get(e.getKey()), Color.lightGray, rulesMinChart.get(e.getKey()), Color.lightGray));

第二,你需要jfreechart依赖

最新更新