init push
This commit is contained in:
112
internal/queue/metrics.go
Normal file
112
internal/queue/metrics.go
Normal file
@@ -0,0 +1,112 @@
|
||||
package queue
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Metrics struct {
|
||||
received atomic.Int64
|
||||
processed atomic.Int64
|
||||
retried atomic.Int64
|
||||
failed atomic.Int64
|
||||
deadLettered atomic.Int64
|
||||
duplicates atomic.Int64
|
||||
malformed atomic.Int64
|
||||
ackFailures atomic.Int64
|
||||
retryFailures atomic.Int64
|
||||
deadLetterFailures atomic.Int64
|
||||
lastQueueDepth atomic.Int64
|
||||
totalProcessingNanos atomic.Int64
|
||||
lastProcessingNanos atomic.Int64
|
||||
}
|
||||
|
||||
type MetricsSnapshot struct {
|
||||
Received int64 `json:"received"`
|
||||
Processed int64 `json:"processed"`
|
||||
Retried int64 `json:"retried"`
|
||||
Failed int64 `json:"failed"`
|
||||
DeadLettered int64 `json:"dead_lettered"`
|
||||
Duplicates int64 `json:"duplicates"`
|
||||
Malformed int64 `json:"malformed"`
|
||||
AckFailures int64 `json:"ack_failures"`
|
||||
RetryFailures int64 `json:"retry_failures"`
|
||||
DeadLetterFailures int64 `json:"dead_letter_failures"`
|
||||
ApproximateQueueDepth int64 `json:"approximate_queue_depth"`
|
||||
LastProcessingLatency time.Duration `json:"last_processing_latency"`
|
||||
AverageProcessingLatency time.Duration `json:"average_processing_latency"`
|
||||
}
|
||||
|
||||
func NewMetrics() *Metrics {
|
||||
return &Metrics{}
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordReceive(n int) {
|
||||
m.received.Add(int64(n))
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordProcessed(duration time.Duration) {
|
||||
m.processed.Add(1)
|
||||
m.lastProcessingNanos.Store(duration.Nanoseconds())
|
||||
m.totalProcessingNanos.Add(duration.Nanoseconds())
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordRetry() {
|
||||
m.retried.Add(1)
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordFailure() {
|
||||
m.failed.Add(1)
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordDeadLetter() {
|
||||
m.deadLettered.Add(1)
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordDuplicate() {
|
||||
m.duplicates.Add(1)
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordMalformed() {
|
||||
m.malformed.Add(1)
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordAckFailure() {
|
||||
m.ackFailures.Add(1)
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordRetryFailure() {
|
||||
m.retryFailures.Add(1)
|
||||
}
|
||||
|
||||
func (m *Metrics) RecordDeadLetterFailure() {
|
||||
m.deadLetterFailures.Add(1)
|
||||
}
|
||||
|
||||
func (m *Metrics) SetQueueDepth(depth int64) {
|
||||
m.lastQueueDepth.Store(depth)
|
||||
}
|
||||
|
||||
func (m *Metrics) Snapshot() MetricsSnapshot {
|
||||
processed := m.processed.Load()
|
||||
total := m.totalProcessingNanos.Load()
|
||||
avg := time.Duration(0)
|
||||
if processed > 0 {
|
||||
avg = time.Duration(total / processed)
|
||||
}
|
||||
return MetricsSnapshot{
|
||||
Received: m.received.Load(),
|
||||
Processed: processed,
|
||||
Retried: m.retried.Load(),
|
||||
Failed: m.failed.Load(),
|
||||
DeadLettered: m.deadLettered.Load(),
|
||||
Duplicates: m.duplicates.Load(),
|
||||
Malformed: m.malformed.Load(),
|
||||
AckFailures: m.ackFailures.Load(),
|
||||
RetryFailures: m.retryFailures.Load(),
|
||||
DeadLetterFailures: m.deadLetterFailures.Load(),
|
||||
ApproximateQueueDepth: m.lastQueueDepth.Load(),
|
||||
LastProcessingLatency: time.Duration(m.lastProcessingNanos.Load()),
|
||||
AverageProcessingLatency: avg,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user