diff --git a/pkg/telemetry/prometheus/rooms.go b/pkg/telemetry/prometheus/rooms.go index 69f013170..e25703971 100644 --- a/pkg/telemetry/prometheus/rooms.go +++ b/pkg/telemetry/prometheus/rooms.go @@ -44,7 +44,8 @@ var ( promParticipantCurrent prometheus.Gauge promTrackPublishedCurrent *prometheus.GaugeVec promTrackSubscribedCurrent *prometheus.GaugeVec - promTrackPacketTrailerCurrent *prometheus.GaugeVec + promTrackPacketTrailerCurrent prometheus.Gauge + promTrackPacketTrailerByFeatureCurrent *prometheus.GaugeVec promTrackPublishCounter *prometheus.CounterVec promTrackSubscribeCounter *prometheus.CounterVec promSessionJoinLatency *prometheus.HistogramVec @@ -89,16 +90,23 @@ func initRoomStats(nodeID string, nodeType livekit.NodeType) { Name: "subscribed_total", ConstLabels: prometheus.Labels{"node_id": nodeID, "node_type": nodeType.String()}, }, []string{"kind"}) - promTrackPacketTrailerCurrent = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + promTrackPacketTrailerCurrent = prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: livekitNamespace, Subsystem: "track", Name: "packet_trailer_total", + Help: "Current number of published video tracks with packet trailers enabled.", + ConstLabels: prometheus.Labels{"node_id": nodeID, "node_type": nodeType.String()}, + }) + promTrackPacketTrailerByFeatureCurrent = prometheus.NewGaugeVec(prometheus.GaugeOpts{ + Namespace: livekitNamespace, + Subsystem: "track", + Name: "packet_trailer_feature_total", Help: "Current number of published video tracks by enabled packet trailer feature.", ConstLabels: prometheus.Labels{"node_id": nodeID, "node_type": nodeType.String()}, }, []string{"feature"}) for value := range livekit.PacketTrailerFeature_name { feature := livekit.PacketTrailerFeature(value) - promTrackPacketTrailerCurrent.WithLabelValues(feature.String()).Set(0) + promTrackPacketTrailerByFeatureCurrent.WithLabelValues(feature.String()).Set(0) } promTrackPublishCounter = prometheus.NewCounterVec(prometheus.CounterOpts{ Namespace: livekitNamespace, @@ -153,6 +161,7 @@ func initRoomStats(nodeID string, nodeType livekit.NodeType) { prometheus.MustRegister(promTrackPublishedCurrent) prometheus.MustRegister(promTrackSubscribedCurrent) prometheus.MustRegister(promTrackPacketTrailerCurrent) + prometheus.MustRegister(promTrackPacketTrailerByFeatureCurrent) prometheus.MustRegister(promTrackPublishCounter) prometheus.MustRegister(promTrackSubscribeCounter) prometheus.MustRegister(promSessionJoinLatency) @@ -213,8 +222,9 @@ func updatePacketTrailerTracks(track *livekit.TrackInfo, delta float64) { return } + promTrackPacketTrailerCurrent.Add(delta) for _, feature := range features { - promTrackPacketTrailerCurrent.WithLabelValues(feature).Add(delta) + promTrackPacketTrailerByFeatureCurrent.WithLabelValues(feature).Add(delta) } } diff --git a/pkg/telemetry/prometheus/rooms_test.go b/pkg/telemetry/prometheus/rooms_test.go index 12e55ffb3..53cc40ecc 100644 --- a/pkg/telemetry/prometheus/rooms_test.go +++ b/pkg/telemetry/prometheus/rooms_test.go @@ -39,33 +39,36 @@ func TestPacketTrailerTrackMetrics(t *testing.T) { }, } - timestampBefore := gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_USER_TIMESTAMP")) - frameIDBefore := gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_FRAME_ID")) - userDataBefore := gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_USER_DATA")) - unknownBefore := gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("UNKNOWN")) + trailerBefore := gaugeValue(t, promTrackPacketTrailerCurrent) + timestampBefore := gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_USER_TIMESTAMP")) + frameIDBefore := gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_FRAME_ID")) + userDataBefore := gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_USER_DATA")) + unknownBefore := gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("UNKNOWN")) AddPacketTrailerTrack(track) - require.Equal(t, timestampBefore+1, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_USER_TIMESTAMP"))) - require.Equal(t, frameIDBefore+1, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_FRAME_ID"))) - require.Equal(t, userDataBefore+1, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_USER_DATA"))) - require.Equal(t, unknownBefore+1, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("UNKNOWN"))) + require.Equal(t, trailerBefore+1, gaugeValue(t, promTrackPacketTrailerCurrent)) + require.Equal(t, timestampBefore+1, gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_USER_TIMESTAMP"))) + require.Equal(t, frameIDBefore+1, gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_FRAME_ID"))) + require.Equal(t, userDataBefore+1, gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_USER_DATA"))) + require.Equal(t, unknownBefore+1, gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("UNKNOWN"))) SubPacketTrailerTrack(track) - require.Equal(t, timestampBefore, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_USER_TIMESTAMP"))) - require.Equal(t, frameIDBefore, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_FRAME_ID"))) - require.Equal(t, userDataBefore, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_USER_DATA"))) - require.Equal(t, unknownBefore, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("UNKNOWN"))) + require.Equal(t, trailerBefore, gaugeValue(t, promTrackPacketTrailerCurrent)) + require.Equal(t, timestampBefore, gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_USER_TIMESTAMP"))) + require.Equal(t, frameIDBefore, gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_FRAME_ID"))) + require.Equal(t, userDataBefore, gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("PTF_USER_DATA"))) + require.Equal(t, unknownBefore, gaugeValue(t, promTrackPacketTrailerByFeatureCurrent.WithLabelValues("UNKNOWN"))) } func TestPacketTrailerTrackMetricsIgnoreAudio(t *testing.T) { require.NoError(t, Init("test", livekit.NodeType_SERVER)) - before := gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_USER_DATA")) + before := gaugeValue(t, promTrackPacketTrailerCurrent) AddPacketTrailerTrack(&livekit.TrackInfo{ Type: livekit.TrackType_AUDIO, PacketTrailerFeatures: []livekit.PacketTrailerFeature{livekit.PacketTrailerFeature_PTF_USER_DATA}, }) - require.Equal(t, before, gaugeValue(t, promTrackPacketTrailerCurrent.WithLabelValues("PTF_USER_DATA"))) + require.Equal(t, before, gaugeValue(t, promTrackPacketTrailerCurrent)) } func gaugeValue(t *testing.T, gauge promclient.Gauge) float64 {