diff --git a/pkg/rtc/participant_traffic_load.go b/pkg/rtc/participant_traffic_load.go index eef44ad5e..87b8b9ef2 100644 --- a/pkg/rtc/participant_traffic_load.go +++ b/pkg/rtc/participant_traffic_load.go @@ -144,7 +144,7 @@ func (p *ParticipantTrafficLoad) updateTrafficLoad() *types.TrafficLoad { trafficTypeStats := make([]*types.TrafficTypeStats, 0, 6) addTypeStats := func(statsList []*types.TrafficStats, trackType livekit.TrackType, streamType livekit.StreamType) { - agg := types.AggregateTrafficStats(statsList) + agg := types.AggregateTrafficStats(statsList...) if agg != nil { trafficTypeStats = append(trafficTypeStats, &types.TrafficTypeStats{ TrackType: trackType, diff --git a/pkg/rtc/types/trafficstats.go b/pkg/rtc/types/trafficstats.go index 70b269db8..d6021958e 100644 --- a/pkg/rtc/types/trafficstats.go +++ b/pkg/rtc/types/trafficstats.go @@ -21,10 +21,12 @@ import ( ) type TrafficStats struct { - StartTime time.Time - EndTime time.Time - Packets uint32 - Bytes uint64 + StartTime time.Time + EndTime time.Time + Packets uint32 + PacketsLost uint32 + PacketsPadding uint32 + Bytes uint64 } type TrafficTypeStats struct { @@ -49,22 +51,30 @@ func RTPStatsDiffToTrafficStats(before, after *livekit.RTPStats) *TrafficStats { if before == nil { return &TrafficStats{ - StartTime: startTime.AsTime(), - EndTime: after.EndTime.AsTime(), - Packets: after.Packets, - Bytes: after.Bytes + after.BytesDuplicate + after.BytesPadding, + StartTime: startTime.AsTime(), + EndTime: after.EndTime.AsTime(), + Packets: after.Packets, + PacketsLost: after.PacketsLost, + PacketsPadding: after.PacketsPadding, + Bytes: after.Bytes + after.BytesDuplicate + after.BytesPadding, } } + packetsLost := uint32(0) + if after.PacketsLost >= before.PacketsLost { + packetsLost = after.PacketsLost - before.PacketsLost + } return &TrafficStats{ - StartTime: startTime.AsTime(), - EndTime: after.EndTime.AsTime(), - Packets: after.Packets - before.Packets, - Bytes: (after.Bytes + after.BytesDuplicate + after.BytesPadding) - (before.Bytes + before.BytesDuplicate + before.BytesPadding), + StartTime: startTime.AsTime(), + EndTime: after.EndTime.AsTime(), + Packets: after.Packets - before.Packets, + PacketsLost: packetsLost, + PacketsPadding: after.PacketsPadding - before.PacketsPadding, + Bytes: (after.Bytes + after.BytesDuplicate + after.BytesPadding) - (before.Bytes + before.BytesDuplicate + before.BytesPadding), } } -func AggregateTrafficStats(statsList []*TrafficStats) *TrafficStats { +func AggregateTrafficStats(statsList ...*TrafficStats) *TrafficStats { if len(statsList) == 0 { return nil } @@ -73,6 +83,8 @@ func AggregateTrafficStats(statsList []*TrafficStats) *TrafficStats { endTime := time.Time{} packets := uint32(0) + packetsLost := uint32(0) + packetsPadding := uint32(0) bytes := uint64(0) for _, stats := range statsList { @@ -85,6 +97,8 @@ func AggregateTrafficStats(statsList []*TrafficStats) *TrafficStats { } packets += stats.Packets + packetsLost += stats.PacketsLost + packetsPadding += stats.PacketsPadding bytes += stats.Bytes } @@ -92,10 +106,12 @@ func AggregateTrafficStats(statsList []*TrafficStats) *TrafficStats { endTime = time.Now() } return &TrafficStats{ - StartTime: startTime, - EndTime: endTime, - Packets: packets, - Bytes: bytes, + StartTime: startTime, + EndTime: endTime, + Packets: packets, + PacketsLost: packetsLost, + PacketsPadding: packetsPadding, + Bytes: bytes, } }