美文网首页
open-falcon hbs学习

open-falcon hbs学习

作者: 一盆饭 | 来源:发表于2018-04-12 16:04 被阅读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.

    相关文章

      网友评论

          本文标题:open-falcon hbs学习

          本文链接:https://www.haomeiwen.com/subject/lyffkftx.html