Log connection quality changes. (#3311)

Also remove the connection quality drop prom as it is unused and also
adds state/complexity.
This commit is contained in:
Raja Subramanian
2025-01-07 10:58:31 +05:30
committed by GitHub
parent ca767a988e
commit 3b0077f2fe
2 changed files with 13 additions and 58 deletions
+12 -47
View File
@@ -253,7 +253,7 @@ type ParticipantImpl struct {
supervisor *supervisor.ParticipantSupervisor
tracksQuality map[livekit.TrackID]livekit.ConnectionQuality
connectionQuality livekit.ConnectionQuality
metricTimestamper *metric.MetricTimestamper
metricsCollector *metric.MetricsCollector
@@ -292,9 +292,9 @@ func NewParticipant(params ParticipantParams) (*ParticipantImpl, error) {
params.SID,
params.Telemetry,
),
tracksQuality: make(map[livekit.TrackID]livekit.ConnectionQuality),
pubLogger: params.Logger.WithComponent(sutils.ComponentPub),
subLogger: params.Logger.WithComponent(sutils.ComponentSub),
connectionQuality: livekit.ConnectionQuality_EXCELLENT,
pubLogger: params.Logger.WithComponent(sutils.ComponentPub),
subLogger: params.Logger.WithComponent(sutils.ComponentSub),
}
if !params.DisableSupervisor {
p.supervisor = supervisor.NewParticipantSupervisor(supervisor.ParticipantSupervisorParams{Logger: params.Logger})
@@ -1249,17 +1249,10 @@ func (p *ParticipantImpl) OnICEConfigChanged(f func(participant types.LocalParti
}
func (p *ParticipantImpl) GetConnectionQuality() *livekit.ConnectionQualityInfo {
numTracks := 0
minQuality := livekit.ConnectionQuality_EXCELLENT
minScore := connectionquality.MaxMOS
numUpDrops := 0
numDownDrops := 0
availableTracks := make(map[livekit.TrackID]bool)
for _, pt := range p.GetPublishedTracks() {
numTracks++
score, quality := pt.(types.LocalMediaTrack).GetConnectionScoreAndQuality()
if utils.IsConnectionQualityLower(minQuality, quality) {
minQuality = quality
@@ -1267,24 +1260,10 @@ func (p *ParticipantImpl) GetConnectionQuality() *livekit.ConnectionQualityInfo
} else if quality == minQuality && score < minScore {
minScore = score
}
p.lock.Lock()
trackID := pt.ID()
if prevQuality, ok := p.tracksQuality[trackID]; ok {
if utils.IsConnectionQualityLower(prevQuality, quality) {
numUpDrops++
}
}
p.tracksQuality[trackID] = quality
p.lock.Unlock()
availableTracks[trackID] = true
}
subscribedTracks := p.SubscriptionManager.GetSubscribedTracks()
for _, subTrack := range subscribedTracks {
numTracks++
score, quality := subTrack.DownTrack().GetConnectionScoreAndQuality()
if utils.IsConnectionQualityLower(minQuality, quality) {
minQuality = quality
@@ -1292,35 +1271,21 @@ func (p *ParticipantImpl) GetConnectionQuality() *livekit.ConnectionQualityInfo
} else if quality == minQuality && score < minScore {
minScore = score
}
p.lock.Lock()
trackID := subTrack.ID()
if prevQuality, ok := p.tracksQuality[trackID]; ok {
if utils.IsConnectionQualityLower(prevQuality, quality) {
numDownDrops++
}
}
p.tracksQuality[trackID] = quality
p.lock.Unlock()
availableTracks[trackID] = true
}
prometheus.RecordQuality(minQuality, minScore, numUpDrops, numDownDrops)
// remove unavailable tracks from track quality cache
p.lock.Lock()
for trackID := range p.tracksQuality {
if !availableTracks[trackID] {
delete(p.tracksQuality, trackID)
}
}
p.lock.Unlock()
prometheus.RecordQuality(minQuality, minScore)
if minQuality == livekit.ConnectionQuality_LOST && !p.ProtocolVersion().SupportsConnectionQualityLost() {
minQuality = livekit.ConnectionQuality_POOR
}
p.lock.Lock()
if minQuality != p.connectionQuality {
p.params.Logger.Debugw("connection quality changed", "from", p.connectionQuality, "to", minQuality)
}
p.connectionQuality = minQuality
p.lock.Unlock()
return &livekit.ConnectionQualityInfo{
ParticipantSid: string(p.ID()),
Quality: minQuality,
+1 -11
View File
@@ -23,7 +23,6 @@ import (
var (
qualityRating prometheus.Histogram
qualityScore prometheus.Histogram
qualityDrop *prometheus.CounterVec
)
func initQualityStats(nodeID string, nodeType livekit.NodeType) {
@@ -41,21 +40,12 @@ func initQualityStats(nodeID string, nodeType livekit.NodeType) {
ConstLabels: prometheus.Labels{"node_id": nodeID, "node_type": nodeType.String()},
Buckets: []float64{1.0, 2.0, 2.5, 3.0, 3.25, 3.5, 3.75, 4.0, 4.25, 4.5},
})
qualityDrop = prometheus.NewCounterVec(prometheus.CounterOpts{
Namespace: livekitNamespace,
Subsystem: "quality",
Name: "drop",
ConstLabels: prometheus.Labels{"node_id": nodeID, "node_type": nodeType.String()},
}, []string{"direction"})
prometheus.MustRegister(qualityRating)
prometheus.MustRegister(qualityScore)
prometheus.MustRegister(qualityDrop)
}
func RecordQuality(rating livekit.ConnectionQuality, score float32, numUpDrops int, numDownDrops int) {
func RecordQuality(rating livekit.ConnectionQuality, score float32) {
qualityRating.Observe(float64(rating))
qualityScore.Observe(float64(score))
qualityDrop.WithLabelValues("up").Add(float64(numUpDrops))
qualityDrop.WithLabelValues("down").Add(float64(numDownDrops))
}