【干貨】解密監(jiān)控寶Docker監(jiān)控實(shí)現(xiàn)原理
分享人高馳濤(Neeke),云智慧高級(jí)架構(gòu)師,PHP 開發(fā)組成員,同時(shí)也是 PECL/SeasLog 的作者。8 年研發(fā)管理經(jīng)驗(yàn),早期從事大規(guī)模企業(yè)信息化研發(fā)架構(gòu),09 年涉足互聯(lián)網(wǎng)數(shù)字營(yíng)銷領(lǐng)域并深入研究架構(gòu)與性能優(yōu)化。2014 年加入云智慧,致力于 APM 產(chǎn)品的架構(gòu)與研發(fā)。崇尚敏捷,高效,GettingReal。
2015年9月,企業(yè)級(jí)應(yīng)用性能監(jiān)控和管理服務(wù)商云智慧正式上線了Docker監(jiān)控功能,能夠?qū)崟r(shí)監(jiān)控Docker容器的CPU、內(nèi)存、網(wǎng)絡(luò)流量及Swap狀態(tài),讓開發(fā)者和運(yùn)維人員在使用Docker時(shí)清晰掌握其資源消耗狀況。

作為國(guó)內(nèi)首家實(shí)現(xiàn)Docker監(jiān)控的SaaS廠商,監(jiān)控寶Docker監(jiān)控的技術(shù)原理是什么?相對(duì)國(guó)外的Docker監(jiān)控產(chǎn)品有何優(yōu)勢(shì)?以下是此次分享的實(shí)錄,請(qǐng)聽Neeke細(xì)說端詳:
1、Docker監(jiān)控概況
在云時(shí)代,仍有大量物理機(jī)直接支持服務(wù),相較于虛擬技術(shù)來(lái)講,這種方式已經(jīng)落伍很多,于是各種開源容器技術(shù)大大推進(jìn)了虛擬化技術(shù)的發(fā)展。
Docker容器相較于其他容器技術(shù)來(lái)講,是比較新的,而且發(fā)展最為迅速。原因不用多說,背后有老大哥谷歌撐腰。國(guó)內(nèi)也已經(jīng)興起了幾個(gè)以Docker為核心技術(shù)的創(chuàng)業(yè)公司,比如云智慧的合作伙伴數(shù)人、DaoCloud,都是前景非常贊的公司。
雖然這么火熱,但關(guān)于Docker的運(yùn)維一直是個(gè)痛點(diǎn)。
可以說,目前全球只有兩家APM廠商提供了基于SaaS的Docker運(yùn)維監(jiān)控,其一是美國(guó)APM廠商N(yùn)ew Relic,他們?cè)?月下旬正式發(fā)布了Docker監(jiān)控;另一家,則是中國(guó)APM廠商云智慧CloudWise,在繼New Relic之后的9月7日,發(fā)布上線了Docker監(jiān)控。從某種意義上講,CloudWise填補(bǔ)了國(guó)內(nèi)Docker監(jiān)控的SaaS服務(wù)空白。
2、Docker監(jiān)控的工作原理
大家都知道,CloudWise在APM領(lǐng)域率先提出了端到端的一體化監(jiān)控模型,并且在此模型上,發(fā)布了技術(shù)領(lǐng)先、便于部署和管理的SmartAgent軟件架構(gòu)。此次Docker監(jiān)控的實(shí)現(xiàn),也是基于SmartAgent的架構(gòu)來(lái)完成的。
SmartAgent以部署的快捷高效和智能化見長(zhǎng),整個(gè)部署過程中,用戶在兩分鐘內(nèi)便可完成。部署分為兩部,首先下載、解壓、啟動(dòng)數(shù)據(jù)發(fā)送代理SendProxy。SendProxy的作用是提供一個(gè)高效的本地?cái)?shù)據(jù)接收隊(duì)列與數(shù)據(jù)發(fā)送引擎,并且可以在局域網(wǎng)內(nèi)進(jìn)行分布式部署,使得不能上網(wǎng)的機(jī)器監(jiān)控也可正常地通過SendProxy高效地傳輸?shù)皆浦腔鄣腟aaS平臺(tái)。其次,下載、解壓、啟動(dòng)DockerAgent。
DockerAgent使用Python進(jìn)行開發(fā)并完成編譯,目前支持Ubuntu和CentOS。DockerAgent遵循了SmartAgent的插件規(guī)范,所以,無(wú)論監(jiān)控寶或透視寶用戶,都可以直接使用。
DockerAgent有三個(gè)線程,分別是:DockerProcess \ DockerConfig \ DockerPing,以及一個(gè)對(duì)象Task。三個(gè)線程各司其職,同時(shí)受Task對(duì)象控制。Task中核心屬性是任務(wù)惟一標(biāo)識(shí)、任務(wù)狀態(tài)以及任務(wù)頻率。這些屬性由DockerConfig與ClouwWise云平臺(tái)定時(shí)同步。
當(dāng)任務(wù)狀態(tài)正常時(shí),DockerProcess線程開始采集數(shù)據(jù),并遵守頻率規(guī)范。DockerPing負(fù)責(zé)心跳檢測(cè),定時(shí)產(chǎn)生心跳數(shù)據(jù)。這些數(shù)據(jù),都由DockerAgent交由SendProxy,并由SendProxy存儲(chǔ)進(jìn)入隊(duì)列,并異步地推送至CloudWise云平臺(tái)。
前面聊到DockerAgent插件遵守了SmartAgent的插件規(guī)范,所以它像其他插件一樣,包含了 bin 、conf、lib、log等目錄,并存在一個(gè)啟動(dòng)腳本。該腳本提供了start 、stop、status等命令。
以上是DockerAgent的介紹,后續(xù)SmartAgent的架構(gòu)與插件規(guī)范將會(huì)陸續(xù)開源發(fā)布,屆時(shí)熱衷開源與監(jiān)控的同學(xué),都可以直接參與進(jìn)來(lái)。3、DockerAgent數(shù)據(jù)采集原理
下面我們聊一下DockerAgent采集數(shù)據(jù)的原理。DockerAgent首先會(huì)使用docker info命令來(lái)獲取docker系統(tǒng)信息,這些信息包含了非常有用的數(shù)據(jù),如: Containers, Images, Name, CPUs, Data Space Used, Data Space Total, Total Memory。
這些數(shù)據(jù)看似簡(jiǎn)單基礎(chǔ),但卻可以解脫掉Docker運(yùn)維同學(xué)每天重復(fù)N次的工作。其次會(huì)使用docker version來(lái)檢測(cè)docker版本,目前我們的DockerAgent僅支持1.15以上的Docker版本。

