這個(gè)模塊主要是參考了 Dropwizard 框架,是一位用戶提醒我說有這么一個(gè)框架,然后里面實(shí)現(xiàn)一些很酷的東西。那個(gè) issue 詳細(xì)描述了該功能的雛形,然后就在參考該功能的情況下增加了一些額外的很酷的功能,接下來我將一一介紹這個(gè)模塊中的幾個(gè)功能:健康檢查、性能調(diào)試、訪問統(tǒng)計(jì)、計(jì)劃任務(wù)。
go get github.com/astaxie/beego/toolbox
監(jiān)控檢查是用于當(dāng)你應(yīng)用于產(chǎn)品環(huán)境中進(jìn)程,檢查當(dāng)前的狀態(tài)是否正常,例如你要檢查當(dāng)前數(shù)據(jù)庫是否可用,如下例子所示:
type DatabaseCheck struct {
}
func (dc *DatabaseCheck) Check() error {
if dc.isConnected() {
return nil
} else {
return errors.New("can't connect database")
}
}
然后就可以通過如下方式增加檢測項(xiàng):
toolbox.AddHealthCheck("database",&DatabaseCheck{})
加入之后,你可以往你的管理端口 /healthcheck 發(fā)送GET請(qǐng)求:
$ curl http://beego.me:8088/healthcheck
* deadlocks: OK
* database: OK
如果檢測顯示是正確的,那么輸出 OK,如果檢測出錯(cuò),顯示出錯(cuò)的信息。
對(duì)于運(yùn)行中的進(jìn)程的性能監(jiān)控是我們進(jìn)行程序調(diào)優(yōu)和查找問題的最佳方法,例如 GC、goroutine 等基礎(chǔ)信息。profile 提供了方便的入口方便用戶來調(diào)試程序,他主要是通過入口函數(shù) ProcessInput 來進(jìn)行處理各類請(qǐng)求,主要包括以下幾種調(diào)試:
# runtime.MemStats
# Alloc = 275504
# TotalAlloc = 275512
# Sys = 4069608
# Lookups = 5
# Mallocs = 469
# Frees = 1
# HeapAlloc = 275504
# HeapSys = 1048576
# HeapIdle = 647168
# HeapInuse = 401408
# HeapReleased = 0
# HeapObjects = 468
# Stack = 24576 / 131072
# MSpan = 4472 / 16384
# MCache = 1504 / 16384
# BuckHashSys = 1476472
# NextGC = 342976
# PauseNs = [370712 77378 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
# NumGC = 2
# EnableGC = true
# DebugGC = false
請(qǐng)先看下面這張效果圖,你有什么想法,很酷?是的,很酷,現(xiàn)在 tootlbox 就是支持這樣的功能了:
如何使用這個(gè)統(tǒng)計(jì)呢?如下所示添加統(tǒng)計(jì):
toolbox.StatisticsMap.AddStatistics("POST", "/api/user", "&admin.user", time.Duration(2000))
toolbox.StatisticsMap.AddStatistics("POST", "/api/user", "&admin.user", time.Duration(120000))
toolbox.StatisticsMap.AddStatistics("GET", "/api/user", "&admin.user", time.Duration(13000))
toolbox.StatisticsMap.AddStatistics("POST", "/api/admin", "&admin.user", time.Duration(14000))
toolbox.StatisticsMap.AddStatistics("POST", "/api/user/astaxie", "&admin.user", time.Duration(12000))
toolbox.StatisticsMap.AddStatistics("POST", "/api/user/xiemengjun", "&admin.user", time.Duration(13000))
toolbox.StatisticsMap.AddStatistics("DELETE", "/api/user", "&admin.user", time.Duration(1400))
獲取統(tǒng)計(jì)信息
toolbox.StatisticsMap.GetMap(os.Stdout)
輸出如下格式的信息:
| requestUrl | method | times | used | max used | min used | avg used |
| /api/user | POST | 2 | 122.00us | 120.00us | 2.00us | 61.00us |
| /api/user | GET | 1 | 13.00us | 13.00us | 13.00us | 13.00us |
| /api/user | DELETE | 1 | 1.40us | 1.40us | 1.40us | 1.40us |
| /api/admin | POST | 1 | 14.00us | 14.00us | 14.00us | 14.00us |
| /api/user/astaxie | POST | 1 | 12.00us | 12.00us | 12.00us | 12.00us |
| /api/user/xiemengjun | POST | 1 | 13.00us | 13.00us | 13.00us | 13.00us |
玩過 linux 的用戶都知道有一個(gè)計(jì)劃任務(wù)的工具 crontab,我們經(jīng)常利用該工具來定時(shí)的做一些任務(wù),但是有些時(shí)候我們的進(jìn)程內(nèi)也希望定時(shí)的來處理一些事情,例如定時(shí)的匯報(bào)當(dāng)前進(jìn)程的內(nèi)存信息,goroutine 信息等?;蛘叨〞r(shí)的進(jìn)行手工觸發(fā) GC,或者定時(shí)的清理一些日志數(shù)據(jù)等,所以實(shí)現(xiàn)了秒級(jí)別的定時(shí)任務(wù),首先讓我們看看如何使用:
spec 格式是參照 crontab 做的,詳細(xì)的解釋如下所示:
//前6個(gè)字段分別表示:
// 秒鐘:0-59
// 分鐘:0-59
// 小時(shí):1-23
// 日期:1-31
// 月份:1-12
// 星期:0-6(0 表示周日)
//還可以用一些特殊符號(hào):
// *: 表示任何時(shí)刻
// ,: 表示分割,如第三段里:2,4,表示 2 點(diǎn)和 4 點(diǎn)執(zhí)行
// -:表示一個(gè)段,如第三端里: 1-5,就表示 1 到 5 點(diǎn)
// /n : 表示每個(gè)n的單位執(zhí)行一次,如第三段里,*/1, 就表示每隔 1 個(gè)小時(shí)執(zhí)行一次命令。也可以寫成1-23/1.
/////////////////////////////////////////////////////////
// 0/30 * * * * * 每 30 秒 執(zhí)行
// 0 43 21 * * * 21:43 執(zhí)行
// 0 15 05 * * * 05:15 執(zhí)行
// 0 0 17 * * * 17:00 執(zhí)行
// 0 0 17 * * 1 每周一的 17:00 執(zhí)行
// 0 0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 執(zhí)行
// 0 0-10 17 1 * * 毎月1日從 17:00 到 7:10 毎隔 1 分鐘 執(zhí)行
// 0 0 0 1,15 * 1 毎月1日和 15 日和 一日的 0:00 執(zhí)行
// 0 42 4 1 * * 毎月1日的 4:42 分 執(zhí)行
// 0 0 21 * * 1-6 周一到周六 21:00 執(zhí)行
// 0 0,10,20,30,40,50 * * * * 每隔 10 分 執(zhí)行
// 0 */10 * * * * 每隔 10 分 執(zhí)行
// 0 * 1 * * * 從 1:0 到 1:59 每隔 1 分鐘 執(zhí)行
// 0 0 1 * * * 1:00 執(zhí)行
// 0 0 */1 * * * 毎時(shí) 0 分 每隔 1 小時(shí) 執(zhí)行
// 0 0 * * * * 毎時(shí) 0 分 每隔 1 小時(shí) 執(zhí)行
// 0 2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 執(zhí)行
// 0 30 5 1,15 * * 1 日 和 15 日的 5:30 執(zhí)行
我們經(jīng)常需要打印一些參數(shù)進(jìn)行調(diào)試,但是默認(rèn)的參數(shù)打印總是不是很完美,也沒辦法定位代碼行之類的,所以 beego 的 toolbox 模塊進(jìn)行了 debug 模塊的開發(fā),主要包括了兩個(gè)函數(shù):
兩個(gè)函數(shù)的功能一模一樣,第一個(gè)是直接打印到 console,第二個(gè)是返回字符串,方便用戶存儲(chǔ)到日志或者其他存儲(chǔ)。
使用很方便,是 key/value 串出現(xiàn)的,如下示例:
Display("v1", 1, "v2", 2, "v3", 3)
打印結(jié)果如下:
2013/12/16 23:48:41 [Debug] at TestPrint() [/Users/astaxie/github/beego/toolbox/debug_test.go:13]
[Variables]
v1 = 1
v2 = 2
v3 = 3
指針類型的打印如下:
type mytype struct {
next *mytype
prev *mytype
}
var v1 = new(mytype)
var v2 = new(mytype)
v1.prev = nil
v1.next = v2
v2.prev = v1
v2.next = nil
Display("v1", v1, "v2", v2)
打印結(jié)果如下:
2013/12/16 23:48:41 [Debug] at TestPrintPoint() [/Users/astaxie/github/beego/toolbox/debug_test.go:26]
[Variables]
v1 = &toolbox.mytype{
next: &toolbox.mytype{
next: nil,
prev: 0x210335420,
},
prev: nil,
}
v2 = &toolbox.mytype{
next: nil,
prev: &toolbox.mytype{
next: 0x210335430,
prev: nil,
},
}
更多建議: