[优化] 修复

This commit is contained in:
ryan
2026-06-01 16:19:59 +08:00
parent 31d10195ca
commit b968043117
2 changed files with 55 additions and 1 deletions
+24 -1
View File
@@ -276,12 +276,21 @@ func persistNodeAccessLogs(tx *gorm.DB, nodeID string, logs []AgentNodeAccessLog
}
func reconcileNodeHealthEvents(tx *gorm.DB, nodeID string, events []AgentNodeHealthEvent, reportedAt time.Time) error {
return reconcileScopedNodeHealthEvents(tx, nodeID, events, reportedAt, nil)
}
func reconcileScopedNodeHealthEvents(tx *gorm.DB, nodeID string, events []AgentNodeHealthEvent, reportedAt time.Time, managedEventTypes map[string]struct{}) error {
activeTypes := make(map[string]AgentNodeHealthEvent, len(events))
for _, event := range events {
eventType := normalizeHealthEventType(event.EventType)
if eventType == "" {
continue
}
if len(managedEventTypes) > 0 {
if _, ok := managedEventTypes[eventType]; !ok {
continue
}
}
event.EventType = eventType
event.Severity = normalizeHealthSeverity(event.Severity)
if event.TriggeredAtUnix <= 0 {
@@ -291,7 +300,21 @@ func reconcileNodeHealthEvents(tx *gorm.DB, nodeID string, events []AgentNodeHea
}
var activeEvents []*model.NodeHealthEvent
if err := tx.Where("node_id = ? AND status = ?", nodeID, NodeHealthEventStatusActive).Find(&activeEvents).Error; err != nil {
query := tx.Where("node_id = ? AND status = ?", nodeID, NodeHealthEventStatusActive)
if len(managedEventTypes) > 0 {
scopedTypes := make([]string, 0, len(managedEventTypes))
for eventType := range managedEventTypes {
eventType = normalizeHealthEventType(eventType)
if eventType != "" {
scopedTypes = append(scopedTypes, eventType)
}
}
if len(scopedTypes) == 0 {
return nil
}
query = query.Where("event_type IN ?", scopedTypes)
}
if err := query.Find(&activeEvents).Error; err != nil {
return err
}
+31
View File
@@ -7,6 +7,8 @@ import (
"openflare/model"
"strings"
"time"
"gorm.io/gorm"
)
// RelayHeartbeatPayload is the payload sent by OpenFlareRelay in each heartbeat.
@@ -23,6 +25,8 @@ type RelayHeartbeatPayload struct {
HealthEvents []AgentNodeHealthEvent `json:"health_events,omitempty"`
}
const relayFrpsUnhealthyEventType = "frps_unhealthy"
// RelayConfig is the frps configuration sent to the Relay.
type RelayConfig struct {
BindPort int `json:"bind_port"`
@@ -98,6 +102,9 @@ func HeartbeatRelay(node *model.Node, payload RelayHeartbeatPayload) (*RelayHear
return nil, fmt.Errorf("update relay heartbeat: %w", err)
}
}
if err := reconcileRelayHealthEvents(node.NodeID, payload.RelayStatus, now); err != nil {
return nil, fmt.Errorf("reconcile relay health events: %w", err)
}
refreshAccessTokenCache(node)
persistRelayHeartbeatObservability(node.NodeID, payload, node.LastSeenAt)
@@ -142,6 +149,30 @@ func buildRelaySettings() *RelaySettings {
}
}
func reconcileRelayHealthEvents(nodeID string, relayStatus string, reportedAt time.Time) error {
if relayStatus == "unknown" {
return nil
}
managedTypes := map[string]struct{}{
relayFrpsUnhealthyEventType: {},
}
events := []AgentNodeHealthEvent{}
if relayStatus == "unhealthy" {
events = append(events, AgentNodeHealthEvent{
EventType: relayFrpsUnhealthyEventType,
Severity: NodeHealthSeverityCritical,
Message: "frps runtime is not healthy",
TriggeredAtUnix: reportedAt.Unix(),
Metadata: map[string]string{
"relay_status": relayStatus,
},
})
}
return model.DB.Transaction(func(tx *gorm.DB) error {
return reconcileScopedNodeHealthEvents(tx, nodeID, events, reportedAt, managedTypes)
})
}
func normalizeRelayStatus(status string) string {
switch strings.ToLower(strings.TrimSpace(status)) {
case "healthy":