mirror of
https://github.com/bluenviron/mediamtx.git
synced 2026-01-10 04:11:59 -08:00
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:
parent
71ef9b47ab
commit
8bee4af86a
25 changed files with 338 additions and 277 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue