package handler import ( "net/http" "time" "github.com/company/ai-ops/internal/domain/model" "github.com/company/ai-ops/internal/service" "github.com/company/ai-ops/pkg/errors" "github.com/company/ai-ops/pkg/response" ) // MetricHandler 是指标 HTTP 处理器 type MetricHandler struct { service *service.MetricService } func NewMetricHandler(s *service.MetricService) *MetricHandler { return &MetricHandler{service: s} } // RegisterRoutes 注册指标相关路由 func (h *MetricHandler) RegisterRoutes(mux *http.ServeMux) { mux.HandleFunc("GET /api/v1/ai-ops/metrics/realtime", h.GetRealtime) mux.HandleFunc("GET /api/v1/ai-ops/metrics/suppliers/count", h.GetSupplierCount) mux.HandleFunc("GET /api/v1/ai-ops/alerts/open/count", h.GetOpenAlertCount) mux.HandleFunc("GET /api/v1/ai-ops/metrics/query", h.QueryMetrics) } // GetRealtime 返回实时指标 func (h *MetricHandler) GetRealtime(w http.ResponseWriter, r *http.Request) { metrics, err := h.service.GetRealtimeMetrics(r.Context()) if err != nil { response.Error(w, errors.Wrap(err, errors.ErrInternal)) return } response.Success(w, metrics) } // GetSupplierCount 返回活跃供应商数量 func (h *MetricHandler) GetSupplierCount(w http.ResponseWriter, r *http.Request) { count, err := h.service.GetSupplierCount(r.Context()) if err != nil { response.Error(w, errors.Wrap(err, errors.ErrInternal)) return } response.Success(w, count) } // GetOpenAlertCount 返回未关闭告警数量 func (h *MetricHandler) GetOpenAlertCount(w http.ResponseWriter, r *http.Request) { count, err := h.service.GetOpenAlertCount(r.Context()) if err != nil { response.Error(w, errors.Wrap(err, errors.ErrInternal)) return } response.Success(w, count) } // QueryMetrics 指标下钻查询 func (h *MetricHandler) QueryMetrics(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() req := model.MetricQueryRequest{ Source: query.Get("source"), Name: query.Get("name"), } if startStr := query.Get("start"); startStr != "" { if t, err := time.Parse(time.RFC3339, startStr); err == nil { req.StartTime = t } } if endStr := query.Get("end"); endStr != "" { if t, err := time.Parse(time.RFC3339, endStr); err == nil { req.EndTime = t } } points, err := h.service.QueryMetrics(r.Context(), req) if err != nil { response.Error(w, errors.Wrap(err, errors.ErrInternal)) return } response.Success(w, points) }