// webx/health_handle.go package health import ( "log" "time" "git.x2erp.com/qdy/go-base/config" "git.x2erp.com/qdy/go-base/logger" "git.x2erp.com/qdy/go-base/webx/router" ) // HealthResponse 健康检查响应 type HealthResponse struct { Status string `json:"status"` Service string `json:"service"` Version string `json:"version,omitempty"` Env string `json:"env,omitempty"` Message string `json:"message,omitempty"` Timestamp string `json:"timestamp,omitempty"` Data map[string]interface{} `json:"data,omitempty"` } // RegisterDefaultHealthCheck 注册默认健康检查路由(带详细日志) func RegisterDefaultHealthCheck(ws *router.RouterService, serviceName string) { if serviceName == "" { cfg := config.GetConfig() serviceName = cfg.GetAppName() if serviceName == "" { serviceName = "unknown-service" } } log.Printf("注册健康检查路由,服务名: %s", serviceName) // 健康检查(带详细日志) ws.GET("/health", func() (HealthResponse, error) { log.Printf("健康检查被调用: /health") cfg := config.GetConfig() response := HealthResponse{ Status: "ok", Service: serviceName, Version: cfg.GetAppVersion(), Env: cfg.GetAppEnv(), Timestamp: time.Now().Format(time.RFC3339), } log.Printf("健康检查响应: %+v", response) return response, nil }).Desc("健康检查").Register() // 就绪检查 ws.GET("/health/ready", func() (HealthResponse, error) { log.Printf("就绪检查被调用: /health/ready") return HealthResponse{ Status: "ready", Service: serviceName, Timestamp: time.Now().Format(time.RFC3339), }, nil }).Desc("就绪检查").Register() // 存活检查 ws.GET("/health/live", func() (HealthResponse, error) { log.Printf("存活检查被调用: /health/live") return HealthResponse{ Status: "alive", Service: serviceName, Timestamp: time.Now().Format(time.RFC3339), }, nil }).Desc("存活检查").Register() // 服务信息 ws.GET("/health/info", func() (map[string]interface{}, error) { log.Printf("服务信息被调用: /health/info") cfg := config.GetConfig() response := map[string]interface{}{ "service": serviceName, "version": cfg.GetAppVersion(), "environment": cfg.GetAppEnv(), "timestamp": time.Now().Format(time.RFC3339), "endpoints": map[string]string{ "health": "/health", "ready": "/health/ready", "live": "/health/live", "info": "/health/info", }, "config_info": map[string]string{ "app_name": cfg.GetAppName(), "app_version": cfg.GetAppVersion(), "app_env": cfg.GetAppEnv(), }, } logger.Debug("服务信息响应: %+v", response) return response, nil }).Desc("服务信息").Register() } // RegisterConsulHealthCheck 注册Consul兼容的健康检查 func RegisterConsulHealthCheck(ws *router.RouterService) { log.Printf("注册Consul兼容健康检查路由") // Consul需要的健康检查端点(返回text/plain) ws.GET("/health", func() ([]byte, error) { //log.Printf("Consul健康检查被调用: /health") //log.Printf("返回 'OK' 给Consul") return []byte("OK"), nil }).Desc("Consul健康检查").Register() // Consul详细状态检查 ws.GET("/health/consul", func() (map[string]interface{}, error) { //log.Printf("Consul状态检查被调用: /health/consul") cfg := config.GetConfig() response := map[string]interface{}{ "status": "passing", "service": cfg.GetAppName(), "output": "Service is healthy", "checks": map[string]interface{}{ "service:health": map[string]string{ "status": "passing", }, }, } //log.Printf("Consul健康状态响应: %+v", response) return response, nil }).Desc("Consul健康状态").Register() } // RegisterAllHealthChecks 注册所有健康检查(推荐使用) func RegisterAllHealthChecks(ws *router.RouterService, serviceName string) { log.Printf("开始注册所有健康检查路由...") // 注册默认健康检查 RegisterDefaultHealthCheck(ws, serviceName) // 注册Consul兼容检查 RegisterConsulHealthCheck(ws) // 添加一个简单的ping端点(很多监控系统需要) ws.GET("/ping", func() (map[string]interface{}, error) { logger.Debug("Ping端点被调用: /ping") return map[string]interface{}{ "ping": "pong", "time": time.Now().Unix(), "service": serviceName, }, nil }).Desc("简单Ping检查").Register() log.Printf("所有健康检查路由注册完成") }