完善直播节点监控与边缘代理
This commit is contained in:
1 parent
058bb4b99f
commit
20cd99efa4
19 files changed
+401
-47
No files matched your search
+54
-13
@@ -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()
|
||||
|
||||
Reference in new issue
Block a user