openfalcon源码分析之hbs

本节内容

  1. hbs功能
  2. hbs源码分析
  3. hbs设计优劣

1. hbs功能

hbs在整个open-falcon项目中承担的角色就是连接数据库,作为数据库缓存,缓存配置,主要给agent和judge提供服务。

2. hbs源码分析

hbs源码分析将列出其对外提供的rpc服务以及其缓存的数据,并在最后尝试阐述其最重要的两个rpc服务GetExpressions和GetStrategies的执行过程。

对外提供服务

hbs对外提供服务的方式有RPC和http,主要使用的是其rpc服务,其对外提供服务的rpc接口列表如下:

接口名 提供对象 提供服务
MinePlugins agent 通过agent提供的hostname获取其对应的主机组列表,再找到对应plugin list返回
ReportStatus agent 获取agent的信息缓存并插入或更新到数据库中的host中(hostname, ip, agent_version, plugin_version)
TrustableIps agent 如果配置文件中配置了信任IP,则把信任IP列表发给agent
BuiltinMetrics agent 通过agent的hostname获取其对应的主机组列表,并找到templat list,从strategy表中筛选出('net.port.listen', 'proc.num', 'du.bs', 'url.check.health')这些metric的metric和tags
GetExpressions judge 返回数据库中所有生效的Expressions
GetStrategies judge 获取所有的strategys并按照hostname:strategys的方式组织数据返回

缓存数据

hbs启动了一个定时任务,每间隔一分钟去数据库读取数据并缓存起来。下表是其缓存的数据列表:

缓存名称 含义 执行sql
GroupPlugins 缓存所有的plugins路径 select grp_id, dir from plugin_dir
GroupTemplates 缓存主机组和模板对应关系 select grp_id, tpl_id from grp_tpl
HostGroupsMap 缓存主机和主机组对应关系 select grp_id, host_id from grp_host
HostMap 缓存所有主机 select id, hostname from host
TemplateCache 缓存所有模板 select id, tpl_name, parent_id, action_id, create_user from tpl
Strategies 缓存所有strategys "select %s from strategy as s where (s.run_begin='' and s.run_end='') or (s.run_begin <= '%s' and s.run_end > '%s')","s.id, s.metric, s.tags, s.func, s.op, s.right_value, s.max_step, s.priority, s.note, s.tpl_id",now,now
HostTemplateIds 缓存主机与模板对应关系 select a.tpl_id, b.host_id from grp_tpl as a inner join grp_host as b on a.grp_id=b.grp_id
ExpressionCache 缓存所有正常的Expression select id, expression, func, op, right_value, max_step, priority, note, action_id from expression where action_id>0 and pause=0
MonitoredHosts 缓存所有不处于维护状态的主机 "select id, hostname from host where maintain_begin > %d or maintain_end < %d", now, now

rpc调用GetExpressions过程

  • GetExpressions服务调用cache.ExpressionCache.Get()方法获取缓存中存储的所有Expression

rpc调用GetStrategies过程

  • GetStrategies服务先调用cache.HostTemplateIds.GetMap()方法获取每个主机id对应的所有template id,再调用cache.MonitoredHosts.Get()方法获取不处于维护状态的主机名与id列表。调用cache.TemplateCache.GetMap()方法获取所有的模板,调用cache.Strategies.GetMap()获取所有的strategies。调用Tpl2Strategies(strategies)对tpl_id和strategies做了一个字典映射,这样通过tpl_id就能找到对应的所有strategies。循环每台主机,调用CalcInheritStrategies方法获取每台主机对应的strategies,再将主机名和对应的strategies组合成一个结构体,将所有这些结构体组合在hostStrategies中返回给judge。

    • Tpl2Strategies方法循环strategies,将tplid作为key,valuestrategies组成的array,返回给调用者,目的是可以直接通过tplid找到对应的所有strategies
    • CalcInheritStrategies方法首先遍历主机对应的模板列表,对每个模板都寻找其父模板,生成一个模板bucket,这样,就使得原先的每个模板都变成了一个模板列表。
    • 遍历新的模板列表,过滤掉有包含关系的模板bucket,生成uniq_tpl_buckets
    • 循环uniq_tpl_buckets,找到所有的strategies,并用子模板的strategies覆盖父模板相同的strategies
    • 最后返回该主机对应的完整的strategies

