status-go/services/rpcstats/stats.go

60 lines
1.2 KiB
Go

package rpcstats
import (
"sync"
)
type RPCUsageStats struct {
total uint
counterPerMethod *sync.Map
counterPerMethodPerTag *sync.Map
}
var stats *RPCUsageStats
var mu sync.Mutex
func getInstance() *RPCUsageStats {
mu.Lock()
defer mu.Unlock()
if stats == nil {
stats = &RPCUsageStats{}
stats.counterPerMethod = &sync.Map{}
stats.counterPerMethodPerTag = &sync.Map{}
}
return stats
}
func getStats() (uint, *sync.Map, *sync.Map) {
stats := getInstance()
return stats.total, stats.counterPerMethod, stats.counterPerMethodPerTag
}
func resetStats() {
stats := getInstance()
stats.total = 0
stats.counterPerMethod = &sync.Map{}
stats.counterPerMethodPerTag = &sync.Map{}
}
func CountCall(method string) {
stats := getInstance()
stats.total++
value, _ := stats.counterPerMethod.LoadOrStore(method, uint(0))
stats.counterPerMethod.Store(method, value.(uint)+1)
}
func CountCallWithTag(method string, tag string) {
if tag == "" {
CountCall(method)
return
}
stats := getInstance()
value, _ := stats.counterPerMethodPerTag.LoadOrStore(tag, &sync.Map{})
methodMap := value.(*sync.Map)
value, _ = methodMap.LoadOrStore(method, uint(0))
methodMap.Store(method, value.(uint)+1)
stats.total++
}