本节内容

  1. agent功能

    • 1.1 agent上报数据
    • 1.2 agent与HBS同步
    • 1.3 agent Http服务
  2. agent源码分析
    • 2.1 初始化config配置
    • 2.2 初始化根目录,本地IP和rpc连接池 big mapper
    • 2.3 定时同步各种数据
    • 2.4 HTTP服务
  3. agent设计优缺点
    • 优点:

1. agent功能

agent的目的是收集目标机器上的所有数据,并动态同步hbs中的配置信息,将数据上报到transfer中,是所有监控数据的产生源头。

1.1 agent上报数据

agent上报的数据主要分为三类:

  1. 内置采集数据

    • 内置采集数据是agent启动就会自动采集的一些数据,包括服务器的cpu,内存,硬盘等一些数据
  2. plugin采集数据
    • plugin采集数据是定期的去执行一些脚本,捕捉脚本打印出来的数据解析成特定的数据之后发送到transfer。
  3. 第三方采集数据
    • 第三方采集数据,是agent提供的http服务,其他服务采集的数据按照一定格式通过http协议发送到agent,代为帮转发到transfer中。

1.2 agent与HBS同步

agent起了一个定时任务,定时与HBS同步一些信息,获取一些动态数据以及上报自己的状态信息。默认上报时间间隔是一分钟。
上报给HBS的数据:

  • HostName
  • IP(cfg中如果配置了,优先cfg中,否则自己获取本机IP上报)
  • agent版本
  • plugin版本 脚本所在git目录的版本,git rev-parse HEAD)

HBS获取的数据:

  • Plugin信息,需要以什么频率运行什么脚本
  • 内置采集信息
    • URL_CHECK_HEALTH,需要定期检查哪些URL
    • NET_PORT_LISTEN,需要检查哪些端口的存活
    • DU_BS,需要检查哪些文件夹的占用空间
    • PROC_NUM,需要检查哪些进程的存活
  • 信任IP列表(执行远程命令时需要检查,基本不使用,该接口本来是开发时用来调试使用,可废弃)

1.3 agent Http服务

agent提供了HTTP服务,用于管理者检查agent服务是否正常,远程操作agent等。
主要提供的Http服务如下:

  • Admin命令:

    • 退出agent进程
    • 重载agent配置
    • agent进程工作目录
    • 信任IP列表
  • 当前采集的数据,包括cpu,内存,硬盘,内核,io等
  • plugin,使用git同步远端脚本到本地目录
  • push,接收其他服务上报过来的数据,转发给transfer
  • run,执行shell命令并返回结果,需要验证请求的IP是否是受信任IP
  • system,获取系统启动时间,当前时间,系统负载

2. agent源码分析

agent源码得分块分析,下面是各个块的源码分析:

2.1 初始化config配置

下面是agent的默认配置,已在下面源码中做了注释

{
"debug": true, // 开启debug模式
"hostname": "", // 定义主机名,如果没定义,则会去获取本机主机名
"ip": "", // 定义上报时的IP地址,若未配置则自动获取本机IP
"plugin": { // 关于插件的配置,配置插件目录,git地址等
"enabled": false,
"dir": "./plugin",
"git": "https://github.com/open-falcon/plugin.git",
"logs": "./logs"
},
"heartbeat": { // 配置HBS服务地址和同步数据周期,默认是60秒
"enabled": true,
"addr": "127.0.0.1:6030",
"interval": 60,
"timeout": 1000
},
"transfer": { // 配置transfer集群地址,以及同步数据周期,默认是60秒同步一次
"enabled": true,
"addrs": [
"127.0.0.1:8433",
"127.0.0.1:8433"
],
"interval": 60,
"timeout": 1000
},
"http": { // 配置http服务启动端口
"enabled": true,
"listen": ":1988",
"backdoor": false
},
"collector": { // 配置网卡名称开头,因为在linux物理机上,网卡名并不一定都是以eth开头
"ifacePrefix": ["eth", "em"],
"mountPoint": []
},
"default_tags": { // 设置默认tags
},
"ignore": { // 忽略的上报数据,有些内置的上报数据是用户不关心的,可以在这里配置不上报这些数据
"cpu.busy": true,
"df.bytes.free": true,
"df.bytes.total": true,
"df.bytes.used": true,
"df.bytes.used.percent": true,
"df.inodes.total": true,
"df.inodes.free": true,
"df.inodes.used": true,
"df.inodes.used.percent": true,
"mem.memtotal": true,
"mem.memused": true,
"mem.memused.percent": true,
"mem.memfree": true,
"mem.swaptotal": true,
"mem.swapused": true,
"mem.swapfree": true
}
}

