20.規則監控

簡介

規則監控針對的是對知識包調用的監控。在URule Pro當中,規則是放在知識包是調用的,所以規則監控也就是對知識包的監控。

點開(kāi)每個(gè)項目的知識包節點,可(kě)以看到已定義的知識包的操作(zuò)列裏都有(yǒu)一個(gè)用于配置監控信息的按鈕,如下圖所示:

點擊該按鈕,即可(kě)打開(kāi)針對當前知識包的監控配置窗口,如下圖所示:

勾選“啓用對當前知識包的調用監控”選項,即可(kě)開(kāi)始配置具體(tǐ)的要監控的信息。

監控配置

勾選“啓用對當前知識包的調用監控”選項後,就可(kě)以看到具體(tǐ)可(kě)配置的監控選項,如下圖所示:

整個(gè)監控的選項分為(wèi)三個(gè)部分,分别是監控內(nèi)容、輸入數(shù)據以及輸出數(shù)據。

監控內(nèi)容部分主要是對系統日志(zhì)部分內(nèi)容進行(xíng)的監控,這部分內(nèi)容依賴于當前知識包中規則是否開(kāi)啓“允許調試信息輸出”屬性以及運行(xíng)項目中有(yǒu)沒有(yǒu)将urule.debug屬性配置為(wèi)true, 隻有(yǒu)這兩個(gè)都開(kāi)啓了,那(nà)麽監控內(nèi)容部分配置才有(yǒu)意義,否則監控到的內(nèi)容皆為(wèi)空(kōng)。

之前我們對規則中“允許調試信息輸出”屬性以及運行(xíng)項目中urule.debug屬性有(yǒu)過介紹,要求在生(shēng)産環境中一定要把urule.debug屬性設置為(wèi)false,這樣所有(yǒu)的調試信息都将不再産生(shēng),就不會(huì)對性能産生(shēng)影(yǐng)響。

第二部分和(hé)第三部分中會(huì)把當前知識包中用到的所有(yǒu)變量及參數(shù)都羅列出來(lái),我們需要做(zuò)的就是根據需要進行(xíng)勾選,這樣在監控運行(xíng)時(shí)會(huì)所勾選的輸入以及輸出信息都記錄下來(lái),給我們自定義的監控實現類使用。

配置好監控內(nèi)容後,接下來(lái)還(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);
}

這裏可(kě)能有(yǒu)人(rén)會(huì)有(yǒu)疑問,知識包監控為(wèi)什麽還(hái)要編寫接口實現類呢?這是因為(wèi)對于URule Pro來(lái)說,他要做(zuò)的工作(zuò)就是把要監控的數(shù)據準備好,然後交給用戶去處理(lǐ),因為(wèi)URule Pro本身并不知道(dào)該如何處理(lǐ)這些(xiē)要監控的數(shù)據,所以需要用戶編寫實現類來(lái)決定如何處理(lǐ)這些(xiē)監控數(shù)據。 對于接口實現類來(lái)說,可(kě)以把這些(xiē)監控數(shù)據存儲到傳統的數(shù)據庫中,也可(kě)以存儲到key-value數(shù)據庫中,可(kě)以直接存,也可(kě)以開(kāi)啓獨立線程異步去存。

在這個(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.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 返回規則運行(xíng)總的耗時(shí),單位為(wèi)毫秒(miǎo)
     */
    long getTotalDuration();

    /**
     * @return 返回當前知識包版本,如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空(kōng)
     */
    String getVersion();

    /**
     * @return 返回當前知識包版本備注信息,如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空(kōng)
     */
    String getVersionComment();

    /**
     * @return 返回當前知識包版本創建日期,如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空(kōng)
     */
    Date getVersionCreateDate();

    /**
     * @return 返回當前知識包版本創建人(rén),如果當前知識包沒有(yǒu)發布版本,則該值為(wèi)空(kōng)
     */
    String getVersionCreateUser();

    /**
     * @return 返回所有(yǒu)匹配的規則對象信息
     */
    List<MatchedRuleLog> getMatchedRuleList();

    /**
     * @return 返回所有(yǒu)不匹配的規則對象信息
     */
    List<RuleData> getNotMatchRuleList();

    /**
     * @return 返回所有(yǒu)觸發了的規則流節點信息(如果當前有(yǒu)規則流的話(huà))
     */
    List<FlowNodeLog> getFiredFlowNodeList();

    /**
     * @return 返回當前執行(xíng)的知識包中監控是否允許顯示日志(zhì)信息
     */
    boolean isShowLog();

    /**
     * @return 返回當前執行(xíng)的知識包中是否允許顯示所有(yǒu)匹配的規則信息
     */
    boolean isShowMatchedRuleList();

    /**
     * @return 返回當前執行(xíng)的知識包中是否要顯示不匹配的規則信息
     */
    boolean isShowNotMatchRuleList();

    /**
     * @return 返回當前執行(xíng)的知識包中是否顯示觸發的規則節點信息(如果當前有(yǒu)規則流的話(huà))
     */
    boolean isShowFiredFlowNodeList();

    /**
     * @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) {
        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("耗時(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的實現類,所以需要這麽配置。

results matching ""

    No results matching ""