3. hbs设计优劣

优点:

  1. hbs作为数据库缓存层,缓存了数据库中关于监控的配置,所有的agent和judge都直接来hbs中读取数据,减轻了数据库的压力。
  2. hbs接收agent上报过来的信息,并实时写入数据库中,可以立即自动发现安装了agent的机器,功能很不错。

缺点:

  1. 获取所有的strategys功能代码太复杂,建议优化的更简洁。
 
 
 

openfalcon源码分析之hbs的更多相关文章

  1. openfalcon源码分析之Judge

    openfalcon源码分析之Judge 本节内容 Judge功能 源码分析 设计优缺点 1. Judge功能 在open-falcon中,Judge模块的功能是通过从HBS上同步告警的strateg ...

  2. openfalcon源码分析之graph

    openfalcon源码分析之graph 本节内容 graph功能 graph源码分析 2.1 graph中重要的数据结构 2.2 graph的简要流程图 2.3 graph处理数据过程 2.4 gr ...

  3. openfalcon源码分析之agent

    本节内容 agent功能 1.1 agent上报数据 1.2 agent与HBS同步 1.3 agent Http服务 agent源码分析 2.1 初始化config配置 2.2 初始化根目录,本地I ...

  4. openfalcon源码分析之transfer

    本节内容 transfer功能 transfer接收数据来源 transfer数据去向 transfer的一致性hash transfer的一致性hash key的计算 transfer源码分析 2. ...

  5. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  6. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  7. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  8. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  9. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

随机推荐

  1. loki之内存池SmallObj[原创]

    loki库之内存池SmallObj 介绍 loki库的内存池实现主要在文件smallobj中,顾名思义它的优势主要在小对象的分配与释放上,loki库是基于策略的方法实现的,简单的说就是把某个类通过模板 ...

  2. day12(jsp指令&内置对象&动作标签、JavaBean、EL表达式&函数库)

    day12 JSP指令 JSP指令概述 JSP指令的格式:<%@指令名 attr1="" attr2="" %>,一般都会把JSP指令放到JSP文件 ...

  3. linux route命令的使用详解 添加永久静态路由 tracert traceroute

    linux route命令的使用详解 添加永久静态路由  tracert  traceroute route -n    Linuxroute  print  Windows traceroute  ...

  4. php计算中英文混合或中文字符串的字数

    转载来源链接: http://blog.csdn.net/hueise_h/article/details/22920937 php的strlen和mb_strlen用于统计字符个数.中英文混合的字符 ...

  5. [golang note] 工程组织

    golang项目目录结构 <golang_proj> ├─README                 ├─AUTHORS                 ├─<bin>    ...

  6. 记录:EPALN Electric P8 2.4.4.8366 安装记录

    系统:win7  32位 旗舰版.  (原版系统 非GHOST) 第一步:解压安装. setup.exe 右击 选择 注意:把  360  百度 杀毒之类的全部关闭 第二步: 第三步: 第四步: 第五 ...

  7. 常微分方程初值问题:单步方法 [MATLAB]

    #先上代码后补笔记# #可以直接复制粘贴调用的MATLAB函数代码!# 1. 朗格-库塔(Runge-Kutta)方法族 目前只实现了四阶Runge-Kutta方法. function [ YMat ...

  8. html编码常见的有utf-8和gb2312编码等,应该如何判断选择?

    html如何选择编码,常见utf-8和gb2312编码如何判断选择 一.首先了解目前国内中文网页常用编码是utf-8 还是gb2313. 比如: 百度搜索 网页使用utf-8 腾讯新闻 网页使用utf ...

  9. 服务器相关 HTTP 请求错误

    HTTP 400 - 请求无效 HTTP 401.1 - 未授权:登录失败 HTTP 401.2 - 未授权:服务器配置问题导致登录失败 HTTP 401.3 - ACL 禁止访问资源 HTTP 40 ...

  10. 2018-2019 Всероссийская командная олимпиада школьников по программированию, интернет-тур + отборы регионов (ВКОШП 18, интернет-тур) Solution

    A: 水. #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll INFLL = 0x3f ...