完善直播节点监控与边缘代理

This commit is contained in:
admin committed 2026-08-12 21:14:42 +08:00
1 parent 058bb4b99f
commit 20cd99efa4
19 files changed
+401 -47

No files matched your search

+54 -13
View File
@@ -5,17 +5,19 @@ import (
"fmt"
"log"
"os"
"sync"
"time"
)
type Config struct {
NodeName string
OriginURL string
HlsPort int
ApiPort int
Subnet string
DataDir string
Weight int
NodeName string
OriginURL string
DiscoveryURL string
HlsPort int
ApiPort int
Subnet string
DataDir string
Weight int
}
type Agent struct {
@@ -26,6 +28,8 @@ type Agent struct {
monitor *Monitor
nodeID string
stopCh chan struct{}
connected bool
mu sync.RWMutex
}
func New(cfg Config, mtxFS embed.FS) (*Agent, error) {
@@ -42,6 +46,13 @@ func (a *Agent) Start() error {
return fmt.Errorf("create data dir: %w", err)
}
a.hb = NewHeartbeat(a.cfg, a.nodeID)
if err := a.hb.Discover(); err != nil {
log.Printf("Warning: initial discovery failed: %v (will retry every 10 seconds)", err)
} else {
a.cfg.OriginURL = a.hb.OriginURL()
}
a.mtx = NewMediaMTXManager(a.cfg, a.mediamtxFS)
if err := a.mtx.Extract(); err != nil {
return fmt.Errorf("extract mediamtx: %w", err)
@@ -56,12 +67,10 @@ func (a *Agent) Start() error {
}
a.monitor = NewMonitor()
a.hb = NewHeartbeat(a.cfg, a.nodeID)
time.Sleep(2 * time.Second)
if err := a.hb.Register(); err != nil {
log.Printf("Warning: registration failed: %v (will retry)", err)
if err := a.connect(); err != nil {
log.Printf("Warning: connection failed: %v (will retry every 10 seconds)", err)
}
go a.heartbeatLoop()
@@ -87,8 +96,15 @@ func (a *Agent) heartbeatLoop() {
case <-a.stopCh:
return
case <-ticker.C:
if !a.Connected() {
if err := a.connect(); err != nil {
log.Printf("Connection retry failed: %v", err)
continue
}
}
metrics := a.monitor.Snapshot()
if err := a.hb.Send(metrics); err != nil {
a.setConnected(false)
log.Printf("Heartbeat error: %v", err)
}
}
@@ -104,12 +120,37 @@ func (a *Agent) monitorLoop() {
return
case <-ticker.C:
a.monitor.Tick()
if a.mtx != nil {
a.monitor.SetMediaMetrics(a.mtx.Metrics())
}
}
}
}
func (a *Agent) NodeID() string { return a.nodeID }
func (a *Agent) Config() Config { return a.cfg }
func (a *Agent) NodeID() string { return a.nodeID }
func (a *Agent) Config() Config { return a.cfg }
func (a *Agent) Connected() bool {
a.mu.RLock()
defer a.mu.RUnlock()
return a.connected
}
func (a *Agent) setConnected(connected bool) {
a.mu.Lock()
a.connected = connected
a.mu.Unlock()
}
func (a *Agent) connect() error {
if err := a.hb.Discover(); err != nil {
return err
}
if err := a.hb.Register(); err != nil {
return err
}
a.setConnected(true)
return nil
}
func (a *Agent) Metrics() Metrics {
if a.monitor != nil {
return a.monitor.Snapshot()