完善直播节点监控与边缘代理
This commit is contained in:
1 parent
058bb4b99f
commit
20cd99efa4
19 files changed
+401
-47
No files matched your search
@@ -1,6 +1,7 @@
|
||||
package agent
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"embed"
|
||||
"fmt"
|
||||
"io"
|
||||
@@ -9,6 +10,7 @@ import (
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type MediaMTXManager struct {
|
||||
@@ -17,6 +19,15 @@ type MediaMTXManager struct {
|
||||
binPath string
|
||||
configPath string
|
||||
cmd *exec.Cmd
|
||||
mu sync.RWMutex
|
||||
metrics MediaMetrics
|
||||
}
|
||||
|
||||
type MediaMetrics struct {
|
||||
ViewerCount int
|
||||
FrameDrops int
|
||||
PacketLoss int
|
||||
Available bool
|
||||
}
|
||||
|
||||
func NewMediaMTXManager(cfg Config, fs embed.FS) *MediaMTXManager {
|
||||
@@ -116,14 +127,57 @@ paths:
|
||||
|
||||
func (m *MediaMTXManager) Start() error {
|
||||
m.cmd = exec.Command(m.binPath, m.configPath)
|
||||
m.cmd.Stdout = os.Stdout
|
||||
m.cmd.Stderr = os.Stderr
|
||||
stdout, err := m.cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
return fmt.Errorf("capture mediamtx stdout: %w", err)
|
||||
}
|
||||
stderr, err := m.cmd.StderrPipe()
|
||||
if err != nil {
|
||||
return fmt.Errorf("capture mediamtx stderr: %w", err)
|
||||
}
|
||||
if err := m.cmd.Start(); err != nil {
|
||||
return fmt.Errorf("start mediamtx: %w", err)
|
||||
}
|
||||
go m.parseLogs(stdout)
|
||||
go m.parseLogs(stderr)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MediaMTXManager) parseLogs(reader io.Reader) {
|
||||
scanner := bufio.NewScanner(reader)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
fmt.Fprintln(os.Stdout, line)
|
||||
lower := strings.ToLower(line)
|
||||
m.mu.Lock()
|
||||
if strings.Contains(lower, "reader opened") || strings.Contains(lower, "hls client connected") {
|
||||
m.metrics.Available = true
|
||||
m.metrics.ViewerCount++
|
||||
}
|
||||
if strings.Contains(lower, "reader closed") || strings.Contains(lower, "hls client disconnected") {
|
||||
m.metrics.Available = true
|
||||
if m.metrics.ViewerCount > 0 {
|
||||
m.metrics.ViewerCount--
|
||||
}
|
||||
}
|
||||
if strings.Contains(lower, "frame drop") || strings.Contains(lower, "dropped frame") {
|
||||
m.metrics.Available = true
|
||||
m.metrics.FrameDrops++
|
||||
}
|
||||
if strings.Contains(lower, "packet loss") || strings.Contains(lower, "lost packet") {
|
||||
m.metrics.Available = true
|
||||
m.metrics.PacketLoss++
|
||||
}
|
||||
m.mu.Unlock()
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MediaMTXManager) Metrics() MediaMetrics {
|
||||
m.mu.RLock()
|
||||
defer m.mu.RUnlock()
|
||||
return m.metrics
|
||||
}
|
||||
|
||||
func (m *MediaMTXManager) Stop() {
|
||||
if m.cmd != nil && m.cmd.Process != nil {
|
||||
m.cmd.Process.Kill()
|
||||
|
||||
Reference in new issue
Block a user