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
相關文章
相關標籤/搜索