簡介
觀測云采集器,是一款開源、一體式的數(shù)據(jù)采集 Agent,它提供全平臺操作系統(tǒng)支持,擁有全面數(shù)據(jù)采集能力,涵蓋基礎(chǔ)設(shè)施、指標(biāo)、日志、應(yīng)用性能、用戶訪問以及安全巡檢等各種場景。通過 eBPF 技術(shù)的引入,觀測云采集器實踐了網(wǎng)絡(luò)傳輸層和應(yīng)用層的部分協(xié)議的可觀測。
采集器架構(gòu)
——采集管理:配置加載模塊用于配置動態(tài)管理與采集插件的開啟關(guān)閉;監(jiān)視器模塊用于查看采集器資源使用、采集插件開啟、數(shù)據(jù)處理器腳本工作狀況、采集器外部數(shù)據(jù)接入API 的響應(yīng)與延遲信息等
——數(shù)據(jù)采集:采集器不僅可以通過內(nèi)置插件進(jìn)行數(shù)據(jù)采集,還能接入外部數(shù)據(jù)源,如云原生計算基金會下的可觀測項目 OTEL 的鏈路、指標(biāo)數(shù)據(jù)等
——數(shù)據(jù)清洗:在采集插件生成數(shù)據(jù)后和數(shù)據(jù)上傳之間的數(shù)據(jù)清洗層,用戶可以通過編程介入,如使用可編程數(shù)據(jù)處理器的語言編寫腳本修改 Point ,使用內(nèi)置函數(shù)分析提取網(wǎng)絡(luò)數(shù)據(jù)中 IP 歸屬的城市、省份和國家到 Point 中;腳本支持動態(tài)加載和卸載
——數(shù)據(jù)上傳:采集器對各種數(shù)據(jù)進(jìn)行分類上傳,類別有日志、指標(biāo)、鏈路、網(wǎng)絡(luò)等,所有類別的數(shù)據(jù)均使用 Point 結(jié)構(gòu)封裝,每一個 Point 代表一條數(shù)據(jù),大致由四個部分:名字、 標(biāo)簽字典、字段字典以及時間戳構(gòu)成 (其名字可以是指標(biāo)名 cpu, 日志來源 nginx ,網(wǎng)絡(luò)的 httpflow等)

eBPF 技術(shù)應(yīng)用
觀測云采集器使用了三種類型的 eBPF 程序:socket filter、kprobe、uprobe,能夠抓取以太網(wǎng)幀、跟蹤與 socket 和 TCP/IP 協(xié)議棧相關(guān)的內(nèi)核函數(shù)以及用戶共享庫函數(shù),實現(xiàn)網(wǎng)絡(luò)協(xié)議可觀測。下圖介紹觀測云采集器如何實踐 eBPF 技術(shù)進(jìn)行主機(jī)上的網(wǎng)絡(luò)觀測。

數(shù)據(jù)采集
觀測云采集器的 eBPF 網(wǎng)絡(luò)觀測功能采集并生成了三個數(shù)據(jù)集,分別為 netflow, dnsflow 和 httpflow,其 tag 基本相同,以下是其 tag 名與描述。

傳輸層網(wǎng)絡(luò)觀測
——采集器使用 kprobe 類型 eBPF 程序獲取部分內(nèi)核函數(shù)的輸入與返回值
——通過 inetbind(6) 函數(shù)判斷 srcip + src_port 是否為服務(wù)端
——通過協(xié)議棧 tcp\udp 以及 ip 相關(guān)的內(nèi)核函數(shù),獲取服務(wù)與客戶端之間的流量大小以及 TCP 協(xié)議的連接的建立與關(guān)閉次數(shù)、重傳和 RTT 信息

應(yīng)用層網(wǎng)絡(luò)觀測
采集器使用 AF_PACKET + BPF 在采集器上分析 DNS 請求,以支持 CentOS(RedHat)7.6 (其不支持 socket filter 類型 eBPF 程序),記錄請求信息支持 netflow 進(jìn)行域名反向解析;
對于 HTTP 請求使用 socket filter 和 uprobe 類型 eBPF 程序?qū)崿F(xiàn) HTTP(S) 請求分析。
下面的為采集 dns 協(xié)議生成的字段 和 http 協(xié)議生成字段。


用戶地理分布及 TCP 時延
通過內(nèi)置數(shù)據(jù)處理器編寫腳本,來解析 ip 并獲取 ip 歸屬的省份、國家等信息作為標(biāo)簽追加到生成的 Point 上,并在觀測云前端創(chuàng)建儀表板。下圖通過世界地圖和中國地圖展示 netflow 中客戶端 ip 的地理分布和服務(wù)端之間的 tcp 時延。

主機(jī)間四層網(wǎng)絡(luò)拓?fù)?/b>
下圖為當(dāng)前工作空間內(nèi)部署了觀測云采集器并開啟了 eBPF 網(wǎng)絡(luò)采集器的主機(jī)間的網(wǎng)絡(luò)拓?fù)鋱D,圖上我們可以看到主機(jī)間的數(shù)據(jù)發(fā)送與接受的字節(jié)數(shù)和網(wǎng)絡(luò)波動等信息。

K8s Pod 間網(wǎng)絡(luò)拓?fù)?/b>
當(dāng) eBPF 采集插件獲取到 K8S 的 ip 和端口信息后將自動追加到生成的數(shù)據(jù)上,通過觀測云前端構(gòu)建不同的網(wǎng)絡(luò)拓?fù)鋱D,下圖是構(gòu)建的 Pod 網(wǎng)絡(luò)拓?fù)潢P(guān)系圖。

K8s Deployment 間網(wǎng)絡(luò)拓?fù)?/b>
下圖是構(gòu)建的 Deployment 網(wǎng)絡(luò)拓?fù)潢P(guān)系圖,從圖中可以看到 nginx deployment 上的 HTTP 協(xié)議的每秒請求數(shù)和請求錯誤率。
