14.5.規則監控
簡介
規則監控針對的是對知識包調用(yòng)的監控。在URule Pro當中(zhōng),規則是放在知識包是調用(yòng)的,所以規則監控也就是對知識包的監控。
打開項目的知識包頁(yè)面,在已啓用(yòng)的知識包上點擊右鍵,在彈出菜單中(zhōng)選擇知識包調用(yòng)監控配置,如下图所示:
點擊該菜單項,即可(kě)打開針對當前知識包的監控配置窗口,如下图所示:
勾選“啓用(yòng)對當前知識包的調用(yòng)監控”選項,即可(kě)開始配置具(jù)體(tǐ)的要監控的信息。
監控配置
勾選“啓用(yòng)對當前知識包的調用(yòng)監控”選項後,就可(kě)以看到具(jù)體(tǐ)可(kě)配置的監控選項,整個監控的選項分(fēn)為(wèi)兩個部分(fēn),既輸入數據以及輸出數據。
當前知識包中(zhōng)規則如果開啓“允許調試信息輸出”屬性,同時運行項目中(zhōng)将urule.debug屬性配置為(wèi)true,那麽監控時會自動記錄規則運行時産(chǎn)生的日志(zhì)。
之前我們對規則中(zhōng)“允許調試信息輸出”屬性以及運行項目中(zhōng)urule.debug屬性有(yǒu)過介紹,要求在生産(chǎn)環境中(zhōng)一定要把urule.debug屬性設置為(wèi)false,這樣所有(yǒu)的調試信息都将不再産(chǎn)生,就不會對性能(néng)産(chǎn)生影響。
監控配置窗口會把當前知識包中(zhōng)用(yòng)到的所有(yǒu)變量及參數根據其用(yòng)途屬性羅列出來,我們需要做的就是根據需要進行勾選,這樣在監控運行時會所勾選的輸入以及輸出信息都記錄下來,給我們自定義的監控實現類使用(yòng)。
監控配置窗口在輸入數據部分(fēn)隻會羅列變量及參數中(zhōng)用(yòng)途為(wèi)In及InOut類型,輸出隻會羅列Out及InOut類型。
注意:監控操作(zuò)針對的是規則的執行,規則執行調用(yòng)的是已發布的知識包,因此,監控中(zhōng)配置的輸入和輸出變量及參數也是來自當前知識包中(zhōng)處于啓用(yòng)狀态的已發布的知識包。所以配置知識包監控,要确保當前知識包已經發布,且處于啓用(yòng)狀态的已發布的知識包必須是我們需要的那個。
如果我們當前調用(yòng)規則采用(yòng)的是Rest服務(wù)方式,那麽配置好監控内容後,在通過Rest服務(wù)調用(yòng)規則時系統會自動根據這裏的配置對規則調用(yòng)進行記錄監控,無須再做别的配置;如果我們使用(yòng)的是API方式調用(yòng)規則,那麽還需要編寫具(jù)體(tǐ)的監控數據處理(lǐ)實現類,該類編寫完成後需要配置到Spring上下文(wén)中(zhōng),使其成為(wèi)一個标準的Spring Bean,這樣引擎才能(néng)發現并使用(yòng)它,該類接口源碼如下:
package com.bstek.urule.runtime.monitor;
/**
* @author Jacky.gao
* @since 2018年12月17日
*/
public interface InvokeMonitor {
void doMonitor(MonitorData data);
}
在這個接口中(zhōng),需要實現的方法隻有(yǒu)一個,參數也隻有(yǒu)一個,在這個MonitorData參數裏,已經把上述知識包監控配置裏要求監控的内容都準備好了,我們直接調用(yòng)即可(kě),MonitorData源碼如下:
package com.bstek.urule.runtime.monitor;
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 返回當前監控的知識包名(míng)稱信息:項目名(míng)稱/知識包ID
*/
String getPackageInfo();
/**
* @return 返回規則運行總的耗時,單位為(wèi)毫秒(miǎo)
*/
long getTotalDuration();
/**
* @return 返回當前知識包版本,如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空
*/
String getVersion();
/**
* @return 返回所有(yǒu)匹配的規則對象信息
*/
List<MatchedRuleLog> getMatchedRuleList();
/**
* @return 返回所有(yǒu)不匹配的規則對象信息
*/
List<RuleData> getNotMatchRuleList();
/**
* @return 返回所有(yǒu)觸發了的規則流節點信息(如果當前有(yǒu)規則流的話)
*/
List<FlowNodeLog> getFiredFlowNodeList();
/**
* @return 返回所有(yǒu)輸入日志(zhì)信息(如果當前配置的日志(zhì)信息輸出的話)
*/
List<Log> getLogs();
/**
* @return 返回指定的輸入信息
*/
List<IOData> getInputData();
/**
* @return 返回規則計算後指定的輸出信息
*/
List<IOData> getOutputData();
}
可(kě)以看到,在MonitorData接口中(zhōng),可(kě)以獲取到當前知識包監控配置的所有(yǒu)信息,這樣在記錄這個信息時可(kě)以先判斷系統是否配置了要監控這項信息,以防獲取到的信息為(wèi)空情況發生。下面的這個實現類在輸出要監控的信息時就加了判斷:
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) {
System.out.println("日志(zhì):"+data.getLogs());
System.out.println("觸發的規則節點列表:"+data.getFiredFlowNodeList());
System.out.println("匹配的規則列表:"+data.getMatchedRuleList());
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());
}
}
需要注意的是,如果我們使用(yòng)URule Pro的方式為(wèi)客戶端服務(wù)器模式,同時又(yòu)想對知識包調用(yòng)進行監控,那麽InvokeMonitor的實現類則必須配置在知識包實際運行的客戶端,原因很(hěn)簡單,因為(wèi)知識包是在客戶端運行,要監控知識包,必須要保證當前知識包運行環境裏能(néng)檢測到InvokeMonitor的實現類,所以需要這麽配置。