open-falcon hbs学习

2018-04-12  本文已影响34人  一盆饭

关于心跳服务:

每个agent都会一个周期上报给hbs一次状态,agent通过rpc调用ReportStatus()方法,将hostname写到hbs的agent缓存中去。此外还有策略发现增加采集,信任ip列表,更新插件。

DeleteStaleAgents() 删除内存中一天都没有心跳的Agent,每24小时触发一次


hbs中缓存数据cache:

GroupTemplates map[gid][tid] grp-tpl关联表数据

HostGroupsMap map[hid][gid] host-grp关联表数据

HostMap map[hostname][id] host表数据

TemplateCache map[template.id]{template} tpl表数据

Strategies map[s.id]{strategy} strategy表中tpl下的数据(如果Strategy没有对应的Tpl,那就没有action,就没法报警,无需往后传递了)

HostTemplateIds map[hid]{[]tid} tpl_grp,host_grp表关于grp_id字段join,取一个机器ID对应了多个模板ID

ExpressionCache []Expression 表达式数组

MonitoredHosts map[id]{host} host表maintain_begin > now or maintain_end < now


缓存全量策略 :

在HBS的GetStrategies()方法中,先介绍下策略表结构:

strategy(策略)————tpl(模板)————tpl_grp————grp(监控组)————grp_host————host(可以理解上报单位endpoint)

            1...n     n..........n       n..........n

GetStrategies()方法功能是获取host对应的所有strategy,其实一个sql就可以完成,简写为

SELECT *

FROM strategy

WHERE

    exists(

SELECT 1

FROM host h

    JOIN grp_host gh ON h.id = gh.host_id

    JOIN grp_tpl gt ON gh.grp_id=gt.grp_id

WHERE h.hostname=#{endpoint} AND strategy.tpl_id = gt.tpl_id

    )

只是tpl之间存在父子模板替换,子模板可以按照metric+tags..替换父模板策略,最多十层,而且judge实例多的情况每分钟访问数据库压力较大,所以直接取hbs中的缓存,如上。

正文:

首先做了一个tpl_id=>{[]strategy}的索引,可以通过tpl_id找到对应的所有策略;

for host in HostTemplateIds: 遍历每个host的tpl,累加就可以了,重点就是如何找到host配置父子替换后的策略;

要找策略,首先要找到模板,因为模板存在继承关系,代码中构造了一个二维数组tpl_buckets := [][]int64{},存的是tpl_id,

借用代码中示例如下:

host_id => 

 |a |d |a |a |a |

 |   |   |b |b |f |

 |  |  |  |c |  |

  |  |  |  |  |  |

字母代表一个模板,每列代表组模板的继承关系,例a->b,a->b->c,a->f,所以只要获得无相同替换逻辑的模板组就可以了

host_id => |a |d |a |

                  |b |   |f  |

                  |c |   |   |

                  |   |   |   |

源码:

uniq_tpl_buckets := [][]int64{}

for i := 0; i < len(tpl_buckets); i++ {

var valid bool = true

for j := 0; j < len(tpl_buckets); j++ {

if i == j {//相同不比较,略过

continue

}

if slice_int_eq(tpl_buckets[i], tpl_buckets[j]) {

break//遍历两个组都相同,扔掉

}

if slice_int_lt(tpl_buckets[i], tpl_buckets[j]) {

valid = false

break//遍历两个组有包含,扔掉

}

}

if valid {

//独有的组

uniq_tpl_buckets = append(uniq_tpl_buckets, tpl_buckets[i])

}

}

简单来说就是一种冒泡原理,只是将两列数组之间的比较,最后得到独有的继承组,类似于最大公约数拆解

获取到独有的继承组后,遍历每个组,组中取到策略列表,利用metric/tags规则进行覆盖

替换策略中为最年轻的模板

最后累加所有host的策略, 存数组 []HostStrategyHostStrategy{host,[]*strategies}

over.

上一篇下一篇

猜你喜欢

热点阅读