From facc822c4f5e0bc6ed8bb99f0b3ae0209ecfc8e7 Mon Sep 17 00:00:00 2001 From: splatoon Date: Thu, 8 Aug 2024 17:23:39 +0800 Subject: [PATCH] rtcp count --- monitor/count.go | 25 +++++++++++++++---------- monitor/register.go | 5 ++++- rtc/producer.go | 2 +- rtc/rtp_stream_recv.go | 4 ++-- rtc/transport.go | 11 +++++++++-- rtc/webrtc_transport.go | 1 - 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/monitor/count.go b/monitor/count.go index d14e55b..179dd83 100644 --- a/monitor/count.go +++ b/monitor/count.go @@ -20,23 +20,28 @@ func IceCount(direction DirectionType, packet PacketType) { // key frame count const ( - KeyframePkgRecv = "key_frame_recv" - KeyframePkgSend = "key_frame_send" - KeyframeRecvFIR = "recv_rtcp_fir" - KeyframeRecvPLI = "recv_rtcp_pli" - KeyframeSendFIR = "send_rtcp_fir" - KeyframeSendPLI = "send_rtcp_pli" + KeyframePkgRecv = "key_frame_recv" + KeyframePkgSend = "key_frame_send" + KeyframeRecvFIR = "recv_rtcp_fir" + KeyframeRecvPLI = "recv_rtcp_pli" + KeyframeSendFIR = "send_rtcp_fir" + KeyframeSendPLI = "send_rtcp_pli" + RtcpRecvNack = "recv_rtcp_nack" + RtcpRecvRemb = "recv_rtcp_remb" + RtcpSenderReport = "recv_rtcp_sr" + RtcpReceiverReport = "recv_rtcp_rr" + RtcpReceiverTransportLayerCC = "recv_rtcp_tcc" ) var ( - keyframeCount = prometheus.NewCounterVec(prometheus.CounterOpts{ - Namespace: "keyframe", + rtcpSSRCCount = prometheus.NewCounterVec(prometheus.CounterOpts{ + Namespace: "rtcp_ssrc", Name: "count", }, []string{"ssrc", "event"}) ) -func KeyframeCount(ssrc uint32, event string) { - keyframeCount.WithLabelValues(fmt.Sprintf("%d", ssrc), event).Inc() +func RtcpCountBySSRC(ssrc uint32, event string) { + rtcpSSRCCount.WithLabelValues(fmt.Sprintf("%d", ssrc), event).Inc() } // mediasoup count diff --git a/monitor/register.go b/monitor/register.go index 9bfcc0c..eb0e882 100644 --- a/monitor/register.go +++ b/monitor/register.go @@ -8,7 +8,7 @@ func register() { prometheus.MustRegister(rtcpCount) prometheus.MustRegister(iceCount) prometheus.MustRegister(mediasoupCount) - prometheus.MustRegister(keyframeCount) + prometheus.MustRegister(rtcpSSRCCount) } type DirectionType string @@ -44,6 +44,9 @@ const ( TraceVideo TraceType = "video" TraceRtpStream TraceType = "rtp_stream" TraceRtpRtxStream TraceType = "rtp_rtx_stream" + // rtcp type + TraceRtcpSourceDescription TraceType = "rtcp_source_description" + TraceRtcpGoodbye TraceType = "rtcp_goodbye" ) type EventType string diff --git a/rtc/producer.go b/rtc/producer.go index 1aa748e..7b27b8d 100644 --- a/rtc/producer.go +++ b/rtc/producer.go @@ -132,7 +132,7 @@ func (p *Producer) init(param producerParam) error { func (p *Producer) ReceiveRtpPacket(packet *rtpparser.Packet) (result ReceiveRtpPacketResult) { if p.Kind == FBS__RtpParameters.MediaKindVIDEO && packet.IsKeyFrame() { - monitor.KeyframeCount(packet.SSRC, monitor.KeyframePkgRecv) + monitor.RtcpCountBySSRC(packet.SSRC, monitor.KeyframePkgRecv) p.logger.Debug().Msg("isKeyFrame") } if p.Kind == FBS__RtpParameters.MediaKindVIDEO { diff --git a/rtc/rtp_stream_recv.go b/rtc/rtp_stream_recv.go index 16e31e0..4ea725a 100644 --- a/rtc/rtp_stream_recv.go +++ b/rtc/rtp_stream_recv.go @@ -115,14 +115,14 @@ func (r *RtpStreamRecv) RequestKeyFrame() { SenderSSRC: r.GetSsrc(), MediaSSRC: r.GetSsrc(), } - monitor.KeyframeCount(r.GetSsrc(), monitor.KeyframeSendPLI) + monitor.RtcpCountBySSRC(r.GetSsrc(), monitor.KeyframeSendPLI) r.onRtpStreamSendRtcpPacketHandler(packet) } else if r.params.UseFir { packet := &rtcp.FullIntraRequest{ SenderSSRC: r.GetSsrc(), MediaSSRC: r.GetSsrc(), } - monitor.KeyframeCount(r.GetSsrc(), monitor.KeyframeSendFIR) + monitor.RtcpCountBySSRC(r.GetSsrc(), monitor.KeyframeSendFIR) r.onRtpStreamSendRtcpPacketHandler(packet) } } diff --git a/rtc/transport.go b/rtc/transport.go index b92c63e..0fbc039 100644 --- a/rtc/transport.go +++ b/rtc/transport.go @@ -604,6 +604,7 @@ func (t *Transport) HandleRtcpPacket(header *rtcp.Header, packet rtcp.Packet) { switch packet.(type) { case *rtcp.SenderReport: pkg := packet.(*rtcp.SenderReport) + monitor.RtcpCountBySSRC(pkg.SSRC, monitor.RtcpSenderReport) for _, sr := range pkg.Reports { t.logger.Debug().Msgf("handle SR:%s,report:%+v", pkg.String(), sr) producer := t.rtpListener.GetProducerBySSRC(sr.SSRC) @@ -615,6 +616,7 @@ func (t *Transport) HandleRtcpPacket(header *rtcp.Header, packet rtcp.Packet) { } case *rtcp.ReceiverReport: pkg := packet.(*rtcp.ReceiverReport) + monitor.RtcpCountBySSRC(pkg.SSRC, monitor.RtcpReceiverReport) for _, rr := range pkg.Reports { t.logger.Debug().Msgf("handle RR:%s,report:%+v", pkg.String(), rr) // Special case for the RTP probator. @@ -639,25 +641,29 @@ func (t *Transport) HandleRtcpPacket(header *rtcp.Header, packet rtcp.Packet) { // todo } case *rtcp.SourceDescription: + monitor.RtcpRecvCount(monitor.TraceRtcpSourceDescription) pkg := packet.(*rtcp.SourceDescription) t.logger.Debug().Msgf("%s", pkg.String()) case *rtcp.Goodbye: + monitor.RtcpRecvCount(monitor.TraceRtcpGoodbye) pkg := packet.(*rtcp.Goodbye) t.logger.Debug().Msgf("ignoring received RTCP BYE %s", pkg.String()) case *rtcp.FullIntraRequest: pkg := packet.(*rtcp.FullIntraRequest) t.ReceiveKeyFrameRequest(header.Count, pkg.MediaSSRC) - monitor.KeyframeCount(pkg.MediaSSRC, monitor.KeyframeRecvFIR) + monitor.RtcpCountBySSRC(pkg.MediaSSRC, monitor.KeyframeRecvFIR) case *rtcp.PictureLossIndication: pkg := packet.(*rtcp.PictureLossIndication) t.ReceiveKeyFrameRequest(header.Count, pkg.MediaSSRC) - monitor.KeyframeCount(pkg.MediaSSRC, monitor.KeyframeRecvPLI) + monitor.RtcpCountBySSRC(pkg.MediaSSRC, monitor.KeyframeRecvPLI) case *rtcp.ReceiverEstimatedMaximumBitrate: pkg := packet.(*rtcp.ReceiverEstimatedMaximumBitrate) t.logger.Debug().Msgf("%s", pkg.String()) + monitor.RtcpCountBySSRC(pkg.SenderSSRC, monitor.RtcpRecvRemb) case *rtcp.TransportLayerNack: pkg := packet.(*rtcp.TransportLayerNack) t.logger.Debug().Msgf("TransportLayerNack:%+v", pkg) + monitor.RtcpCountBySSRC(pkg.MediaSSRC, monitor.RtcpRecvNack) consumer, ok := t.mapSsrcConsumer.Load(pkg.MediaSSRC) if !ok { t.logger.Warn().Msgf("no Consumer found for received NACK Feedback packet [sender ssrc:%d, media ssrc:%d]", pkg.SenderSSRC, pkg.MediaSSRC) @@ -668,6 +674,7 @@ func (t *Transport) HandleRtcpPacket(header *rtcp.Header, packet rtcp.Packet) { case *rtcp.TransportLayerCC: pkg := packet.(*rtcp.TransportLayerCC) t.logger.Info().Msgf("TransportLayerCC:%+v", pkg) + monitor.RtcpCountBySSRC(pkg.MediaSSRC, monitor.RtcpReceiverTransportLayerCC) default: monitor.RtcpRecvCount(monitor.TraceUnknownRtcpType) t.logger.Warn().Msgf("unhandled RTCP type received %+v", header) diff --git a/rtc/webrtc_transport.go b/rtc/webrtc_transport.go index 5584586..e739ec9 100644 --- a/rtc/webrtc_transport.go +++ b/rtc/webrtc_transport.go @@ -214,7 +214,6 @@ func (t *WebrtcTransport) OnRtcpDataReceived(rawData []byte) { t.logger.Error().Err(err).Msg("rtcp.Unmarshal failed") return } - monitor.RtcpRecvCount(monitor.TraceReceive) t.ITransport.ReceiveRtcpPacket(decryptHeader, packets) }