openfalcon源码分析之agent

本节内容

  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中,是全部监控数据的产生源头。node

1.1 agent上报数据

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

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

1.2 agent与HBS同步

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

  • HostName
  • IP(cfg中若是配置了,优先cfg中,不然本身获取本机IP上报)
  • agent版本
  • plugin版本 脚本所在git目录的版本,git rev-parse HEAD)

HBS获取的数据:git

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

1.3 agent Http服务

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

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

2. agent源码分析

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

2.1 初始化config配置

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

{
    "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中。sql

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服务提供的路由接口代码以下:shell

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
相关文章
相关标签/搜索