gcx/blockchain/bridge-monitor/internal/monitor/alerter.go

59 lines
1.5 KiB
Go

package monitor
import (
"bytes"
"encoding/json"
"net/http"
log "github.com/sirupsen/logrus"
)
// Alerter 告警系统
type Alerter struct {
webhookURL string
}
func NewAlerter(webhookURL string) *Alerter {
return &Alerter{webhookURL: webhookURL}
}
// Critical 发送严重告警
func (a *Alerter) Critical(message string, details map[string]interface{}) {
log.WithFields(log.Fields(details)).Error("[CRITICAL] " + message)
a.sendWebhook("critical", message, details)
}
// Warning 发送警告
func (a *Alerter) Warning(message string, details map[string]interface{}) {
log.WithFields(log.Fields(details)).Warn("[WARNING] " + message)
a.sendWebhook("warning", message, details)
}
// EmergencyPause 触发桥紧急暂停
func (a *Alerter) EmergencyPause() {
log.Error("[EMERGENCY] Triggering bridge pause via governance multisig")
// 实际实现:调用 Governance 合约的紧急暂停提案
a.sendWebhook("emergency", "Bridge emergency pause triggered", nil)
}
func (a *Alerter) sendWebhook(severity, message string, details map[string]interface{}) {
if a.webhookURL == "" {
return
}
payload := map[string]interface{}{
"severity": severity,
"message": message,
"details": details,
"source": "genex-bridge-monitor",
}
body, _ := json.Marshal(payload)
resp, err := http.Post(a.webhookURL, "application/json", bytes.NewBuffer(body))
if err != nil {
log.WithError(err).Error("Failed to send webhook alert")
return
}
defer resp.Body.Close()
}