2.2 初始化根目录,本地IPrpc连接池 big mapper

  • 初始化agent进程的根目录
  • 本地IP获取是通过连接尝试连接HBS获取本地连接HBS的网口的IP地址。
  • 初始化一个单一的RPC链接,为了和HBS通信。
  • 初始化一个大的列表,用来存储所有内置监控的历史数据

下面是创建的big mapper的源码,把各种需要获取的内置监控项的数据都存储在这个大列表中,等待发送到transfer中。


type FuncsAndInterval struct {
Fs []func() []*model.MetricValue
Interval int
}
var Mappers []FuncsAndInterval
func BuildMappers() {
interval := g.Config().Transfer.Interval
Mappers = []FuncsAndInterval{
{
Fs: []func() []*model.MetricValue{
AgentMetrics,
CpuMetrics,
NetMetrics,
KernelMetrics,
LoadAvgMetrics,
MemMetrics,
DiskIOMetrics,
IOStatsMetrics,
NetstatMetrics,
ProcMetrics,
UdpMetrics,
},
Interval: interval,
},
{
Fs: []func() []*model.MetricValue{
DeviceMetrics,
},
Interval: interval,
},
{
Fs: []func() []*model.MetricValue{
PortMetrics,
SocketStatSummaryMetrics,
},
Interval: interval,
},
{
Fs: []func() []*model.MetricValue{
DuMetrics,
},
Interval: interval,
},
{
Fs: []func() []*model.MetricValue{
UrlMetrics,
},
Interval: interval,
},
}
}

2.3 定时同步各种数据

  • cron.InitDataHistory方法每隔一秒钟同步一次CPU状态和disk list状态,只保留最近两次的数据。
  • cron.ReportAgentStatus方法每隔60秒向HBS上报自己的信息,数据包括:
    • Hostname,优先找cfg中的配置,如果为空,自己获取
    • IP,有先兆cfg中的配置,如果为空,自己获取
    • AgentVersion
    • PluginVersion
  • cron.SyncMinePlugins方法同步HBS中的MinePlugins,获取最新的plugins路径,再删除旧的路径添加新的路径
  • cron.SyncBuiltinMetrics方法同步HBS中的BuiltinMetrics,获取需要监控的ports,paths,procs,urls,并把这些组合成相应的metrics,插入到需要监控的metrics中
  • cron.SyncTrustableIps方法同步HBS中的TrustableIps,获取信任IP列表,在这个列表中的IP可以通过agent执行shell命令
  • cron.Collect方法默认每隔60将big mapper中的数据向transfer汇报一次,Endpoint是获取的hostname,若cfg中配置了则用cfg的配置,这时候会检查cfg中如果配置了default_tags,则会在上传每条数据之前,在其Tags中增加default_tags中的tags。注意,在cfg中如果配置了多个transfer地址,则每份数据都会发给所有的transfer节点。

2.4 HTTP服务

Http服务提供的路由接口代码如下:

func init() {
configAdminRoutes()
configCpuRoutes()
configDfRoutes()
configHealthRoutes()
configIoStatRoutes()
configKernelRoutes()
configMemoryRoutes()
configPageRoutes()
configPluginRoutes()
configPushRoutes()
configRunRoutes()
configSystemRoutes()
}
  • configAdminRoutes提供如下api:

    • "/exit"退出agentJ进程
    • "/config/reload"重载agent的配置
    • "/workdir"获取agent的工作根目录
    • "/ips"获取受信任IP列表
  • configCpuRoutes获取CPU相关的状态信息
  • configDfRoutes获取挂载磁盘容量使用信息
  • configHealthRoutes检查agent是否存活以及版本信息
  • configIoStatRoutes获取磁盘IO状态信息
  • configKernelRoutes获取内核信息
  • configMemoryRoutes获取内存信息
  • configPageRoutes获取页面展示当前主机的监控信息
  • configPluginRoutes可查看、更新plugins列表,从git同步plugins到指定目录
  • configPushRoutes通过"/v1/push"接口可以将其他服务收集的数据push到agent中转发给transfer
  • configRunRoutes执行shell命令并返回给客户,需要验证客户IP地址是否是受信任IP
  • configSystemRoutes获取一些系统当前时间,启动信息等数据

3. agent设计优缺点

