如果檢視應用效能圖表是一種信仰

OneAPM官方技術部落格發表於2015-12-11

Esty 當年釋出 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/)。 這篇文章對效能監控領域影響很大,系統監控工具如果能夠做到 All in One,那真的可以解決人力和時間成本上的問題。OneAPM 的工程師對這篇經典文章進行了編譯整理,希望能對大家有所啟發:

如果 Etsy 社群也有信仰,那一定是圖表,Ian Malpass 在 Code as Craft 發表的文章中這麼描述: 只要是變化的事件,我們就追蹤它。有時候,為了記錄事件的變化,我們從它不變時就用圖表進行記錄。通常,我們會從三個層面進行測量:網路、裝置以及應用。

應用指標往往是這三者中最難測量卻又最重要的。應用指標與業務息息相關,隨著應用的變化而變化。在此,我們不會早早地規劃要測量的所有指標,將它們放在經典的測量管理系統中,我們只會將工程師可能測量或計時的指標以最簡便的方式做成圖表。(我們可以隨時隨地修改程式碼並部署它,因此,測量“ X 的發生頻率”,“ X 在過去半小時內的發生情況”,只要有需求,就能很快實現。)

StatsD 簡介

StatsD 是一種簡單的監聽 UDP 埠訊息的 NodeJS 守護程式,NodeJS 對於基於事件的系統監控真的很簡單。該程式會分析這些訊息,抽取中其中的測量資料,並定期將資料推送給 Graphite

我們選擇 Graphite 的原因很多:它使用簡便,圖形化和資料處理能力強大。我們可以結合通過 StatsD 或其他指標收集系統收集到的資料來了解系統執行情況。最重要的是,對於 StatsD 來說,可以根據傳輸給 Graphite 的資料自動建立指標。這意味著,工程師們在追蹤新的指標時無需擔心管理成本,只要告訴 StatsD:“我想要追蹤 grue.dinners”,該指標就會自動出現在 Graphite 中。此外,向 Graphite 推送資料的頻率為10秒,因此,StatsD 測量的指標資料幾乎可以做到實時。

因此,有了 StatsD,抓取比率、速度等資料值就變得很簡單了,再通過 Graphite 對資料進行處理,對資料的檢視、分析也很容易實現。

為什麼使用 UDP?

前面也說了, Statsd 是通過 UDP 傳輸資料的,那麼有人會問為什麼選 UDP 而不選 TCP 呢? 首先,UDP 速度很快。任何人都不想為了提高應用效能而減慢其速度。此外,UDP 包遵循“傳送後不管(fire-and-forget)”機制。所以要麼 StatsD 接收了這個包,要麼沒有,應用不會在意 StatsD 是執行、當機還是著火了。它單純地相信一切執行正常。即便並非如此,stats 程式出現了問題,應用也不受影響。因為我們也信仰“正常執行時間(uptime)”概念,所以這不成問題。(當然,我們可以通過圖表追蹤 UDP 包接收失敗的情況。)

測量任意事件

以下是我們使用 PHP StatsD 函式庫的實現方式: StatsD::increment("grue.dinners"); 通過這樣一行程式碼,就在程式中建立了一個新的計數器,在每次執行後增加計數。接下來,就可以只關注圖表的展現,而不去考慮其他了。

測量所有,量化一切!

我們可以使用 Graphite 提供的資料處理工具來處理上面的資料,建立異常偏離標準值的圖表。

測量所有,量化一切!

(有時,我們會使用 Graphite 中的 rawData=true 選項獲取能自動推送給監控系統的數字流,這一型別的圖表非常容易被監控。)

我們不僅監控諸如“有多少人登陸了這個網站”這類重要的事情,我們也會追蹤一些瑣碎的事件,比如“廚房裡還剩多少咖啡”:

測量所有,量化一切!

為所有事件計時

除了計數,我們還可以追蹤時間。 $start = microtime(true);
eat_adventurer(); StatsD::timing("grue.dinners", (microtime(true) - $start) * 1000);
StatsD 可以自動追蹤次數,平均值,最大/小值,以及百分之 90 時間值。在下面的例子中,我們測量了部分搜尋裝置的執行時間。 測量所有,量化一切!

資料取樣

我們很早就發現,如果受追蹤的某些事件發生的頻率非常高,UDP 包就會溢滿 StatsD。為了解決這個問題,我們增加了資料取樣的選項——只在一段時間內傳送資料包。但對於那些異常活躍的事件,即便這麼做還是會帶來過多的資料。

為此,我們只記錄十個事件中的一個事件,可以採取以下方法: StatsD::increment(“adventurer.heartbeat”, 0.1);

測量所有事件

追蹤所有事件是提高效率的關鍵。有了 StatsD,工程師們可以輕鬆追蹤他們需要關注的事務,而無需費時地修改配置。

Cloud Insight 集監控、管理、計算、協作、視覺化於一身,幫助所有 IT 公司,減少在系統監控上的人力和時間成本投入,讓運維工作更加高效、簡單。想閱讀更多技術文章,請訪問 OneAPM 官方技術部落格

相關文章