EdgexAgent/device-ble-go/vendor/github.com/openziti/sdk-golang/xgress/metrics.go
2025-07-10 20:40:32 +08:00

127 lines
3.6 KiB
Go

package xgress
import (
"github.com/openziti/metrics"
"sync/atomic"
"time"
)
type Metrics interface {
MarkAckReceived()
MarkPayloadDropped()
MarkDuplicateAck()
MarkDuplicatePayload()
BufferBlockedByLocalWindow()
BufferUnblockedByLocalWindow()
BufferBlockedByRemoteWindow()
BufferUnblockedByRemoteWindow()
PayloadWritten(duration time.Duration)
BufferUnblocked(duration time.Duration)
SendPayloadBuffered(payloadSize int64)
SendPayloadDelivered(payloadSize int64)
}
type metricsImpl struct {
ackRxMeter metrics.Meter
droppedPayloadsMeter metrics.Meter
payloadWriteTimer metrics.Timer
duplicateAcksMeter metrics.Meter
duplicatePayloadsMeter metrics.Meter
buffersBlockedByLocalWindow int64
buffersBlockedByRemoteWindow int64
outstandingPayloads int64
outstandingPayloadBytes int64
buffersBlockedByLocalWindowMeter metrics.Meter
buffersBlockedByRemoteWindowMeter metrics.Meter
bufferBlockedTime metrics.Timer
}
func (self *metricsImpl) SendPayloadBuffered(payloadSize int64) {
atomic.AddInt64(&self.outstandingPayloads, 1)
atomic.AddInt64(&self.outstandingPayloadBytes, payloadSize)
}
func (self *metricsImpl) SendPayloadDelivered(payloadSize int64) {
atomic.AddInt64(&self.outstandingPayloads, -1)
atomic.AddInt64(&self.outstandingPayloadBytes, -payloadSize)
}
func (self *metricsImpl) MarkAckReceived() {
self.ackRxMeter.Mark(1)
}
func (self *metricsImpl) MarkPayloadDropped() {
self.droppedPayloadsMeter.Mark(1)
}
func (self *metricsImpl) MarkDuplicateAck() {
self.duplicateAcksMeter.Mark(1)
}
func (self *metricsImpl) MarkDuplicatePayload() {
self.duplicatePayloadsMeter.Mark(1)
}
func (self *metricsImpl) BufferBlockedByLocalWindow() {
atomic.AddInt64(&self.buffersBlockedByLocalWindow, 1)
self.buffersBlockedByLocalWindowMeter.Mark(1)
}
func (self *metricsImpl) BufferUnblockedByLocalWindow() {
atomic.AddInt64(&self.buffersBlockedByLocalWindow, -1)
}
func (self *metricsImpl) BufferBlockedByRemoteWindow() {
atomic.AddInt64(&self.buffersBlockedByRemoteWindow, 1)
self.buffersBlockedByRemoteWindowMeter.Mark(1)
}
func (self *metricsImpl) BufferUnblockedByRemoteWindow() {
atomic.AddInt64(&self.buffersBlockedByRemoteWindow, -1)
}
func (self *metricsImpl) PayloadWritten(duration time.Duration) {
self.payloadWriteTimer.Update(duration)
}
func (self *metricsImpl) BufferUnblocked(duration time.Duration) {
self.bufferBlockedTime.Update(duration)
}
func NewMetrics(registry metrics.Registry) Metrics {
impl := &metricsImpl{
droppedPayloadsMeter: registry.Meter("xgress.dropped_payloads"),
ackRxMeter: registry.Meter("xgress.rx.acks"),
payloadWriteTimer: registry.Timer("xgress.tx_write_time"),
duplicateAcksMeter: registry.Meter("xgress.ack_duplicates"),
duplicatePayloadsMeter: registry.Meter("xgress.payload_duplicates"),
buffersBlockedByLocalWindowMeter: registry.Meter("xgress.blocked_by_local_window_rate"),
buffersBlockedByRemoteWindowMeter: registry.Meter("xgress.blocked_by_remote_window_rate"),
bufferBlockedTime: registry.Timer("xgress.blocked_time"),
}
registry.FuncGauge("xgress.blocked_by_local_window", func() int64 {
return atomic.LoadInt64(&impl.buffersBlockedByLocalWindow)
})
registry.FuncGauge("xgress.blocked_by_remote_window", func() int64 {
return atomic.LoadInt64(&impl.buffersBlockedByRemoteWindow)
})
registry.FuncGauge("xgress.tx_unacked_payloads", func() int64 {
return atomic.LoadInt64(&impl.outstandingPayloads)
})
registry.FuncGauge("xgress.tx_unacked_payload_bytes", func() int64 {
return atomic.LoadInt64(&impl.outstandingPayloadBytes)
})
return impl
}