zoukankan      html  css  js  c++  java
  • 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中,是所有监控数据的产生源头。

    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
     
     
     
  • 相关阅读:
    团队项目-第一阶段冲刺7
    团队项目-第一阶段冲刺6
    Spring Boot 揭秘与实战(七) 实用技术篇
    Spring Boot 揭秘与实战(七) 实用技术篇
    Spring Boot 揭秘与实战(六) 消息队列篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(五) 服务器篇
    Spring Boot 揭秘与实战(四) 配置文件篇
  • 原文地址:https://www.cnblogs.com/bingabcd/p/7749533.html
Copyright © 2011-2022 走看看