1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-07 21:47:02 +09:00
any-sync/metric/syncmetric.go
2024-08-15 08:28:51 +02:00

178 lines
5 KiB
Go

package metric
import (
"time"
"github.com/prometheus/client_golang/prometheus"
)
type SyncMetric interface {
SyncMetricState() SyncMetricState
}
type StreamPoolMetric interface {
OutgoingMsg() (count uint32, size uint64)
}
type SyncMetricState struct {
IncomingMsgCount uint32
IncomingMsgSize uint64
OutgoingMsgCount uint32
OutgoingMsgSize uint64
IncomingReqCount uint32
IncomingReqSize uint64
OutgoingReqCount uint32
OutgoingReqSize uint64
ReceivedRespCount uint32
ReceivedRespSize uint64
SentRespCount uint32
SentRespSize uint64
TotalSize uint64
}
func (st *SyncMetricState) Append(other SyncMetricState) {
st.IncomingMsgSize += other.IncomingMsgSize
st.IncomingReqSize += other.IncomingReqSize
st.OutgoingReqSize += other.OutgoingReqSize
st.ReceivedRespSize += other.ReceivedRespSize
st.SentRespSize += other.SentRespSize
st.IncomingMsgCount += other.IncomingMsgCount
st.IncomingReqCount += other.IncomingReqCount
st.OutgoingReqCount += other.OutgoingReqCount
st.ReceivedRespCount += other.ReceivedRespCount
st.SentRespCount += other.SentRespCount
st.TotalSize += other.TotalSize
}
func (m *metric) getLastCached() SyncMetricState {
m.mx.Lock()
lastCached := m.lastCachedState
if time.Now().Before(m.lastCachedDate.Add(m.lastCachedTimeout)) {
m.mx.Unlock()
return lastCached
}
var allMetrics []SyncMetric
for _, sp := range m.syncMetrics {
allMetrics = append(allMetrics, sp)
}
m.mx.Unlock()
lastCached = SyncMetricState{}
for _, mtr := range allMetrics {
lastCached.Append(mtr.SyncMetricState())
}
if m.streamPoolMetric != nil {
lastCached.OutgoingMsgCount, lastCached.OutgoingMsgSize = m.streamPoolMetric.OutgoingMsg()
}
m.mx.Lock()
defer m.mx.Unlock()
m.lastCachedState = lastCached
m.lastCachedDate = time.Now()
return lastCached
}
func (m *metric) registerSyncMetrics() error {
gaugeFuncs := []prometheus.GaugeFunc{
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "incoming_msg_size",
Help: "Size of incoming messages",
}, func() float64 {
return float64(m.getLastCached().IncomingMsgSize)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "outgoing_msg_size",
Help: "Size of outgoing messages",
}, func() float64 {
return float64(m.getLastCached().OutgoingMsgSize)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "outgoing_req_size",
Help: "Size of outgoing requests",
}, func() float64 {
return float64(m.getLastCached().OutgoingReqSize)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "incoming_req_size",
Help: "Size of incoming requests",
}, func() float64 {
return float64(m.getLastCached().IncomingReqSize)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "received_resp_size",
Help: "Size of received responses",
}, func() float64 {
return float64(m.getLastCached().ReceivedRespSize)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "sent_resp_size",
Help: "Size of sent responses",
}, func() float64 {
return float64(m.getLastCached().SentRespSize)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "incoming_msg_count",
Help: "Count of incoming messages",
}, func() float64 {
return float64(m.getLastCached().IncomingMsgCount)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "outgoing_msg_count",
Help: "Count of outgoing messages",
}, func() float64 {
return float64(m.getLastCached().OutgoingMsgCount)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "outgoing_req_count",
Help: "Count of outgoing requests",
}, func() float64 {
return float64(m.getLastCached().OutgoingReqCount)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "incoming_req_count",
Help: "Count of incoming requests",
}, func() float64 {
return float64(m.getLastCached().IncomingReqCount)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "received_resp_count",
Help: "Count of received responses",
}, func() float64 {
return float64(m.getLastCached().ReceivedRespCount)
}),
prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "sync",
Subsystem: "space",
Name: "sent_resp_count",
Help: "Count of sent responses",
}, func() float64 {
return float64(m.getLastCached().SentRespCount)
}),
}
for _, gf := range gaugeFuncs {
if err := m.registry.Register(gf); err != nil {
return err
}
}
return nil
}