87 lines
2.4 KiB
Go
87 lines
2.4 KiB
Go
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)
|
|
}
|