Track wire bytes separately from decompressed stream bytes
The stream stats were showing decompressed data sizes, not actual wire bandwidth. This change adds wire byte tracking by disabling automatic gzip decompression in the HTTP client and wrapping the response body with a counting reader before decompression. Both wire (compressed) and decompressed bytes are now tracked and exposed in the API responses.
This commit is contained in:
@@ -16,12 +16,16 @@ type Tracker struct {
|
||||
connectedSince time.Time
|
||||
isConnected atomic.Bool
|
||||
|
||||
// Stream metrics
|
||||
// Stream metrics (decompressed data)
|
||||
messageCounter metrics.Counter
|
||||
byteCounter metrics.Counter
|
||||
messageRate metrics.Meter
|
||||
byteRate metrics.Meter
|
||||
|
||||
// Wire bytes metrics (actual bytes on the wire, before decompression)
|
||||
wireByteCounter metrics.Counter
|
||||
wireByteRate metrics.Meter
|
||||
|
||||
// Route update metrics
|
||||
ipv4UpdateRate metrics.Meter
|
||||
ipv6UpdateRate metrics.Meter
|
||||
@@ -32,13 +36,15 @@ func New() *Tracker {
|
||||
registry := metrics.NewRegistry()
|
||||
|
||||
return &Tracker{
|
||||
registry: registry,
|
||||
messageCounter: metrics.NewCounter(),
|
||||
byteCounter: metrics.NewCounter(),
|
||||
messageRate: metrics.NewMeter(),
|
||||
byteRate: metrics.NewMeter(),
|
||||
ipv4UpdateRate: metrics.NewMeter(),
|
||||
ipv6UpdateRate: metrics.NewMeter(),
|
||||
registry: registry,
|
||||
messageCounter: metrics.NewCounter(),
|
||||
byteCounter: metrics.NewCounter(),
|
||||
messageRate: metrics.NewMeter(),
|
||||
byteRate: metrics.NewMeter(),
|
||||
wireByteCounter: metrics.NewCounter(),
|
||||
wireByteRate: metrics.NewMeter(),
|
||||
ipv4UpdateRate: metrics.NewMeter(),
|
||||
ipv6UpdateRate: metrics.NewMeter(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +63,7 @@ func (t *Tracker) IsConnected() bool {
|
||||
return t.isConnected.Load()
|
||||
}
|
||||
|
||||
// RecordMessage records a received message and its size
|
||||
// RecordMessage records a received message and its decompressed size
|
||||
func (t *Tracker) RecordMessage(bytes int64) {
|
||||
t.messageCounter.Inc(1)
|
||||
t.byteCounter.Inc(bytes)
|
||||
@@ -65,6 +71,12 @@ func (t *Tracker) RecordMessage(bytes int64) {
|
||||
t.byteRate.Mark(bytes)
|
||||
}
|
||||
|
||||
// RecordWireBytes records actual bytes received on the wire (before decompression)
|
||||
func (t *Tracker) RecordWireBytes(bytes int64) {
|
||||
t.wireByteCounter.Inc(bytes)
|
||||
t.wireByteRate.Mark(bytes)
|
||||
}
|
||||
|
||||
// GetStreamMetrics returns current streaming metrics
|
||||
func (t *Tracker) GetStreamMetrics() StreamMetrics {
|
||||
t.mu.RLock()
|
||||
@@ -76,22 +88,28 @@ func (t *Tracker) GetStreamMetrics() StreamMetrics {
|
||||
// Safely convert counters to uint64
|
||||
msgCount := t.messageCounter.Count()
|
||||
byteCount := t.byteCounter.Count()
|
||||
wireByteCount := t.wireByteCounter.Count()
|
||||
|
||||
var totalMessages, totalBytes uint64
|
||||
var totalMessages, totalBytes, totalWireBytes uint64
|
||||
if msgCount >= 0 {
|
||||
totalMessages = uint64(msgCount)
|
||||
}
|
||||
if byteCount >= 0 {
|
||||
totalBytes = uint64(byteCount)
|
||||
}
|
||||
if wireByteCount >= 0 {
|
||||
totalWireBytes = uint64(wireByteCount)
|
||||
}
|
||||
|
||||
return StreamMetrics{
|
||||
TotalMessages: totalMessages,
|
||||
TotalBytes: totalBytes,
|
||||
ConnectedSince: connectedSince,
|
||||
Connected: t.isConnected.Load(),
|
||||
MessagesPerSec: t.messageRate.Rate1(),
|
||||
BitsPerSec: t.byteRate.Rate1() * bitsPerByte,
|
||||
TotalMessages: totalMessages,
|
||||
TotalBytes: totalBytes,
|
||||
TotalWireBytes: totalWireBytes,
|
||||
ConnectedSince: connectedSince,
|
||||
Connected: t.isConnected.Load(),
|
||||
MessagesPerSec: t.messageRate.Rate1(),
|
||||
BitsPerSec: t.byteRate.Rate1() * bitsPerByte,
|
||||
WireBitsPerSec: t.wireByteRate.Rate1() * bitsPerByte,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,16 +135,20 @@ func (t *Tracker) GetRouteMetrics() RouteMetrics {
|
||||
type StreamMetrics struct {
|
||||
// TotalMessages is the total number of messages received since startup
|
||||
TotalMessages uint64
|
||||
// TotalBytes is the total number of bytes received since startup
|
||||
// TotalBytes is the total number of decompressed bytes received since startup
|
||||
TotalBytes uint64
|
||||
// TotalWireBytes is the total number of bytes received on the wire (before decompression)
|
||||
TotalWireBytes uint64
|
||||
// ConnectedSince is the time when the current connection was established
|
||||
ConnectedSince time.Time
|
||||
// Connected indicates whether the stream is currently connected
|
||||
Connected bool
|
||||
// MessagesPerSec is the rate of messages received per second (1-minute average)
|
||||
MessagesPerSec float64
|
||||
// BitsPerSec is the rate of bits received per second (1-minute average)
|
||||
// BitsPerSec is the rate of decompressed bits received per second (1-minute average)
|
||||
BitsPerSec float64
|
||||
// WireBitsPerSec is the rate of bits received on the wire per second (1-minute average)
|
||||
WireBitsPerSec float64
|
||||
}
|
||||
|
||||
// RouteMetrics contains route update statistics
|
||||
|
||||
Reference in New Issue
Block a user