优点:

  1. 支持Http接收其他服务发过来的数据,这样就可以实现一些非本主机上的数据监控,比如向腾讯云,阿里云购买的redis,mysql等服务,无法部署agent,可以通过这种方式上报监控信息
  2. 支持plugins,并支持从git同步plugins,能够快速的将plugins下发到所有被监控主机,实现了自动化下发plugins
 
 
 

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

  1. openfalcon源码分析之hbs

    openfalcon源码分析之hbs 本节内容 hbs功能 hbs源码分析 hbs设计优劣 1. hbs功能 hbs在整个open-falcon项目中承担的角色就是连接数据库,作为数据库缓存,缓存配置 ...

  2. openfalcon源码分析之graph

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

  3. openfalcon源码分析之Judge

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

  4. openfalcon源码分析之transfer

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

  5. Skywalking光会用可不行,必须的源码分析分析 - Skywalking Agent &插件解析

    3 Skywalking源码导入 接上文,已经学习了Skywalking的应用,接下来我们将剖析Skywalking源码,深度学习Skywalking Agent. 3.1 源码环境搭建 当前最新版本 ...

  6. Tomcat源码分析

    前言: 本文是我阅读了TOMCAT源码后的一些心得. 主要是讲解TOMCAT的系统框架, 以及启动流程.若有错漏之处,敬请批评指教! 建议: 毕竟TOMCAT的框架还是比较复杂的, 单是从文字上理解, ...

  7. angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)

    昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...

  8. Openrasp源码分析

    Openrasp是百度关于rasp技术的开源项目,由于工作需要,之前对rasp的源码进行了简单的分析.文章是之前就写好的,现在放出了,希望对大家有写帮助. OpenRASP中java引擎的源码分析 安 ...

  9. 开源网站流量统计系统Piwik源码分析——参数统计(一)

    Piwik现已改名为Matomo,这是一套国外著名的开源网站统计系统,类似于百度统计.Google Analytics等系统.最大的区别就是可以看到其中的源码,这正合我意.因为我一直对统计的系统很好奇 ...

随机推荐

  1. 【Loadrunner】性能测试:通过服务器日志获取性能需求

    性能测试:通过服务器日志获取性能需求          接触过性能测试的童鞋都知道,想要做好一个项目的性能测试,性能需求的获取至关重要~!如果公司有做过性能测试还好,大家可以拿之前的性能测试数据作为参 ...

  2. Django—Form两种保留用户提交数据的方法

    用户在网页上进行表单填写时,有可能出现某项填写错误.一般情况下,用户在未发觉错误的情况下点击提交,则此表单的内容会清空,用户不得不再重新填写,这样的用户体验是及其糟糕的. 在此,我们有2种方法将用户的 ...

  3. 跟我学Makefile(二)

    命令出错: 每当命令运行完后, make 会检测每个命令的返回码,如果命令返回成功,那么 make 会执行下一条命令. 如果一个规则中的某个命令出错了(命令退出码非零),那么 make 就会终止执行当 ...

  4. MySQL基础语句【学习笔记】

    放在这里,以备后查. 1. 数据库, 数据库服务器, 数据库语言 数据库,是持久性数据的集合,供给定企业的应用程序系统使用,并且由一个数据库管理系统来管理: 数据库服务器,又称数据库管理系统,用来管理 ...

  5. 对Spring Bean了解一二

    这之前从未听说过Spring Bean,今天因为学习的<Java核心36讲>其中一篇涉及到了这个内容,因自己基础薄弱,杨晓峰老师讲的内容需要一定的基础才能看懂,故在网上搜罗一些我能理解的关 ...

  6. poj3071 Football(概率dp)

    poj3071 Football 题意:有2^n支球队比赛,每次和相邻的球队踢,两两淘汰,给定任意两支球队相互踢赢的概率,求最后哪只球队最可能夺冠. 我们可以十分显然(大雾)地列出转移方程(设$f[ ...

  7. CPA定律——一致性,可用性和分区容错性

    按照美国著名科学家 Eric Brewer 在 2000 年提出的理论,当技术架构从集中式架构向分布式架构演进,会遇到 “CAP 定律”的瓶颈. CAP 说明一个数据处理系统不能同时满足一致性,可用性 ...

  8. 内核加载模块时提示usb_common: exports duplicate symbol of_usb_get_dr_mode

    1.分析: 既然符号重复了,那么说明有一个部分既被编译到内核中也被编译成模块了,因此在加载模块时,内核报符号重复的提示 2.解决 直接配置内核的某一部分编译成模块,例如笔者就直接将USB这一部分编译成 ...

  9. ImportError: cannot import name 'izip & TypeError: 'float' object cannot be interpreted as an integer

    ImportError: cannot import name 'izip' 参考:https://codereview.stackexchange.com/questions/26271/impor ...

  10. BZOJ 1853: [Scoi2010]幸运数字(容斥原理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1853 题意: 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运 ...