1 回答

TA貢獻1860條經驗 獲得超9個贊
嗯,這是一個復雜的話題,所以不可能有一個明確的答案。
實際上,您所接近的在生產設置中被稱為“指標收集”或“遙測”。
在大多數(shù)情況下,指標的收集使用抽樣方法:即收集感興趣的系統(tǒng)狀態(tài)的快照并將其發(fā)送到某處?!澳程帯蓖ǔJ且恍┰试S在某處保存度量值的系統(tǒng),并且通常還提供各種分析它們的方法。
在最簡單的情況下,分析是通過在某種 UI 中盯著從收集的數(shù)據(jù)中繪制的圖表來完成的。更復雜的情況包括當某個指標的值高于(或低于)某個閾值時發(fā)出警報。
單個指標是特定類型的某個命名值。
這些指標可以從不同的數(shù)據(jù)源產生。以 Go 編寫的程序運行的相當常見的設置的典型來源包括:
Go 運行時本身。
這包括諸如 goroutine 的數(shù)量和垃圾收集統(tǒng)計信息之類的東西——由于顯而易見的原因,這些測量值不可能超出正在運行的 Go 程序。
操作系統(tǒng)提供的關于執(zhí)行程序的正在運行的進程的測量值。
這包括在內核的用戶和系統(tǒng)上下文中花費的 CPU 時間、內存消耗(如操作系統(tǒng)所見)、打開的文件(和套接字)描述符的數(shù)量、CPU 上下文切換的數(shù)量、磁盤 I/O 統(tǒng)計信息等等。
由運行包含程序的容器的容器化軟件提供的測量值。
在 Linux 上,這通常由子系統(tǒng)提供,該
cgroup
子系統(tǒng)主要負責控制對進程層次結構施加的資源限制。
如何準確地從這些數(shù)據(jù)源轉換數(shù)據(jù)是一個懸而未決的問題(這就是它不適合 SO 格式的原因)。
例如,要收集 Go 運行時統(tǒng)計信息,您可以使用expvar
@Adrian 建議的機制,并定期輪詢它提供的 HTTP 端點以獲取數(shù)據(jù)。
或者你可以在你的程序中運行一個內部 goroutine,它會定期從運行時獲取這些數(shù)據(jù)并將其推送到某個地方。
再次,可以以不同的方式對操作系統(tǒng)級進程相關數(shù)據(jù)進行采樣。比如說,您可以使用類似的工具從您的程序中收集它們github.com/shirou/gopsutil/process
并將它們與從運行時統(tǒng)計中收集的指標一起推送,或者您可以使用無數(shù)工具中的一個或多個從外部收集這些數(shù)據(jù)。
(我所知道的收集操作系統(tǒng)級性能數(shù)據(jù)的最低技術但易于使用的方法是使用pidstat
、iotop
、atop
等工具cpustat
)。
保存和分析收集的數(shù)據(jù)的問題再次公開。
首先,它可能就像將所有內容轉儲到結構化文件中一樣簡單——可能在每條記錄上都有一個時間戳——然后用你喜歡的任何東西處理它——例如,pyplot
RRD-tool 或 R 或……隨便什么。
或者你可以從一開始就拿起一把大槍,然后將你的指標發(fā)送到graphite、graphana、zabbix或icinga或任何目前處于臀部曲線頂部的東西。
- 1 回答
- 0 關注
- 180 瀏覽
添加回答
舉報