- 告警规则:独立实体(alert_rules 表),按优先级命中第一条生效;支持三种主机目标(全部/按主机/按标签)、7 类阈值、事件通知开关、IP 打码、推送渠道选择;未命中规则的主机不产生告警;列表支持外置启停 - 服务监控:新增按标签选择探针,与指定探针取并集,均为空时全部探针执行 - 公网 IP 采集:范围支持全部探针/按探针/按标签,兼容历史 custom 取值 - 告警历史:新增规则归属列;评估链路(指标/证书/服务下线/探针离线/到期提醒/事件通知)全部按主机命中规则驱动 - 设置页:左侧菜单改为浅色卡片容器并优化对比度,通知渠道移至公网 IP 采集之后;主菜单宽度调整为 240px
130 lines
2.9 KiB
Go
130 lines
2.9 KiB
Go
package handler
|
|
|
|
import (
|
|
"github.com/go-orz/orz"
|
|
"github.com/labstack/echo/v5"
|
|
"github.com/pika-monitor/pika/internal/service"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type AlertRuleHandler struct {
|
|
logger *zap.Logger
|
|
ruleService *service.AlertRuleService
|
|
agentService *service.AgentService
|
|
}
|
|
|
|
func NewAlertRuleHandler(logger *zap.Logger, ruleService *service.AlertRuleService, agentService *service.AgentService) *AlertRuleHandler {
|
|
return &AlertRuleHandler{
|
|
logger: logger,
|
|
ruleService: ruleService,
|
|
agentService: agentService,
|
|
}
|
|
}
|
|
|
|
func (h *AlertRuleHandler) List(c *echo.Context) error {
|
|
keyword := c.QueryParam("keyword")
|
|
enabled := c.QueryParam("enabled")
|
|
|
|
pr := orz.GetPageRequest(c, "priority")
|
|
|
|
builder := orz.NewPageBuilder(h.ruleService.AlertRuleRepo).
|
|
PageRequest(pr).
|
|
Keyword([]string{"name"}, keyword)
|
|
|
|
if enabled == "true" {
|
|
builder.Equal("enabled", "1")
|
|
} else if enabled == "false" {
|
|
builder.Equal("enabled", "0")
|
|
}
|
|
|
|
ctx := c.Request().Context()
|
|
page, err := builder.Execute(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 填充主机名称
|
|
var agentIds []string
|
|
for _, item := range page.Items {
|
|
if len(item.AgentIds) > 0 {
|
|
agentIds = append(agentIds, item.AgentIds...)
|
|
}
|
|
}
|
|
if len(agentIds) > 0 {
|
|
agents, err := h.agentService.AgentRepo.FindByIdIn(ctx, agentIds)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
agentNameMap := make(map[string]string)
|
|
for _, agent := range agents {
|
|
agentNameMap[agent.ID] = agent.Name
|
|
}
|
|
|
|
for i, rule := range page.Items {
|
|
for _, agentId := range rule.AgentIds {
|
|
page.Items[i].AgentNames = append(page.Items[i].AgentNames, agentNameMap[agentId])
|
|
}
|
|
}
|
|
}
|
|
|
|
return orz.Ok(c, page)
|
|
}
|
|
|
|
func (h *AlertRuleHandler) Create(c *echo.Context) error {
|
|
var req service.AlertRuleRequest
|
|
if err := c.Bind(&req); err != nil {
|
|
return orz.NewError(400, "请求参数错误")
|
|
}
|
|
|
|
item, err := h.ruleService.CreateRule(c.Request().Context(), &req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return orz.Ok(c, item)
|
|
}
|
|
|
|
func (h *AlertRuleHandler) Update(c *echo.Context) error {
|
|
id := c.Param("id")
|
|
|
|
var req service.AlertRuleRequest
|
|
if err := c.Bind(&req); err != nil {
|
|
return orz.NewError(400, "请求参数错误")
|
|
}
|
|
|
|
item, err := h.ruleService.UpdateRule(c.Request().Context(), id, &req)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return orz.Ok(c, item)
|
|
}
|
|
|
|
func (h *AlertRuleHandler) Delete(c *echo.Context) error {
|
|
id := c.Param("id")
|
|
|
|
if err := h.ruleService.DeleteRule(c.Request().Context(), id); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Enable 启用告警规则
|
|
func (h *AlertRuleHandler) Enable(c *echo.Context) error {
|
|
id := c.Param("id")
|
|
|
|
if err := h.ruleService.UpdateRuleEnabled(c.Request().Context(), id, true); err != nil {
|
|
return err
|
|
}
|
|
return orz.Ok(c, orz.Map{})
|
|
}
|
|
|
|
// Disable 停用告警规则
|
|
func (h *AlertRuleHandler) Disable(c *echo.Context) error {
|
|
id := c.Param("id")
|
|
|
|
if err := h.ruleService.UpdateRuleEnabled(c.Request().Context(), id, false); err != nil {
|
|
return err
|
|
}
|
|
return orz.Ok(c, orz.Map{})
|
|
}
|