Go 標準庫增加metrics指標探討分析
快速了解 runtime/metrics
以下是一個快速 Demo。代碼如下:
func main() {
descs := metrics.All()
samples := make([]metrics.Sample, len(descs))
for i := range samples {
samples[i].Name = descs[i].Name
}
metrics.Read(samples)
for _, sample := range samples {
name, value := sample.Name, sample.Value
switch value.Kind() {
case metrics.KindUint64:
fmt.Printf("%s: %d\n", name, value.Uint64())
case metrics.KindFloat64:
fmt.Printf("%s: %f\n", name, value.Float64())
case metrics.KindFloat64Histogram:
fmt.Printf("%s: %f\n", name, medianBucket(value.Float64Histogram()))
...
}
}
}
func medianBucket(h *metrics.Float64Histogram) float64 {
total := uint64(0)
for _, count := range h.Counts {
total += count
}
thresh := total / 2
total = 0
for i, count := range h.Counts {
total += count
if total >= thresh {
return h.Buckets[i]
}
}
panic("should not happen")
}輸出結(jié)果:
/cgo/go-to-c-calls:calls: 0
/cpu/classes/gc/mark/assist:cpu-seconds: 0.000000
/cpu/classes/gc/mark/dedicated:cpu-seconds: 0.000000
...
/gc/cycles/automatic:gc-cycles: 0
/gc/cycles/forced:gc-cycles: 0
/gc/cycles/total:gc-cycles: 0
/gc/gogc:percent: 100
/gc/gomemlimit:bytes: 9223372036854775807
/gc/heap/allocs-by-size:bytes: 8193.000000
/gc/heap/allocs:bytes: 56832
/gc/heap/allocs:objects: 6
/gc/heap/frees-by-size:bytes: 1.000000
/gc/heap/frees:bytes: 0
/gc/heap/frees:objects: 0
/gc/heap/goal:bytes: 4194304
...
里面包含了相當多的 Go 系統(tǒng)指標。完整的代碼運行和輸出可以查看 https://go.dev/play/p/CKASbysqX9x。
我梳理了一張對照清單。其中 10 個指標如下:
| 序號 | 指標 | 含義 |
|---|---|---|
| 1 | /cgo/go-to-c-calls:calls | 當前進程從 Go 調(diào)用到 C 的次數(shù) |
| 2 | /cpu/classes/gc/mark/assist:cpu-seconds | 預(yù)計執(zhí)行 GC 程序所花費的 CPU 總時長,以協(xié)助 GC 并防止其落后于應(yīng)用程序 |
| 3 | /cpu/classes/gc/mark/dedicated:cpu-seconds | 在專門用于執(zhí)行 GC 任務(wù)的 CPU 處理器(根據(jù) GOMAXPROCS 的定義)上執(zhí)行 GC 任務(wù)預(yù)計需要花費的 CPU 總時長 |
| 4 | /cpu/classes/gc/mark/idle:cpu-seconds | 在空閑 CPU 資源上執(zhí)行 GC 任務(wù)所花費的 CPU 總時間 |
| 5 | /cpu/classes/gc/pause:cpu-seconds | GC 暫停應(yīng)用程序預(yù)計所花費的 CPU 總時長 |
| 6 | /gc/cycles/automatic:gc-cycles | Go Runtime 程序已完成的 GC 循環(huán)次數(shù)。 |
| 7 | /gc/gogc:percent | 用戶配置的堆大小目標百分比 |
| 8 | /gc/heap/allocs:objects | 應(yīng)用程序觸發(fā)的堆分配累計計數(shù) |
| 9 | /memory/classes/heap/free:bytes | Go Runtime 對物理內(nèi)存的可用空間大小的預(yù)估(完全空閑并可返回底層系統(tǒng)但尚未返回的內(nèi)存) |
| 10 | /sched/gomaxprocs:threads | 當前 runtime.GOMAXPROCS 的值,或是可以同時執(zhí)行用戶級 Go 代碼的操作系統(tǒng)線程數(shù)。 |
對于完整指標有興趣的可以查看:
https://pkg.go.dev/runtime/metrics#hdr-Supported_metrics
更多的 metrics 指標
最近在 Go 社區(qū)中有同學(xué)發(fā)起了一項討論《metrics for the standard library》,希望探討和在其他標準庫中添加更多的 metrics 指標,提供更多的可觀察性。
比較多同學(xué)期望的是網(wǎng)絡(luò)、延遲類的指標,針對性能、錯誤等。如下幾種場景:
net/http 服務(wù)端:
- 處理延遲。
- 請求/響應(yīng)體大小。
- 恐慌(panic)、恢復(fù)(recover)。
- 錯誤/警告(觸發(fā)
net/http.Server.ErrorLog的所有內(nèi)容) - 被拒絕的無效請求。
net/http 客戶端:
- 調(diào)用延遲。
- 請求/響應(yīng)體大小
- 連接池相關(guān)。
database/sql 客戶端:
- 查詢延遲。
- 響應(yīng)大小。
- 連接池相關(guān)。
net 網(wǎng)絡(luò)包相關(guān):
- 例如 TCP、UDP 等,對應(yīng)的打開連接的數(shù)量、連接狀態(tài)(空閑、激活、關(guān)閉)、連接錯誤等。
- 例如 TLS,在握手階段相關(guān)的指標,握手持續(xù)時間、握手失敗計數(shù)等。
總結(jié)
整體上會發(fā)現(xiàn)大家對于 Go 標準庫的指標訴求,更多的趨向于底層包。因為無論你用的是什么開源倉庫,其絕大部分都是基于上述提到的包。
在現(xiàn)階段,如果自己的 Go 業(yè)務(wù)應(yīng)用程序去記錄這些指標,就需要再封裝一層,每一個包,例如:ORM 就需要去實現(xiàn)一遍插件等。
而第三方庫實現(xiàn)不會把 metrics 這類非核心功能直接加入初始化實現(xiàn)中。因此官方標準庫對 metrics 的支持是非常有必要的。
至少這樣就不用每個團隊都搞一遍 net/http、database/sql 等的延遲調(diào)用指標的配置和設(shè)置了。
以上就是Go 標準庫增加metrics指標探討分析的詳細內(nèi)容,更多關(guān)于Go 標準庫metrics指標的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go使用errors.Wrapf()代替log.Error()方法示例
這篇文章主要為大家介紹了go使用errors.Wrapf()代替log.Error()的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
golang網(wǎng)絡(luò)通信超時設(shè)置方式
這篇文章主要介紹了golang網(wǎng)絡(luò)通信超時設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
go-zero使用goctl生成mongodb的操作使用方法
mongodb是一種高性能、開源、文檔型的nosql數(shù)據(jù)庫,被廣泛應(yīng)用于web應(yīng)用、大數(shù)據(jù)以及云計算領(lǐng)域,goctl model 為 goctl 提供的數(shù)據(jù)庫模型代碼生成指令,目前支持 MySQL、PostgreSQL、Mongo 的代碼生成,本文給大家介紹了go-zero使用goctl生成mongodb的操作使用方法2024-06-06

