GoのWebフレームワーク Echoでの開発記録(Deep Health Checkパターンを追加)
はじめに
今回は Deep Health Checkパターンの healthcheck apiを追加します。webアプリ(Echo)のヘルスチェックするapiは作成していましが、DBへのコネクションも正常かどうかを 含めて確認できるようにします。
- 参考(Deep Health Checkパターン)
APIを追加
リクエストパスを以下のように設定
/healthcheck
アプリまでのヘルスチェック/healthcheck/deep
DBを含めたヘルスチェック (追加)
main.go
から抜粋
// ヘルスチェック apiG := e.Group("/api") apiG.GET("/healthcheck", api.Healthcheck) apiG.GET("/healthcheck/deep", api.HealthcheckDeep) // Check db connect
api/healthcheck.go
package api import ( "encoding/json" "log" "net/http" "github.com/labstack/echo/v4" "github.com/yhidetoshi/apiEchoGAE-local/model" ) type HealthcheckMessage struct { Status int `json:"status"` Message string `json:"message"` } func Healthcheck(c echo.Context) error { msg := &HealthcheckMessage{ Status: http.StatusOK, Message: "Success to connect echo", } res, err := json.Marshal(msg) if err != nil { log.Println(err) } return c.String(http.StatusOK, string(res)) } func HealthcheckDeep(c echo.Context) error { if model.CheckDBHealthy() { msg := &HealthcheckMessage{ Status: http.StatusOK, Message: "Success to connect database", } res, err := json.Marshal(msg) if err != nil { log.Println(err) } return c.String(http.StatusOK, string(res)) } msg := &HealthcheckMessage{ Status: http.StatusServiceUnavailable, Message: "Fail to connect database", } res, err := json.Marshal(msg) if err != nil { log.Println(err) } return c.String(http.StatusOK, string(res)) }
model/db.go
から抜粋
func CheckDBHealthy() bool { var err error dsn := conf.DB_ENDPOINT db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Println(err) return false } return true }
確認
- DBの起動を確認
❯ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b71ff89a4d16 mysql "docker-entrypoint.s…" 2 weeks ago Up 20 hours 0.0.0.0:3306->3306/tcp, 33060/tcp apiechogae-local_mysql_1 b2fb2ad53d34 redis:latest "docker-entrypoint.s…" 2 weeks ago Up 4 days 0.0.0.0:6379->6379/tcp apiechogae-local_redis_1
- DBを起動した状態で確認
❯ curl -sS localhost:8080/api/healthcheck/deep {"status":200,"message":"Success to connect database"}
- DBの停止を確認
❯ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2fb2ad53d34 redis:latest "docker-entrypoint.s…" 2 weeks ago Up 4 days 0.0.0.0:6379->6379/tcp apiechogae-local_redis_1
- mysqlを停止した状態で確認
❯ curl -sS localhost:8080/api/healthcheck/deep {"status":503,"message":"Fail to connect database"}