Esty 當年發(fā)布 statsd 寫過一篇文章:[Measure Anything, Measure Everything](https://codeascraft.com/2011/02/15/measure-anything-measure-everything/](https://codeascraft.com/2011/02/15/measure-anything-measure-everything/)枷踏。
這篇文章對性能監(jiān)控領域影響很大准潭,系統(tǒng)監(jiān)控工具如果能夠做到 All in One隘世,那真的可以解決人力和時間成本上的問題筷转。OneAPM 的工程師對這篇經典文章進行了編譯整理盹沈,希望能對大家有所啟發(fā):
如果 Etsy 社區(qū)也有信仰,那一定是圖表疫鹊,Ian Malpass 在 Code as Craft 發(fā)表的文章中這么描述: 只要是變化的事件儡陨,我們就追蹤它。有時候辙售,為了記錄事件的變化轻抱,我們從它不變時就用圖表進行記錄。通常旦部,我們會從三個層面進行測量:網絡祈搜、設備以及應用。
應用指標往往是這三者中最難測量卻又最重要的士八。應用指標與業(yè)務息息相關容燕,隨著應用的變化而變化。在此婚度,我們不會早早地規(guī)劃要測量的所有指標蘸秘,將它們放在經典的測量管理系統(tǒng)中,我們只會將工程師可能測量或計時的指標以最簡便的方式做成圖表蝗茁。(我們可以隨時隨地修改代碼并部署它醋虏,因此,測量“ X 的發(fā)生頻率”评甜,“ X 在過去半小時內的發(fā)生情況”灰粮,只要有需求,就能很快實現(xiàn)忍坷。)
StatsD 簡介
StatsD 是一種簡單的監(jiān)聽 UDP 端口消息的 NodeJS 守護程序,NodeJS 對于基于事件的系統(tǒng)監(jiān)控真的很簡單熔脂。該程序會分析這些消息佩研,抽取中其中的測量數據,并定期將數據推送給 Graphite霞揉。
我們選擇 Graphite 的原因很多:它使用簡便旬薯,圖形化和數據處理能力強大。我們可以結合通過 StatsD 或其他指標收集系統(tǒng)收集到的數據來了解系統(tǒng)運行情況适秩。最重要的是绊序,對于 StatsD 來說硕舆,可以根據傳輸給 Graphite 的數據自動創(chuàng)建指標。這意味著骤公,工程師們在追蹤新的指標時無需擔心管理成本抚官,只要告訴 StatsD:“我想要追蹤 grue.dinners
”,該指標就會自動出現(xiàn)在 Graphite 中阶捆。此外凌节,向 Graphite 推送數據的頻率為10秒,因此洒试,StatsD 測量的指標數據幾乎可以做到實時倍奢。
因此,有了 StatsD垒棋,抓取比率卒煞、速度等數據值就變得很簡單了,再通過 Graphite 對數據進行處理叼架,對數據的查看跷坝、分析也很容易實現(xiàn)。
為什么使用 UDP?
前面也說了, Statsd 是通過 UDP 傳輸數據的碉碉,那么有人會問為什么選 UDP 而不選 TCP 呢? 首先柴钻,UDP 速度很快。任何人都不想為了提高應用性能而減慢其速度垢粮。此外贴届,UDP 包遵循“發(fā)送后不管(fire-and-forget)”機制。所以要么 StatsD 接收了這個包蜡吧,要么沒有毫蚓,應用不會在意 StatsD 是運行、宕機還是著火了昔善。它單純地相信一切運行正常元潘。即便并非如此,stats 進程出現(xiàn)了問題君仆,應用也不受影響翩概。因為我們也信仰“正常運行時間(uptime)”概念,所以這不成問題返咱。(當然钥庇,我們可以通過圖表追蹤 UDP 包接收失敗的情況。)
測量任意事件
以下是我們使用 PHP StatsD 函數庫的實現(xiàn)方式:
StatsD::increment("grue.dinners");
通過這樣一行代碼咖摹,就在進程中創(chuàng)建了一個新的計數器评姨,在每次執(zhí)行后增加計數。接下來萤晴,就可以只關注圖表的展現(xiàn)吐句,而不去考慮其他了胁后。

我們可以使用 Graphite 提供的數據處理工具來處理上面的數據净宵,創(chuàng)建異常偏離標準值的圖表敲才。

(有時敏储,我們會使用 Graphite 中的 rawData=true
選項獲取能自動推送給監(jiān)控系統(tǒng)的數字流阻星,這一類型的圖表非常容易被監(jiān)控。)
我們不僅監(jiān)控諸如“有多少人登陸了這個網站”這類重要的事情已添,我們也會追蹤一些瑣碎的事件妥箕,比如“廚房里還剩多少咖啡”:

為所有事件計時
除了計數缆蝉,我們還可以追蹤時間宇葱。
$start = microtime(true);
eat_adventurer();
StatsD::timing("grue.dinners", (microtime(true) - $start) * 1000);
StatsD 可以自動追蹤次數,平均值刊头,最大/小值黍瞧,以及百分之 90 時間值。在下面的例子中原杂,我們測量了部分搜索設備的執(zhí)行時間印颤。

數據采樣
我們很早就發(fā)現(xiàn)被碗,如果受追蹤的某些事件發(fā)生的頻率非常高某宪,UDP 包就會溢滿 StatsD。為了解決這個問題锐朴,我們增加了數據采樣的選項——只在一段時間內傳送數據包。但對于那些異嘲遥活躍的事件焚志,即便這么做還是會帶來過多的數據衣迷。
為此,我們只記錄十個事件中的一個事件酱酬,可以采取以下方法:
StatsD::increment(“adventurer.heartbeat”, 0.1);
測量所有事件
追蹤所有事件是提高效率的關鍵壶谒。有了 StatsD,工程師們可以輕松追蹤他們需要關注的事務膳沽,而無需費時地修改配置汗菜。
Cloud Insight 集監(jiān)控、管理挑社、計算陨界、協(xié)作、可視化于一身痛阻,幫助所有 IT 公司菌瘪,減少在系統(tǒng)監(jiān)控上的人力和時間成本投入,讓運維工作更加高效阱当、簡單俏扩。想閱讀更多技術文章,請訪問 OneAPM 官方技術博客弊添。