Files
aiops/backend/internal/api/handlers/alert.go
T

134 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package handlers
import (
"encoding/json"
"net/http"
"strconv"
"ezops/internal/models"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
// 告警事件处理 + AlertHandler 定义(规则见 alert_rules.go,渠道见 alert_channels.go) // Logan.Li
// AlertHandler 告警处理器
type AlertHandler struct {
db *gorm.DB
}
// NewAlertHandler 创建告警处理器
func NewAlertHandler(db *gorm.DB) *AlertHandler {
return &AlertHandler{db: db}
}
// ListAlerts 获取告警事件列表
// @Summary 获取告警事件列表
// @Description 获取所有告警事件列表
// @Tags 告警
// @Produce json
// @Security Bearer
// @Param page query int false "页码"
// @Param page_size query int false "每页数量"
// @Param status query string false "状态过滤"
// @Param severity query string false "级别过滤"
// @Success 200 {object} models.Response{data=models.ListResponse}
// @Router /alerts [get]
func (h *AlertHandler) ListAlerts(c *gin.Context) {
var query models.PageQuery
c.ShouldBindQuery(&query)
db := h.db.Model(&models.AlertEvent{}).Preload("Rule")
// 状态过滤
if status := c.Query("status"); status != "" {
db = db.Where("status = ?", status)
}
// 级别过滤
if severity := c.Query("severity"); severity != "" {
db = db.Where("severity = ?", severity)
}
var total int64
db.Count(&total)
var alerts []models.AlertEvent
db.Order("created_at DESC").
Offset(query.GetOffset()).
Limit(query.GetLimit()).
Find(&alerts)
c.JSON(http.StatusOK, models.Response{
Code: 200,
Message: "success",
Data: models.ListResponse{
List: alerts,
Total: total,
},
})
}
// AcknowledgeAlert 确认告警
// @Summary 确认告警
// @Description 确认告警事件
// @Tags 告警
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "告警ID"
// @Param request body models.AcknowledgeAlertRequest true "确认请求"
// @Success 200 {object} models.Response{data=models.AlertEvent}
// @Router /alerts/{id}/ack [post]
func (h *AlertHandler) AcknowledgeAlert(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
var req models.AcknowledgeAlertRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, models.Response{
Code: 400,
Message: "请求参数错误",
})
return
}
var alert models.AlertEvent
if err := h.db.First(&alert, id).Error; err != nil {
c.JSON(http.StatusNotFound, models.Response{
Code: 404,
Message: "告警不存在",
})
return
}
alert.Acknowledged = true
// alert.AcknowledgedBy = middleware.GetUserID(c)
// now := time.Now()
// alert.AcknowledgedAt = &now
if err := h.db.Save(&alert).Error; err != nil {
c.JSON(http.StatusInternalServerError, models.Response{
Code: 500,
Message: "确认失败",
})
return
}
c.JSON(http.StatusOK, models.Response{
Code: 200,
Message: "确认成功",
Data: alert,
})
}
// toJSON serializes a value to JSON string. Returns empty string on error.
// 包级辅助函数,供 alert_rules.go 等同包文件复用 // Logan.Li
func toJSON(v interface{}) string {
b, err := json.Marshal(v)
if err != nil {
return ""
}
return string(b)
}