Health check 是包在 toolbox 模組裡,開發小組說 toolbox 是借鏡 Dropwizard 所建立的。
Health check 主要是提供一個介面,讓外部的服務得以檢查網站是否還存活,像是 AWS ELB 都有地方可以去設定怎麼檢查後面 EC2 實體的狀態 (為你的Classic Load balancer設定運作狀態檢查),這時候就可以把這個 Health check 的 endpoint 填到 ELB 設定去。
Django 也有類似的 package 可以做,我之前用的是 django-health-check ,設定跟使用上都蠻簡單的。好,不多說廢話了,現在來介紹。
首先需要啟用 Admin 介面,先在設定檔裡加入
EnableAdmin = true
加入以後,重新啟動程式,這時候會出現如下的字樣
Admin server Running on :8088
這表示 Admin 介面已經可以通過 port 8088 來存取了。
如果想要修改 port 或是調整 listen address,可以修改設定裡的 AdminAddr / AdminPort (或是加入)
AdminAddr = ""
AdminPort = 8088
建立 checks 目錄,在裏面建立一個 database.go 檔案
package checks
import (
"errors"
"math/rand"
)
type DatabaseCheck struct {
}
func (dc *DatabaseCheck) Check() error {
if dc.isConnected() {
return nil
} else {
return errors.New("can't connect database")
}
}
func (dc *DatabaseCheck) isConnected() bool {
x := rand.Intn(100)
if x%2 == 1 {
return false
}
return true
}
因為 toolbox.AddHealthCheck() 需要的介面是要有 Check() 函式,所以在 database.go 裡新增一個 struct 並實作 Check()。Check() 是給 toolbox 呼叫的,而 isConnect() 則是主要檢查的函式,這邊為了要摹擬成功跟失敗的情況,所以使用亂數來決定回傳 true 或 false。
有了檢查程式以後,接著在 main 裡,使用 toolbox.AddHealthCheck() 加進去。
// main.go
import (
// ...省略...
// 匯入剛剛寫的檢查程式
"github.com/elleryq/ithome-iron-beego/checks"
// ...省略...
)
// ...
func init() {
// ...省略...
// toolbox
toolbox.AddHealthCheck("database", &checks.DatabaseCheck{})
}
// ...
存檔以後,重新編譯、執行程式。
打開瀏覽器,在網址列輸入 http://localhost:8088/ ,就可以看到我們剛剛加入的檢查了。
多 refresh 幾次,就可以看到檢查的效果。
試用以後,我要修正一下之前所說的,本來以為可以填到 ELB 的設定,但是在刷 /healthcare 頁面時,頁面並沒有回傳不同的HTTP狀態碼,這樣ELB的運作狀態檢查就無法判斷。我覺得可以試著加入不同的HTTP狀態碼,這樣才不需要去解析頁面做判斷。
另外就是只有HTML,不能輸出JSON,比較不利於後續的處理。
會提這兩個,也是因為 django-health-check 有提供這些功能,所以才會這樣說。
完整的程式:https://github.com/elleryq/ithome-iron-beego/tree/day_21