mirror of
https://github.com/jech/galene.git
synced 2024-11-22 16:45:58 +01:00
Split out statistics functions into stats.go.
This commit is contained in:
parent
1fe64e15f0
commit
0064aa6fd2
2 changed files with 130 additions and 123 deletions
123
group.go
123
group.go
|
@ -17,8 +17,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pion/webrtc/v3"
|
"github.com/pion/webrtc/v3"
|
||||||
|
|
||||||
"sfu/rtptime"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type chatHistoryEntry struct {
|
type chatHistoryEntry struct {
|
||||||
|
@ -489,124 +487,3 @@ func readPublicGroups() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type groupStats struct {
|
|
||||||
name string
|
|
||||||
clients []clientStats
|
|
||||||
}
|
|
||||||
|
|
||||||
type clientStats struct {
|
|
||||||
id string
|
|
||||||
up, down []connStats
|
|
||||||
}
|
|
||||||
|
|
||||||
type connStats struct {
|
|
||||||
id string
|
|
||||||
maxBitrate uint64
|
|
||||||
tracks []trackStats
|
|
||||||
}
|
|
||||||
|
|
||||||
type trackStats struct {
|
|
||||||
bitrate uint64
|
|
||||||
maxBitrate uint64
|
|
||||||
loss uint8
|
|
||||||
rtt time.Duration
|
|
||||||
jitter time.Duration
|
|
||||||
}
|
|
||||||
|
|
||||||
func getGroupStats() []groupStats {
|
|
||||||
names := getGroupNames()
|
|
||||||
|
|
||||||
gs := make([]groupStats, 0, len(names))
|
|
||||||
for _, name := range names {
|
|
||||||
g := getGroup(name)
|
|
||||||
if g == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
clients := g.getClients(nil)
|
|
||||||
stats := groupStats{
|
|
||||||
name: name,
|
|
||||||
clients: make([]clientStats, 0, len(clients)),
|
|
||||||
}
|
|
||||||
for _, c := range clients {
|
|
||||||
c, ok := c.(*webClient)
|
|
||||||
if ok {
|
|
||||||
cs := getClientStats(c)
|
|
||||||
stats.clients = append(stats.clients, cs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sort.Slice(stats.clients, func(i, j int) bool {
|
|
||||||
return stats.clients[i].id < stats.clients[j].id
|
|
||||||
})
|
|
||||||
gs = append(gs, stats)
|
|
||||||
}
|
|
||||||
sort.Slice(gs, func(i, j int) bool {
|
|
||||||
return gs[i].name < gs[j].name
|
|
||||||
})
|
|
||||||
|
|
||||||
return gs
|
|
||||||
}
|
|
||||||
|
|
||||||
func getClientStats(c *webClient) clientStats {
|
|
||||||
c.mu.Lock()
|
|
||||||
defer c.mu.Unlock()
|
|
||||||
|
|
||||||
cs := clientStats{
|
|
||||||
id: c.id,
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, up := range c.up {
|
|
||||||
conns := connStats{
|
|
||||||
id: up.id,
|
|
||||||
}
|
|
||||||
tracks := up.getTracks()
|
|
||||||
for _, t := range tracks {
|
|
||||||
expected, lost, _, _ := t.cache.GetStats(false)
|
|
||||||
if expected == 0 {
|
|
||||||
expected = 1
|
|
||||||
}
|
|
||||||
loss := uint8(lost * 100 / expected)
|
|
||||||
jitter := time.Duration(t.jitter.Jitter()) *
|
|
||||||
(time.Second / time.Duration(t.jitter.HZ()))
|
|
||||||
rate, _ := t.rate.Estimate()
|
|
||||||
conns.tracks = append(conns.tracks, trackStats{
|
|
||||||
bitrate: uint64(rate) * 8,
|
|
||||||
loss: loss,
|
|
||||||
jitter: jitter,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
cs.up = append(cs.up, conns)
|
|
||||||
}
|
|
||||||
sort.Slice(cs.up, func(i, j int) bool {
|
|
||||||
return cs.up[i].id < cs.up[j].id
|
|
||||||
})
|
|
||||||
|
|
||||||
jiffies := rtptime.Jiffies()
|
|
||||||
for _, down := range c.down {
|
|
||||||
conns := connStats{
|
|
||||||
id: down.id,
|
|
||||||
maxBitrate: down.GetMaxBitrate(jiffies),
|
|
||||||
}
|
|
||||||
for _, t := range down.tracks {
|
|
||||||
rate, _ := t.rate.Estimate()
|
|
||||||
rtt := rtptime.ToDuration(atomic.LoadUint64(&t.rtt),
|
|
||||||
rtptime.JiffiesPerSec)
|
|
||||||
loss, jitter := t.stats.Get(jiffies)
|
|
||||||
j := time.Duration(jitter) * time.Second /
|
|
||||||
time.Duration(t.track.Codec().ClockRate)
|
|
||||||
conns.tracks = append(conns.tracks, trackStats{
|
|
||||||
bitrate: uint64(rate) * 8,
|
|
||||||
maxBitrate: t.maxBitrate.Get(jiffies),
|
|
||||||
loss: uint8(uint32(loss) * 100 / 256),
|
|
||||||
rtt: rtt,
|
|
||||||
jitter: j,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
cs.down = append(cs.down, conns)
|
|
||||||
}
|
|
||||||
sort.Slice(cs.down, func(i, j int) bool {
|
|
||||||
return cs.down[i].id < cs.down[j].id
|
|
||||||
})
|
|
||||||
|
|
||||||
return cs
|
|
||||||
}
|
|
||||||
|
|
130
stats.go
Normal file
130
stats.go
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sort"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"sfu/rtptime"
|
||||||
|
)
|
||||||
|
|
||||||
|
type groupStats struct {
|
||||||
|
name string
|
||||||
|
clients []clientStats
|
||||||
|
}
|
||||||
|
|
||||||
|
type clientStats struct {
|
||||||
|
id string
|
||||||
|
up, down []connStats
|
||||||
|
}
|
||||||
|
|
||||||
|
type connStats struct {
|
||||||
|
id string
|
||||||
|
maxBitrate uint64
|
||||||
|
tracks []trackStats
|
||||||
|
}
|
||||||
|
|
||||||
|
type trackStats struct {
|
||||||
|
bitrate uint64
|
||||||
|
maxBitrate uint64
|
||||||
|
loss uint8
|
||||||
|
rtt time.Duration
|
||||||
|
jitter time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
func getGroupStats() []groupStats {
|
||||||
|
names := getGroupNames()
|
||||||
|
|
||||||
|
gs := make([]groupStats, 0, len(names))
|
||||||
|
for _, name := range names {
|
||||||
|
g := getGroup(name)
|
||||||
|
if g == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
clients := g.getClients(nil)
|
||||||
|
stats := groupStats{
|
||||||
|
name: name,
|
||||||
|
clients: make([]clientStats, 0, len(clients)),
|
||||||
|
}
|
||||||
|
for _, c := range clients {
|
||||||
|
c, ok := c.(*webClient)
|
||||||
|
if ok {
|
||||||
|
cs := getClientStats(c)
|
||||||
|
stats.clients = append(stats.clients, cs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sort.Slice(stats.clients, func(i, j int) bool {
|
||||||
|
return stats.clients[i].id < stats.clients[j].id
|
||||||
|
})
|
||||||
|
gs = append(gs, stats)
|
||||||
|
}
|
||||||
|
sort.Slice(gs, func(i, j int) bool {
|
||||||
|
return gs[i].name < gs[j].name
|
||||||
|
})
|
||||||
|
|
||||||
|
return gs
|
||||||
|
}
|
||||||
|
|
||||||
|
func getClientStats(c *webClient) clientStats {
|
||||||
|
c.mu.Lock()
|
||||||
|
defer c.mu.Unlock()
|
||||||
|
|
||||||
|
cs := clientStats{
|
||||||
|
id: c.id,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, up := range c.up {
|
||||||
|
conns := connStats{
|
||||||
|
id: up.id,
|
||||||
|
}
|
||||||
|
tracks := up.getTracks()
|
||||||
|
for _, t := range tracks {
|
||||||
|
expected, lost, _, _ := t.cache.GetStats(false)
|
||||||
|
if expected == 0 {
|
||||||
|
expected = 1
|
||||||
|
}
|
||||||
|
loss := uint8(lost * 100 / expected)
|
||||||
|
jitter := time.Duration(t.jitter.Jitter()) *
|
||||||
|
(time.Second / time.Duration(t.jitter.HZ()))
|
||||||
|
rate, _ := t.rate.Estimate()
|
||||||
|
conns.tracks = append(conns.tracks, trackStats{
|
||||||
|
bitrate: uint64(rate) * 8,
|
||||||
|
loss: loss,
|
||||||
|
jitter: jitter,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
cs.up = append(cs.up, conns)
|
||||||
|
}
|
||||||
|
sort.Slice(cs.up, func(i, j int) bool {
|
||||||
|
return cs.up[i].id < cs.up[j].id
|
||||||
|
})
|
||||||
|
|
||||||
|
jiffies := rtptime.Jiffies()
|
||||||
|
for _, down := range c.down {
|
||||||
|
conns := connStats{
|
||||||
|
id: down.id,
|
||||||
|
maxBitrate: down.GetMaxBitrate(jiffies),
|
||||||
|
}
|
||||||
|
for _, t := range down.tracks {
|
||||||
|
rate, _ := t.rate.Estimate()
|
||||||
|
rtt := rtptime.ToDuration(atomic.LoadUint64(&t.rtt),
|
||||||
|
rtptime.JiffiesPerSec)
|
||||||
|
loss, jitter := t.stats.Get(jiffies)
|
||||||
|
j := time.Duration(jitter) * time.Second /
|
||||||
|
time.Duration(t.track.Codec().ClockRate)
|
||||||
|
conns.tracks = append(conns.tracks, trackStats{
|
||||||
|
bitrate: uint64(rate) * 8,
|
||||||
|
maxBitrate: t.maxBitrate.Get(jiffies),
|
||||||
|
loss: uint8(uint32(loss) * 100 / 256),
|
||||||
|
rtt: rtt,
|
||||||
|
jitter: j,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
cs.down = append(cs.down, conns)
|
||||||
|
}
|
||||||
|
sort.Slice(cs.down, func(i, j int) bool {
|
||||||
|
return cs.down[i].id < cs.down[j].id
|
||||||
|
})
|
||||||
|
|
||||||
|
return cs
|
||||||
|
}
|
Loading…
Reference in a new issue