然后,使用dockerps命令來(lái)取得容器的運(yùn)行信息和容器id,容器name,此時(shí)便可獲知在此臺(tái)機(jī)器上正在運(yùn)行的docker容器都有哪些。
最后,依次取得這些docker容器的性能指標(biāo)。取得性能指標(biāo)的方式,有部分使用docker原生接口,有部分是運(yùn)行云智慧自己的算法。其中包含容器與主機(jī)的系統(tǒng)時(shí)區(qū)/時(shí)間;容器的cpu使用率(通過cgroup/cpuacct內(nèi)該容器的cpuacct.stat取得);容器的ip;容器內(nèi)運(yùn)行的進(jìn)程數(shù);容器的內(nèi)存指標(biāo),rss\cache\memory_limit\total_cwop等(通過cgroup/memory內(nèi)該容器的 memory.stat取得);容器的網(wǎng)絡(luò)指標(biāo)(通過ifconfig/ statistics取得)。DockerAgent發(fā)布上線以后,在當(dāng)天就接到了非常多熱心用戶的反饋。很多反饋非常好,我們也在積極地吸收和改進(jìn)。為大家解決真正頭疼的Docker運(yùn)維、監(jiān)控、管理問題。相信在很短的時(shí)間內(nèi),將迭代出更優(yōu)秀、更穩(wěn)定、更符合用戶預(yù)期的DockerAgent,以此不僅填補(bǔ)國(guó)內(nèi)的Docker監(jiān)控空白,更會(huì)真正成為眾多Docker用戶、企業(yè)的伙伴,為大家解決真正頭疼的Docker運(yùn)維、監(jiān)控問題。
問:咱們和datadog之類docker監(jiān)控有啥區(qū)別和優(yōu)勢(shì)?
答:DataDog的安裝部署太過繁瑣。當(dāng)時(shí)嘗試時(shí)用了一下午才跑出來(lái)數(shù)據(jù)。DataDog的圖表定義比較自由,這點(diǎn)是比較好的;而我們的 Docker監(jiān)控最大的優(yōu)勢(shì),就是零基礎(chǔ)部署。另外,DataDog太貴,好像一個(gè)Agent要接近100人民幣吧。目前CloudWise的 DockerAgent完全免費(fèi)。
問:剛才說 docherconfig 是定時(shí)與云平臺(tái)同步,同步的是docker process和docker ping采集到的數(shù)據(jù)嗎?
答:不是同步采集到的數(shù)據(jù),是同步配置。
問:我看講的是通過sendproxy異步到云平臺(tái)的啊,那么dockerconfing的作用是什么?
答:DockerConfig是定時(shí)從云平臺(tái)取得配置信息,采集到的數(shù)據(jù),是由DockerProcess與DockerPing自行交由SendProxy。同步的數(shù)據(jù)其實(shí)就是Task的屬性,比如任務(wù)名、任務(wù)頻率、任務(wù)狀態(tài)。
問:采集數(shù)據(jù)原理是先ps命令機(jī)器上那些 docker容器,再去用docker info獲得他們的指標(biāo)嗎?
答:dockerinfo是返回當(dāng)前機(jī)器上整體的docker指標(biāo),然后ps取得活著的docker容器,依次取它們各自的指標(biāo)。
問:那包括了ps命令出的docker嗎?ps直接就取了嗎?這么說ps不僅僅是獲取那些活的docker容器,還包括他們指標(biāo)?
答:ps取不到指標(biāo),取得的是活的容器并列舉;然后用其他的方法取它們的指標(biāo)。容器名字也是ps時(shí)列舉時(shí)一起取得的。
以上是Neeke就監(jiān)控寶Docker監(jiān)控的實(shí)現(xiàn)原理進(jìn)行的分享,大家可以注冊(cè)監(jiān)控寶進(jìn)行免費(fèi)試用,有任何問題或需求請(qǐng)與我們聯(lián)系。