20.规则监控
简介
规则监控针对的是对知识包调用的监控。在URule Pro当中,规则是放在知识包是调用的,所以规则监控也就是对知识包的监控。
点开每个项目的知识包节点,可以看到已定义的知识包的操作列里都有一个用于配置监控信息的按钮,如下图所示:
点击该按钮,即可打开针对当前知识包的监控配置窗口,如下图所示:
勾选“启用对当前知识包的调用监控”选项,即可开始配置具体的要监控的信息。
监控配置
勾选“启用对当前知识包的调用监控”选项后,就可以看到具体可配置的监控选项,如下图所示:
整个监控的选项分为三个部分,分别是监控内容、输入数据以及输出数据。
监控内容部分主要是对系统日志部分内容进行的监控,这部分内容依赖于当前知识包中规则是否开启“允许调试信息输出”属性以及运行项目中有没有将urule.debug属性配置为true,
只有这两个都开启了,那么监控内容部分配置才有意义,否则监控到的内容皆为空。
之前我们对规则中“允许调试信息输出”属性以及运行项目中urule.debug属性有过介绍,要求在生产环境中一定要把urule.debug属性设置为false,这样所有的调试信息都将不再产生,就不会对性能产生影响。
第二部分和第三部分中会把当前知识包中用到的所有变量及参数都罗列出来,我们需要做的就是根据需要进行勾选,这样在监控运行时会所勾选的输入以及输出信息都记录下来,给我们自定义的监控实现类使用。
配置好监控内容后,接下来还需要编写具体的监控数据处理实现类,该类编写完成后需要配置到Spring上下文中,使其成为一个标准的Spring Bean,这样引擎才能发现并使用它,该类接口源码如下:
package com.bstek.urule.runtime.monitor;
/**
* @author Jacky.gao
* @since 2018年12月17日
*/
public interface InvokeMonitor {
void doMonitor(MonitorData data);
}这里可能有人会有疑问,知识包监控为什么还要编写接口实现类呢?这是因为对于URule Pro来说,他要做的工作就是把要监控的数据准备好,然后交给用户去处理,因为URule Pro本身并不知道该如何处理这些要监控的数据,所以需要用户编写实现类来决定如何处理这些监控数据。
对于接口实现类来说,可以把这些监控数据存储到传统的数据库中,也可以存储到key-value数据库中,可以直接存,也可以开启独立线程异步去存。
在这个接口中,需要实现的方法只有一个,参数也只有一个,在这个MonitorData参数里,已经把上述知识包监控配置里要求监控的内容都准备好了,我们直接调用即可,MonitorData源码如下:
package com.bstek.urule.runtime.monitor;
import java.util.Date;
import java.util.List;
import com.bstek.urule.model.rete.RuleData;
import com.bstek.urule.runtime.log.FlowNodeLog;
import com.bstek.urule.runtime.log.Log;
import com.bstek.urule.runtime.log.MatchedRuleLog;
/**
* @author Jacky.gao
* @since 2018年12月18日
*/
public interface MonitorData {
/**
* @return 返回当前监控的知识包名称信息:项目名称/知识包ID
*/
String getPackageInfo();
/**
* @return 返回规则运行总的耗时,单位为毫秒
*/
long getTotalDuration();
/**
* @return 返回当前知识包版本,如果当前知识包没有发布版本,则该值为空
*/
String getVersion();
/**
* @return 返回当前知识包版本备注信息,如果当前知识包没有发布版本,则该值为空
*/
String getVersionComment();
/**
* @return 返回当前知识包版本创建日期,如果当前知识包没有发布版本,则该值为空
*/
Date getVersionCreateDate();
/**
* @return 返回当前知识包版本创建人,如果当前知识包没有发布版本,则该值为空
*/
String getVersionCreateUser();
/**
* @return 返回所有匹配的规则对象信息
*/
List getMatchedRuleList();
/**
* @return 返回所有不匹配的规则对象信息
*/
List getNotMatchRuleList();
/**
* @return 返回所有触发了的规则流节点信息(如果当前有规则流的话)
*/
List getFiredFlowNodeList();
/**
* @return 返回当前执行的知识包中监控是否允许显示日志信息
*/
boolean isShowLog();
/**
* @return 返回当前执行的知识包中是否允许显示所有匹配的规则信息
*/
boolean isShowMatchedRuleList();
/**
* @return 返回当前执行的知识包中是否要显示不匹配的规则信息
*/
boolean isShowNotMatchRuleList();
/**
* @return 返回当前执行的知识包中是否显示触发的规则节点信息(如果当前有规则流的话)
*/
boolean isShowFiredFlowNodeList();
/**
* @return 返回所有输入日志信息(如果当前配置的日志信息输出的话)
*/
List getLogs();
/**
* @return 返回指定的输入信息
*/
List getInputData();
/**
* @return 返回规则计算后指定的输出信息
*/
List getOutputData();
}
可以看到,在MonitorData接口中,可以获取到当前知识包监控配置的所有信息,这样在记录这个信息时可以先判断系统是否配置了要监控这项信息,以防获取到的信息为空情况发生。下面的这个实现类在输出要监控的信息时就加了判断:
package test;
import com.bstek.urule.runtime.monitor.InvokeMonitor;
import com.bstek.urule.runtime.monitor.MonitorData;
/**
* @author Jacky.gao
* @since 2018年12月17日
*/
public class TestInvokeMonitor implements InvokeMonitor {
public void doMonitor(MonitorData data) {
if(data.isShowLog()) {
System.out.println("日志:"+data.getLogs());
}
if(data.isShowFiredFlowNodeList()) {
System.out.println("触发的规则节点列表:"+data.getFiredFlowNodeList());
}
if(data.isShowMatchedRuleList()) {
System.out.println("匹配的规则列表:"+data.getMatchedRuleList());
}
if(data.isShowNotMatchRuleList()) {
System.out.println("不匹配的规则列表:"+data.getNotMatchRuleList());
}
System.out.println("耗时:"+data.getTotalDuration());
System.out.println("packageInfo:"+data.getPackageInfo());
System.out.println("输入数据:"+data.getInputData());
System.out.println("输出数据:"+data.getOutputData());
}
}需要注意的是,如果我们使用URule Pro的方式为客户端服务器模式,同时又想对知识包调用进行监控,那么InvokeMonitor的实现类则必须配置在知识包实际运行的客户端,原因很简单,因为知识包是在客户端运行,
要监控知识包,必须要保证当前知识包运行环境里能检测到InvokeMonitor的实现类,所以需要这么配置。