api, metrics: add number of bytes received and sent from/to all entities (#1235)

* API: number of bytes received/sent from/to RTSP connections
* API: number of bytes received/sent from/to RTSP sessions
* API: number of bytes received/sent from/to RTMP connections
* API: number of bytes sent to HLS connections
* API: number of bytes received from paths
* metrics of all the above
This commit is contained in:
Alessandro Ros 2022-11-11 11:59:52 +01:00 committed by GitHub
parent 71ef9b47ab
commit 8bee4af86a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 338 additions and 277 deletions

View file

@ -1,6 +1,7 @@
package rawmessage
import (
"bufio"
"errors"
"fmt"
"time"
@ -22,14 +23,14 @@ type readerChunkStream struct {
}
func (rc *readerChunkStream) readChunk(c chunk.Chunk, chunkBodySize uint32) error {
err := c.Read(rc.mr.r, chunkBodySize)
err := c.Read(rc.mr.br, chunkBodySize)
if err != nil {
return err
}
// check if an ack is needed
if rc.mr.ackWindowSize != 0 {
count := rc.mr.r.Count()
count := uint32(rc.mr.r.Count())
diff := count - rc.mr.lastAckCount
if diff > (rc.mr.ackWindowSize) {
@ -210,6 +211,7 @@ type Reader struct {
r *bytecounter.Reader
onAckNeeded func(uint32) error
br *bufio.Reader
chunkSize uint32
ackWindowSize uint32
lastAckCount uint32
@ -223,8 +225,11 @@ type Reader struct {
// NewReader allocates a Reader.
func NewReader(r *bytecounter.Reader, onAckNeeded func(uint32) error) *Reader {
br := bufio.NewReader(r)
return &Reader{
r: r,
br: br,
onAckNeeded: onAckNeeded,
chunkSize: 128,
chunkStreams: make(map[byte]*readerChunkStream),
@ -244,7 +249,7 @@ func (r *Reader) SetWindowAckSize(v uint32) {
// Read reads a Message.
func (r *Reader) Read() (*Message, error) {
for {
byt, err := r.r.ReadByte()
byt, err := r.br.ReadByte()
if err != nil {
return nil, err
}
@ -258,7 +263,7 @@ func (r *Reader) Read() (*Message, error) {
r.chunkStreams[chunkStreamID] = rc
}
r.r.UnreadByte()
r.br.UnreadByte()
msg, err := rc.readMessage(typ)
if err != nil {

View file

@ -198,8 +198,7 @@ func TestReader(t *testing.T) {
for _, ca := range cases {
t.Run(ca.name, func(t *testing.T) {
var buf bytes.Buffer
bcr := bytecounter.NewReader(&buf)
r := NewReader(bcr, func(count uint32) error {
r := NewReader(bytecounter.NewReader(&buf), func(count uint32) error {
return nil
})
@ -224,14 +223,14 @@ func TestReaderAcknowledge(t *testing.T) {
onAckCalled := make(chan struct{})
var buf bytes.Buffer
bcr := bytecounter.NewReader(&buf)
r := NewReader(bcr, func(count uint32) error {
bc := bytecounter.NewReader(&buf)
r := NewReader(bc, func(count uint32) error {
close(onAckCalled)
return nil
})
if ca == "overflow" {
bcr.SetCount(4294967096)
bc.SetCount(4294967096)
r.lastAckCount = 4294967096
}

View file

@ -20,7 +20,7 @@ type writerChunkStream struct {
func (wc *writerChunkStream) writeChunk(c chunk.Chunk) error {
// check if we received an acknowledge
if wc.mw.checkAcknowledge && wc.mw.ackWindowSize != 0 {
diff := wc.mw.w.Count() - wc.mw.ackValue
diff := uint32(wc.mw.w.Count()) - wc.mw.ackValue
if diff > (wc.mw.ackWindowSize * 3 / 2) {
return fmt.Errorf("no acknowledge received within window")