20.規則監控
簡介
規則監控針對的是對知識包調用(yòng)的監控。在URule Pro當中(zhōng),規則是放在知識包是調用(yòng)的,所以規則監控也就是對知識包的監控。
點開每個項目的知識包節點,可(kě)以看到已定義的知識包的操作(zuò)列裏都有(yǒu)一個用(yòng)于配置監控信息的按鈕,如下图所示:
點擊該按鈕,即可(kě)打開針對當前知識包的監控配置窗口,如下图所示:
勾選“啓用(yòng)對當前知識包的調用(yòng)監控”選項,即可(kě)開始配置具(jù)體(tǐ)的要監控的信息。
監控配置
勾選“啓用(yòng)對當前知識包的調用(yòng)監控”選項後,就可(kě)以看到具(jù)體(tǐ)可(kě)配置的監控選項,如下图所示:
整個監控的選項分(fēn)為(wèi)三個部分(fēn),分(fēn)别是監控内容、輸入數據以及輸出數據。
監控内容部分(fēn)主要是對系統日志(zhì)部分(fēn)内容進行的監控,這部分(fēn)内容依賴于當前知識包中(zhōng)規則是否開啓“允許調試信息輸出”屬性以及運行項目中(zhōng)有(yǒu)沒有(yǒu)将urule.debug屬性配置為(wèi)true, 隻有(yǒu)這兩個都開啓了,那麽監控内容部分(fēn)配置才有(yǒu)意義,否則監控到的内容皆為(wèi)空。
之前我們對規則中(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)生影響。
第二部分(fēn)和第三部分(fēn)中(zhōng)會把當前知識包中(zhōng)用(yòng)到的所有(yǒu)變量及參數都羅列出來,我們需要做的就是根據需要進行勾選,這樣在監控運行時會所勾選的輸入以及輸出信息都記錄下來,給我們自定義的監控實現類使用(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);
}
這裏可(kě)能(néng)有(yǒu)人會有(yǒu)疑問,知識包監控為(wèi)什麽還要編寫接口實現類呢(ne)?這是因為(wèi)對于URule Pro來說,他(tā)要做的工(gōng)作(zuò)就是把要監控的數據準備好,然後交給用(yòng)戶去處理(lǐ),因為(wèi)URule Pro本身并不知道該如何處理(lǐ)這些要監控的數據,所以需要用(yòng)戶編寫實現類來決定如何處理(lǐ)這些監控數據。 對于接口實現類來說,可(kě)以把這些監控數據存儲到傳統的數據庫中(zhōng),也可(kě)以存儲到key-value數據庫中(zhōng),可(kě)以直接存,也可(kě)以開啓獨立線(xiàn)程異步去存。
在這個接口中(zhōng),需要實現的方法隻有(yǒu)一個,參數也隻有(yǒu)一個,在這個MonitorData參數裏,已經把上述知識包監控配置裏要求監控的内容都準備好了,我們直接調用(yòng)即可(kě),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 返回當前監控的知識包名(míng)稱信息:項目名(míng)稱/知識包ID
*/
String getPackageInfo();
/**
* @return 返回規則運行總的耗時,單位為(wèi)毫秒(miǎo)
*/
long getTotalDuration();
/**
* @return 返回當前知識包版本,如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空
*/
String getVersion();
/**
* @return 返回當前知識包版本備注信息,如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空
*/
String getVersionComment();
/**
* @return 返回當前知識包版本創建日期,如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空
*/
Date getVersionCreateDate();
/**
* @return 返回當前知識包版本創建人,如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空
*/
String getVersionCreateUser();
/**
* @return 返回所有(yǒu)匹配的規則對象信息
*/
List<MatchedRuleLog> getMatchedRuleList();
/**
* @return 返回所有(yǒu)不匹配的規則對象信息
*/
List<RuleData> getNotMatchRuleList();
/**
* @return 返回所有(yǒu)觸發了的規則流節點信息(如果當前有(yǒu)規則流的話)
*/
List<FlowNodeLog> getFiredFlowNodeList();
/**
* @return 返回當前執行的知識包中(zhōng)監控是否允許顯示日志(zhì)信息
*/
boolean isShowLog();
/**
* @return 返回當前執行的知識包中(zhōng)是否允許顯示所有(yǒu)匹配的規則信息
*/
boolean isShowMatchedRuleList();
/**
* @return 返回當前執行的知識包中(zhōng)是否要顯示不匹配的規則信息
*/
boolean isShowNotMatchRuleList();
/**
* @return 返回當前執行的知識包中(zhōng)是否顯示觸發的規則節點信息(如果當前有(yǒu)規則流的話)
*/
boolean isShowFiredFlowNodeList();
/**
* @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) {
if(data.isShowLog()) {
System.out.println("日志(zhì):"+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());
}
}
需要注意的是,如果我們使用(yòng)URule Pro的方式為(wèi)客戶端服務(wù)器模式,同時又(yòu)想對知識包調用(yòng)進行監控,那麽InvokeMonitor的實現類則必須配置在知識包實際運行的客戶端,原因很(hěn)簡單,因為(wèi)知識包是在客戶端運行, 要監控知識包,必須要保證當前知識包運行環境裏能(néng)檢測到InvokeMonitor的實現類,所以需要這麽配置。