- 浏览: 29414 次
- 性别:
- 来自: 重庆
最新评论
BaseRule中execute方法是规则计算的开始,但是,execute又是被谁调用的呢,特别是sample是如何从bus中取得的呢?
通过追中代码,发现,在NodeCalculatorImpl中,通过calculateDimension调用了execute,但是在calculateDimension方法中,没有做过多的逻辑处理,直接调用了excute。但是在成功调用了execute后回做一些处理,比如保存KPI的状态和结果,但是这不是今天的重点,暂时忽略。。。。
重点在calculateNode方法中,该方法调用了calculateDimension。calculateNode首先取得该CI的所有KPI,然后通过selecter获取sample。
因为rule是15秒被调用一次,所以,selecter获得sample应该是15秒之内到达bus的(可能是多个,也可能是0个),比如,BPM每1分钟运行一次,那么selecter会有3次取不到数据,所以,传入execute的sample容器有可能为空。
sample视乎已经取到了,但是我们的Rule如何利用这些sample呢。于是我们的另一个主角Accumulator登场了,它就好像KPI的荷包,装了和该KPI相关的sample,我们的rule就是从这个荷包里去取得sample做计算,然后把结果又保存到KPI的另外一个地方,当然这个荷包也有可能为空,什么时候为空呢,也许你已经猜到了,no data time out,right!!这个参数就是控制荷包是否为空的。比如,BPM每3分钟运行一次,如果no data timeout=30的话,那么当sample到达bus 30秒后,荷包就会被清空,也就是rule调用两次后,会发现荷包为空了,KPI状态应该为no data,也就是蓝色。。。。。。。 所以我们一般不能设置no data timeout小于DC的运行频率。
Accumulator分为2种:
1.SampleBasedAccumulator
2.TimeBasedAccumulator
第一种Accumulator我们在sample rule中已经分析了,它只保存最近的(或者根据需要保存最近的几个)sample。而
TimeBasedAccumulator会根据duration参数保存sample,比如,duration=1000,那么就保存最后一次计算到1000秒之前这段时间里的sample。
也许你不仅要问,KPI的荷包(Accumulator)是哪来的?现在我们来揭开神秘面纱,
我们知道BaseRule是Rule的最高父类,其子类有
---DummyRule
---FilterRule
---GroupAndSiblingRule
---LeafRule
---TimeBasedDummyRule
这里我们以LeafRule为例作分析,因为在execute真正执行计算之前,会调用,initRuleIfNeeded对Rule做一些初始化,你也许预感到了Accumulator就是在初始化的过程中生成的。在这个方法中,首先判断Rule是否被初始化,如果已经初始化,就什么也不做(从该方法名就能看出来了。。。。),如果没有初始化,会在initRuleIfNeeded中调用internalInit方法,因为LeafRule复写了该方法,所以这里调用的是LeafRule.internalInit,代码如下
void internalInit(RuleTrinityModelAccess access, RuleNode node, RuleDimension kpi) { super.internalInit(access, node, kpi); Accumulator accumulator = getAccumulator(kpi);//第一次返回null if (accumulator == null) { accumulator = createAccumulator(access, node, kpi);//创建Accumulator,这个方法会被LeafRule的子类重写,如果是与时间相关的子类返回的就是TimeBasedAccumulator,同时就会把duration到该accumulator 种,如果不是与时间相关的accumulator ,就会创建SampleBasedAccumulator kpi.setStateValue(ACCUMULATOR_KPI_STATE_KEY, accumulator);//保存accumulator 到KPI中 } else { initializeAccumulatorParameters(access, node, kpi, accumulator);//继续复用以前的accumulator ,但是会更新duration或者需要保存的sample数 } }
显然,在该方法中,如果Accumulator 为空,根据Rule的种类创建Accumulator。不为空,就复用它。
当internalInit返回后,initRuleIfNeeded继续调用init方法,该方法会根据Rule的不同类型做不同的动作,因为Rule的类型实在太多,所以就不分析了。。。最后初始化完了。
最后,就是设置KPI为 初始化 ,免得下次再初始化,然后设置初始化的时间。
到这里,Accumulator 创建了,Rule也已经初始化了,我们可以开始计算了,于是BaseRule.calculate被调用,因为LeafRule复写了该方法,所以这里实际调用的是LeafRule.calculate,让我们看看LeafRule.calculate到底干了什么。
也许你要问,sample在哪呢?在初始化的时候我们只是创建了Accumulator而已,还没把sample放到荷包呢!对,所以在LeafRule.calculate中,我们得先把荷包填满,呵呵。
执行这个填满荷包动作的是LeafRule.processSamples,从方法名就可以感觉到它是干什么的了,对处理sample,处理selecter千辛万苦从Bus中过滤出来的sample。
处理逻辑大致是:
如果原始sample容器(selecter选择出来的sample)不为空,会把原始容器里的所有sample加入Accumulator,你不用担心Accumulator会装不下,因为这里在加入同时,会删除过期的sample,这里的过期,可能是时间过期,也可能是个数过期(通过参数设定的最大个数),当然这是根据Accumulator的种类来判断到底是删除时间过期的sample 还是删除个数过期的。
如果原始sample容器(selecter选择出来的sample)为空,也要删除过期的sample。
处理完sample后,rule以后就到Accumulator中去拿sample来用了,此时你发现真正的计算逻辑还是展开,对,因为我们还没判断是否是no data, 判断是否是no data就是用Accumulator里面最新的sample做时间对比了,逻辑挺简单。。。
如果判断是no data,就调用handleNoData做处理,如果有data,接着调用calculateKpi,计算开始啦。。。。。。。
我们一般情况下也只要复写calculateKpi就OK了,至于怎么去计算,你想怎么玩就怎么玩。。。。。。
发表评论
-
嵌入EUM报告
2010-12-08 17:22 9051。解决Genrate Button无反应问题 修改t ... -
Matcher log
2009-12-02 01:08 1167Trinity listens to BAC's BUS an ... -
WDE log
2009-12-02 00:51 1091The Web Data Entry is the sampl ... -
Rule log
2009-12-02 00:47 873The Rule Engine contains the ac ... -
KPI Matcher
2009-12-02 00:44 985Trinity uses the Matcher as the ... -
BAC数据DEBUG(WDE & Loader Troubleshooting)
2009-11-27 20:37 1408WDE Data Collectors send data ... -
Sample日志
2009-11-04 13:33 949D:\HPBAC\conf\core\Tools\log4j\ ... -
Dashborad Tables
2009-09-23 17:41 1480Dashboard Repository BC_R ... -
MyBac Tables
2009-09-23 17:40 1246All MyBSM (MyBAC) related tabl ... -
BAC Log files
2009-09-23 17:30 1668Dashboard Monitor displ ... -
BAC Monitor Rule分析
2009-09-08 22:27 1142Mointor Rule是BAC数据来源的起点, ... -
读BAC7.5 源码有感
2009-09-06 01:10 810累,脑细胞不知道死了多少了。而且由于官方放出的源代码太少,只 ... -
Bac7.5 中Generic Sample Rule分析
2009-09-02 22:44 893Dashbord中的Generic Sample Rule用的 ...
相关推荐
2. **转化DH10Bac**:将含有目的基因的pFastBac表达质粒转化至DH10Bac细胞,Tn7转座子会在微型-attTn7位点插入,生成重组质粒。 3. **重组杆状病毒生成**:将重组质粒DNA转染到昆虫细胞,生成重组杆状病毒。 4. **...
2. Ecoli 宿主,DH10Bac:包含杆状病毒质粒(杆粒)和辅助质粒,在转染 pFastBac 表达结构后可以产生重组杆粒。 3. 控制表达的质粒:包括 Gus 和/或 CAT 基因,以便在感染细胞后产生重组杆状病毒,表达 β-葡萄糖...
HP BAC(Business Availability Center)是HP提供的一款企业级业务连续性解决方案,集成SiteScope可以增强其监控能力。集成步骤包括: 1. **创建管理数据库**:在BAC端,通过管理-平台-设置和维护-管理配置文件...
2. **算法与数据结构**:包括排序算法(如冒泡、选择、插入、快速、归并排序)、查找算法(如二分查找、哈希查找)、树和图的遍历算法等,以及链表、栈、队列、堆、图等数据结构的理解和应用。 3. **操作系统原理**...
Android statusBar添加bac
惠普业务可用性中心(HP Business Availability Center,简称HP BAC)是一款强大的业务可用性管理解决方案,它专为Windows和Solaris操作系统设计,旨在帮助组织实现业务流程的端到端监控、管理和优化。该软件版本为...
本文件探讨的是大数据在水稻基因组BAC(Bacterial Artificial Chromosome)物理图谱构建中的应用,以及相关数据库分析查询系统的本地搭建。 **1. 大数据与基因组作图** 大数据在基因组学中的应用主要体现在基因组...
2. **DH10Bac Ecoli宿主**:这是一种经过改造的大肠杆菌,内置了杆状病毒质粒和辅助质粒,当pFastBac表达结构被导入后,可以生成重组杆状病毒质粒。DH10Bac细胞的微型-attTn7靶位点与pFastBac质粒中的Tn7转座子相互...
### 迅饶BACnet 网关BAC1002-ARM #### 一、产品概述 迅饶BACnet 网关BAC1002-ARM是一款高性能、多功能的网关设备,专门用于实现不同通信协议之间的转换,特别是将各种设备连接到BACnetIP网络中。该网关适用于楼宇...
Elco-宜科 条码阅读器-BAC 48产品手册pdf,Elco-宜科 条码阅读器-BAC 48产品手册
2. **DH10Bac宿主菌**:这是一种特殊的E.coli菌株,内含杆状病毒质粒(bacmid)和辅助质粒。当pFastBac表达结构转入DH10Bac后,通过Tn7转座子的作用,可以生成重组质粒。 3. **控制表达质粒**:包括Gus和/或CAT基因...
软件特点: -绿色免安装,支持中英文; -支持60种协议同时转为BACnet IP服务器; -支持WEB浏览,查看,设置,进行监视和控制; -支持线性转换,取位,高低字节转换;...-添加新的私有协议支持BACnet,2周内即可完成.
2. **DH10Bac大肠杆菌宿主**:这种特殊的Ecoli菌株包含杆状病毒质粒(杆粒)和辅助质粒pMON7124。当pFastBac表达结构被导入DH10Bac细胞后,Tn7转座子会将目的基因插入到微型-attTn7靶位点,从而产生重组质粒。 3. *...
在详细解读“BAC-S-MOD-M配置软件使用说明.pdf”文档内容后,我们可以提炼以下IT知识点: ### BAC-S-MOD-M配置软件功能及应用 1. **软件目的:** 该配置软件主要用于对BAC-S-MOD-M网关进行参数配置,包括网关的IP...
Elco-宜科 条码阅读器-BAC500产品手册pdf,Elco-宜科 条码阅读器-BAC500产品手册
Programming RS232 Communication v2.0 by Hai Bac
BAC0 BAC0是一个Python 3(3.5及更高版本)脚本应用程序,它使用处理IP网络上的BACnet消息。 该库带出简单的命令来浏览BACnet网络,从BACnet设备读取属性或对其进行写入。 Python是一种简单易学的语言,并且是用于...