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