• 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
     
     
     
  • 相关阅读:
    JDK1.7签名APK异常
    tomcat设置虚拟目录
    java runtime.exec() 的讲解(转贴)
    linux 下 .sh 文件语法
    Maven基础-配置远程仓库
    jdk工具keytool和jarsigner帮助Part2(jdk keytool&jarsigner tool manual)
    jdk工具keytool和jarsigner帮助Part1(jdk keytool&jarsigner tool manual)
    spring mvc + freemarker 引入静态文件(css,img,js)
    FilterDispatcher 的作用
    Struts2 过滤器与拦截器
  • 原文地址:https://www.cnblogs.com/bingabcd/p/7749533.html
Copyright © 2020-2023  润新知