暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

health_handle.go 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. // webx/health_handle.go
  2. package health
  3. import (
  4. "log"
  5. "time"
  6. "git.x2erp.com/qdy/go-base/config"
  7. "git.x2erp.com/qdy/go-base/logger"
  8. "git.x2erp.com/qdy/go-base/webx/router"
  9. )
  10. // HealthResponse 健康检查响应
  11. type HealthResponse struct {
  12. Status string `json:"status"`
  13. Service string `json:"service"`
  14. Version string `json:"version,omitempty"`
  15. Env string `json:"env,omitempty"`
  16. Message string `json:"message,omitempty"`
  17. Timestamp string `json:"timestamp,omitempty"`
  18. Data map[string]interface{} `json:"data,omitempty"`
  19. }
  20. // RegisterDefaultHealthCheck 注册默认健康检查路由(带详细日志)
  21. func RegisterDefaultHealthCheck(ws *router.RouterService, serviceName string) {
  22. if serviceName == "" {
  23. cfg := config.GetConfig()
  24. serviceName = cfg.GetAppName()
  25. if serviceName == "" {
  26. serviceName = "unknown-service"
  27. }
  28. }
  29. log.Printf("注册健康检查路由,服务名: %s", serviceName)
  30. // 健康检查(带详细日志)
  31. ws.GET("/health", func() (HealthResponse, error) {
  32. log.Printf("健康检查被调用: /health")
  33. cfg := config.GetConfig()
  34. response := HealthResponse{
  35. Status: "ok",
  36. Service: serviceName,
  37. Version: cfg.GetAppVersion(),
  38. Env: cfg.GetAppEnv(),
  39. Timestamp: time.Now().Format(time.RFC3339),
  40. }
  41. log.Printf("健康检查响应: %+v", response)
  42. return response, nil
  43. }).Desc("健康检查").Register()
  44. // 就绪检查
  45. ws.GET("/health/ready", func() (HealthResponse, error) {
  46. log.Printf("就绪检查被调用: /health/ready")
  47. return HealthResponse{
  48. Status: "ready",
  49. Service: serviceName,
  50. Timestamp: time.Now().Format(time.RFC3339),
  51. }, nil
  52. }).Desc("就绪检查").Register()
  53. // 存活检查
  54. ws.GET("/health/live", func() (HealthResponse, error) {
  55. log.Printf("存活检查被调用: /health/live")
  56. return HealthResponse{
  57. Status: "alive",
  58. Service: serviceName,
  59. Timestamp: time.Now().Format(time.RFC3339),
  60. }, nil
  61. }).Desc("存活检查").Register()
  62. // 服务信息
  63. ws.GET("/health/info", func() (map[string]interface{}, error) {
  64. log.Printf("服务信息被调用: /health/info")
  65. cfg := config.GetConfig()
  66. response := map[string]interface{}{
  67. "service": serviceName,
  68. "version": cfg.GetAppVersion(),
  69. "environment": cfg.GetAppEnv(),
  70. "timestamp": time.Now().Format(time.RFC3339),
  71. "endpoints": map[string]string{
  72. "health": "/health",
  73. "ready": "/health/ready",
  74. "live": "/health/live",
  75. "info": "/health/info",
  76. },
  77. "config_info": map[string]string{
  78. "app_name": cfg.GetAppName(),
  79. "app_version": cfg.GetAppVersion(),
  80. "app_env": cfg.GetAppEnv(),
  81. },
  82. }
  83. logger.Debug("服务信息响应: %+v", response)
  84. return response, nil
  85. }).Desc("服务信息").Register()
  86. }
  87. // RegisterConsulHealthCheck 注册Consul兼容的健康检查
  88. func RegisterConsulHealthCheck(ws *router.RouterService) {
  89. log.Printf("注册Consul兼容健康检查路由")
  90. // Consul需要的健康检查端点(返回text/plain)
  91. ws.GET("/health", func() ([]byte, error) {
  92. //log.Printf("Consul健康检查被调用: /health")
  93. //log.Printf("返回 'OK' 给Consul")
  94. return []byte("OK"), nil
  95. }).Desc("Consul健康检查").Register()
  96. // Consul详细状态检查
  97. ws.GET("/health/consul", func() (map[string]interface{}, error) {
  98. //log.Printf("Consul状态检查被调用: /health/consul")
  99. cfg := config.GetConfig()
  100. response := map[string]interface{}{
  101. "status": "passing",
  102. "service": cfg.GetAppName(),
  103. "output": "Service is healthy",
  104. "checks": map[string]interface{}{
  105. "service:health": map[string]string{
  106. "status": "passing",
  107. },
  108. },
  109. }
  110. //log.Printf("Consul健康状态响应: %+v", response)
  111. return response, nil
  112. }).Desc("Consul健康状态").Register()
  113. }
  114. // RegisterAllHealthChecks 注册所有健康检查(推荐使用)
  115. func RegisterAllHealthChecks(ws *router.RouterService, serviceName string) {
  116. log.Printf("开始注册所有健康检查路由...")
  117. // 注册默认健康检查
  118. RegisterDefaultHealthCheck(ws, serviceName)
  119. // 注册Consul兼容检查
  120. RegisterConsulHealthCheck(ws)
  121. // 添加一个简单的ping端点(很多监控系统需要)
  122. ws.GET("/ping", func() (map[string]interface{}, error) {
  123. logger.Debug("Ping端点被调用: /ping")
  124. return map[string]interface{}{
  125. "ping": "pong",
  126. "time": time.Now().Unix(),
  127. "service": serviceName,
  128. }, nil
  129. }).Desc("简单Ping检查").Register()
  130. log.Printf("所有健康检查路由注册完成")
  131. }