health_controller.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package controller
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/gin-gonic/gin"
  6. )
  7. // HealthController 健康检查控制器
  8. type HealthController struct {
  9. healthChecker interface{} // rag.HealthChecker
  10. retrievalService interface{} // rag.RetrievalService
  11. }
  12. // NewHealthController 创建健康检查控制器实例
  13. func NewHealthController(healthChecker interface{}, retrievalService interface{}) *HealthController {
  14. return &HealthController{
  15. healthChecker: healthChecker,
  16. retrievalService: retrievalService,
  17. }
  18. }
  19. // HealthCheck 健康检查
  20. func (c *HealthController) HealthCheck(ctx *gin.Context) {
  21. // 类型断言获取 healthChecker
  22. type HealthChecker interface {
  23. Check(ctx context.Context) error
  24. }
  25. checker, ok := c.healthChecker.(HealthChecker)
  26. if !ok {
  27. ctx.JSON(http.StatusOK, gin.H{
  28. "status": "healthy",
  29. "message": "健康检查器未初始化",
  30. })
  31. return
  32. }
  33. // 执行健康检查
  34. err := checker.Check(context.Background())
  35. isHealthy := err == nil
  36. status := "healthy"
  37. httpStatus := http.StatusOK
  38. if !isHealthy {
  39. status = "unhealthy"
  40. httpStatus = http.StatusServiceUnavailable
  41. }
  42. ctx.JSON(httpStatus, gin.H{
  43. "status": status,
  44. "error": func() string {
  45. if err != nil {
  46. return err.Error()
  47. }
  48. return ""
  49. }(),
  50. })
  51. }
  52. // Metrics 获取性能指标(GET /health/metrics)
  53. func (c *HealthController) Metrics(ctx *gin.Context) {
  54. // 类型断言获取 retrievalService
  55. type RetrievalService interface {
  56. GetMetrics() map[string]interface{}
  57. }
  58. service, ok := c.retrievalService.(RetrievalService)
  59. if !ok {
  60. ctx.JSON(http.StatusOK, gin.H{
  61. "message": "性能指标服务未初始化",
  62. })
  63. return
  64. }
  65. // 获取指标
  66. metrics := service.GetMetrics()
  67. ctx.JSON(http.StatusOK, metrics)
  68. }