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

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

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