feat(api): add log webhook notification service

Implement webhook notifications for log error threshold alerts with
configurable thresholds, time windows, and cooldown periods.

- Add LogWebhookService with Redis-backed configuration storage
- Add admin endpoints for webhook config management (GET/PUT)
- Trigger webhook notifications when error count exceeds threshold
- Support status code threshold and error message detection
- Include sample log record data in webhook payload
This commit is contained in:
zenfun
2025-12-21 14:13:35 +08:00
parent 00192f937e
commit 4c1e03f83d
6 changed files with 505 additions and 6 deletions

View File

@@ -17,14 +17,21 @@ import (
)
type Handler struct {
db *gorm.DB
sync *service.SyncService
logger *service.LogWriter
rdb *redis.Client
db *gorm.DB
sync *service.SyncService
logger *service.LogWriter
rdb *redis.Client
logWebhook *service.LogWebhookService
}
func NewHandler(db *gorm.DB, sync *service.SyncService, logger *service.LogWriter, rdb *redis.Client) *Handler {
return &Handler{db: db, sync: sync, logger: logger, rdb: rdb}
return &Handler{
db: db,
sync: sync,
logger: logger,
rdb: rdb,
logWebhook: service.NewLogWebhookService(rdb),
}
}
// CreateKey is now handled by MasterHandler
@@ -471,7 +478,13 @@ func (h *Handler) IngestLog(c *gin.Context) {
}
// By default, only metadata is expected; payload fields may be empty.
h.logger.Write(rec)
if h.logger != nil {
h.logger.Write(rec)
}
if h.logWebhook != nil {
recCopy := rec
go h.logWebhook.NotifyIfNeeded(context.Background(), recCopy)
}
c.JSON(http.StatusAccepted, gin.H{"status": "queued"})
}