Açıklama Yok
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

health_handle.go 4.6KB

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