nginx google 微软 wordpress php mysql java Android apache linux shell 编程 开源 程序员 Firefox 云计算 Python Windows centos Ubuntu

【開源】Tsar——靈活的系統和應用采集軟件

在開源人的盛會LinuxCon + ContainerCon + CloudOpen中國(簡稱LC3)大會上,阿裏雲CDN團隊的空見(花名),為大家分享了開源的系統和應用采集軟件Tsar的背景、設計思路和用法、模塊開發以及未來規劃。

實際上它是阿裏巴巴在做系統或應用監控時候的一個idea,團隊同學在實際的使用過程中比較舒服,軟件擴展性、穩定性、易用性也比較好,所以目前在所有機器上都有部署,作為基礎監控agent,來提供穩定的數據支持,同時也對外開源。

Tsar的背景

對於線上SA/PE/研發來說,當他開發了一個軟件並部署之後,需要關註軟件的運行情況,需要到上面來看整個服務器的CPU/內存/網絡/IO等基本的指標是否OK,針對這些指標找一些軟件的瓶頸和針對性的優化。其實現在市面上類似的軟件非常多,所有的軟件都有一定的專用性,可能只是采集某一塊的東西,每個軟件采集的指標不同,這些指標時間的用法是不一致的。所以對於使用的人的要求非常高,需要知道所有的監控軟件怎樣使用,對於排查線上問題非常不方便。這也是我們最開始的痛點,我們發現所有的數據我們都有,但是怎樣去聯動和使用起來是不方便的事情。於是,我們就萌生了Tsar的想法。

image.png

下图是现在线上有的很多命令的使用,针对于整个Linux站里各个层级都有一些对应的命令,对于运维等使用人员的学习上手成本非常高,不利于我们统一做一些监控。
image.png

需求與解法

所以我們最開始的需求就是希望有一個簡單易用,基礎數據齊全,最好也有應用數據的采集軟件。因為剛才列的都是通用指標,但是我們有應用軟件,所以我們希望知道應用軟件上的一些數據,比如QPS、響應時間。目前的開源軟件是無法支持的,需要業務自己寫采集工具,做數據收集和監控。

另外我們希望數據之間能做一些數據關聯,比如說當前CPU高了,是不是帶來了一些其他數據指標的波動,這些指標之間需要對照去看,才能確定問題出在哪。

同時,數據也要能過濾、實時離線查看,並且可以本地長時間保存,也能遠程發送,方便在中心做一些數據的分析和挖掘。

有了這些需求,我們的解法是模仿sar,Sar本身是系統活動報告,實現系統指標的采集,我們基於它做了一些擴展。Tsar除了做系統層面數據采集,還能做應用層面采集,還可以進行模塊化,並支持擴展。比如現在采集了十個指標,如果有另外有應用指標和業務數據想去采集,可以很方便的在Tsar裏去寫個模塊來采集。同時也支持簡單的報警和發送遠端。

設計和用法

Tsar的原理非常簡單,主要是用了動態庫的特性,我們每一個采集模塊裏面都會實現一些函數,比如采集函數、分析處理函數,還有註冊的時候提供的模塊的基本字段,比如模塊名、模塊包含的字段、字段從哪裏采集、采集完之後如何處理和輸出,這些函數註冊到Tsar的框架裏,每一個周期去采集的時候調用這些指令的函數,就可以完成整個數據的采集和輸出的過程。

整個模塊的註冊執行過程如下圖:

image.png

下图是Tsar功能性大图,最下面是系统计数器和软件接口,具体的每一个模块是参考Sar实现了很多系统指标的采集,另外对于应用软件也提供了LVS、Nginx等比较常见的应用软件模块。
image.png

在上面采集過程中,會對模塊做一些過濾處理,具體執行每個模塊的采集函數,拿到這些數據,按照格式化,框架會把數據做格式化,存到/var/log/tsar.data中。我們采集到所有的原始數據,是以文件的形式存儲在上面的,這裏有一個跟Sar的區別,Tsar裏面的字段是可讀的,Sar是無法看到這裏面的含義的。

