open-falcon hbs学习
关于心跳服务:
每个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.