77 lines
1.7 KiB
Go
77 lines
1.7 KiB
Go
package rest
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"time"
|
|
|
|
"skeleton/database"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type systemResponse struct {
|
|
Code int `json:"code" example:"200"`
|
|
Message string `json:"message"`
|
|
Data interface{} `json:"data"`
|
|
}
|
|
|
|
type healthData struct {
|
|
Status string `json:"status"`
|
|
Database string `json:"database"`
|
|
Redis string `json:"redis"`
|
|
}
|
|
|
|
func init() {
|
|
RegisterPublic(registerHealthRoutes)
|
|
}
|
|
|
|
func registerHealthRoutes(r *gin.RouterGroup) {
|
|
r.GET("/ping", ping)
|
|
r.GET("/health", health)
|
|
}
|
|
|
|
// ping godoc
|
|
// @Summary 服务连通性检查
|
|
// @Tags system
|
|
// @Produce json
|
|
// @Success 200 {object} systemResponse
|
|
// @Router /ping [get]
|
|
func ping(ctx *gin.Context) {
|
|
ctx.JSON(http.StatusOK, gin.H{
|
|
"code": 200,
|
|
"message": "pong",
|
|
"data": nil,
|
|
})
|
|
}
|
|
|
|
// health godoc
|
|
// @Summary 服务健康检查
|
|
// @Tags system
|
|
// @Produce json
|
|
// @Success 200 {object} systemResponse{data=healthData}
|
|
// @Failure 503 {object} systemResponse{data=healthData}
|
|
// @Router /health [get]
|
|
func health(ctx *gin.Context) {
|
|
checkCtx, cancel := context.WithTimeout(ctx.Request.Context(), 2*time.Second)
|
|
defer cancel()
|
|
|
|
data := healthData{Status: "ok", Database: "up", Redis: "disabled"}
|
|
status := http.StatusOK
|
|
if err := database.Ping(checkCtx); err != nil {
|
|
data.Status = "degraded"
|
|
data.Database = "down"
|
|
status = http.StatusServiceUnavailable
|
|
}
|
|
if client := database.GetRedisClient(); client != nil {
|
|
data.Redis = "up"
|
|
if err := client.Ping(checkCtx); err != nil {
|
|
data.Status = "degraded"
|
|
data.Redis = "down"
|
|
status = http.StatusServiceUnavailable
|
|
}
|
|
}
|
|
|
|
ctx.JSON(status, gin.H{"code": status, "message": data.Status, "data": data})
|
|
}
|