這些數據采集到之後,支持對遠端的發送,比如發送到一個網絡的接口上,或者發送到mysql、Nagios等。另外,數據的展現分兩塊,分為實時的展現和歷史的展現,實時的展現就需要隔一秒看下指標是什麽樣子的,歷史的展現是對過去的每一分鐘數據做一下歷史的回放。目前,Tsar支持秒級、分鐘級、按天等不同維度的數據展現。

Tsar的用法

Tsar用法是比較簡單的,不管哪種模塊,都是共享這個用法的。上面最常見的就是check這個指令,就是把系統最近一次的監控指標輸出出來。有了這個功能之後,所有的基礎軟件的采集基本上每分鐘都可以調用一個check,拿到最近一分鐘的監控數據,把這份數據拿到我們監控平臺上,裏面去做一些監控配置和中心化處理。這個指令是用的最為頻繁的。

image.png

-c是一個定時執行的指令,通過這個方式,會把你當前開啟的模塊所有的采集函數都執行一遍,拿到數據,把數據存到tsar.data的原始文件裏去,供以後使用。
-i就是指定一個間隔時間,多少秒或多少分鐘。

下圖是一些用法的截圖,在實時模式下可以指定-l 或者--live,可以現場采集模塊數據,實時分析結果,不指定默認是離線方式。時間間隔,-i不指定的話,默認是秒和分鐘,實時是每秒采集顯示,離線是每分鐘顯示。也可以指定模塊, --mod_name,指定了幾個模塊,就展示幾個指標。通過這種方式,可以把你關註的指標在一屏裏顯示出來,這樣可以看到他們之間的影響和關系,從而找到問題的癥結所在。

image.png

Tsar也支持多item模块,有的时候一个系统指标是有多个实例的,item概念就在这里体现,可以比较灵活的展示数据。另外,--check是看我们最后一分钟的数据,它会把最后一分钟每个指标和字段在这一行里展示出来,可以很方便的做一些监控处理。
image.png

本身Tsar是单机软件,可以给其他系统提供丰富的数据源输入。

下图是比较常见的配置,包括配置文件、指定模块、指定输出等。
image.png

下图是如何输出到Mysql和Nagios的配置办法。

image.png

定制开发

Tsar目前支持C,bash、Lua三种方式开发自定义模块,内部已经有近100个应用模块。模块组成包括模块名称、描述信息、采集函数、展现函数等,Tsar本身也可以利用tsardevel的脚本自动生成一个模板,在这个模版的基础上进行修改,比较高效。

image.png

具体模块开发内容如下图:

image.png

采集函数是对value_1/2/3进行具体的抓取,不管是去计数器文件,还是接口里,都可以把值拿到。但是拿到的值并不是最终要展现的值,而是瞬间的值。

image.png

展現的值要通過數據展現函數來進行處理運算,展現函數裏的兩個輸入參數會告訴你,你采集的最近2個數組的數據是什麽,通過對2個數組的運算,最後得出來的結果就是最終展現的數字。當前面幾個內容都做好了之後,最後在模塊裏做一下註冊函數的生成就好了,這裏有幾個關鍵信息,比如模塊名稱。使用方式、模塊字段數據結構、字段個數、采集函數和展現函數。

image.png

至此,一個模塊基本就完成了。

未來規劃

我們對Tsar的未來規劃,主要三個方面。

第一個是跨平臺,對於某些Linux版本支持的不是特別好,所以在跨平臺方面我們會多多嘗試。 
第二個完善框架,目前框架比較大的問題,單個模塊出現一些異常,整個采集就會掛掉,這塊我們會去解耦一些模塊和框架的強依賴關系,希望容災性更好。
第三是豐富一些模塊,常見的系統模塊已經很多,內部的應用模塊也比較豐富了,我們也希望開源這塊大家可以多提供一些模塊進來,能讓我們支持的采集種類更豐富一些。

目前在阿裏巴巴整個開源代碼庫裏,外部的貢獻者不多,十幾個,內部有超過一百人在貢獻代碼,首頁和代碼庫歡迎大家訪問。有任何問題也可以聯系本文分享者:空見。

image.png

延伸阅读

评论